C语言程序的运行顺序

 我来答
念德台丁
2019-12-04 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.4万
采纳率:29%
帮助的人:892万
展开全部
1、这个涉及到函数的调用约定
运行结果跟编译器有一定的关系,不同的编译器参数的入栈的顺序不同
一般的编译器是从右到左
如fun(a,b)这个函数调用,是先计算参数b,入栈,再计算参数a,入栈
2、printf("%d
%d",
a++,++a);
//先计算++a,先自增,a的值变为2,将2入栈
再来计算a++,将a的值2入栈,再使a自增,a的值变为3
printf("
%d\n",a);
//a的值已经变为3了
3、printf(%d
%d",
++a.a++);//先计算a++,将a的值1入栈,再使a自增,a的值变为2,再来计算++a,先自增,a的值为3,将3入栈,输出3
1
printf("
%d\n",a);
//输出3
4、三种调用约定:
__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。
C调用约定(即用__cdecl关键字说明)和__stdcall调用约定有所不同,虽然参数传送方面是一样的,但对于传送参数的内存栈却是由调用者来维护的(也正因为如此,实现可变参数的函数只能使用该调用约定),另外,在函数名修饰约定方面也有所不同。
__fastcall调用约定是“人”如其名,它的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用CX和EDX传送前两个双字或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。
习奕声赖鸾
2019-12-08 · TA获得超过3.7万个赞
知道大有可为答主
回答量:1.4万
采纳率:35%
帮助的人:1001万
展开全部
C语言是一条语句一条语句的运行,从上到下。当然,循环,条件,选择等语句时根据条件进行选择执行。还有,遇到子程序和中断服务程序也会跳到相应的接口上去执行。
1.以上是先执行内嵌语句,就是j<10,等循环10次后再执行一次i<8,如何又继续执行里面的for一次类推,知道i的条件不满足为止。
2.语句到分号为止。
关键是内嵌语句比较不好看,多看看,多练练
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
善国英尤乙
2019-11-30 · TA获得超过3.5万个赞
知道大有可为答主
回答量:1.4万
采纳率:34%
帮助的人:887万
展开全部
/*源程序修改后如下:*/
#include<stdio.h>
int
main()
{

int
a,b,c;

printf("please
input
a,b,c:\n");

scanf("%d
%d
%d",&a,&b,&c);/*数与数输入之间空一格*/

if(a<0&&b<0&&c<0&&a+b<c&&a+c<b&&b+c<a)

printf("error
input
!\n");

{
if(a==b&&b==c&&a==c)
/*用&&联接*/

printf("等边三角形\n");/*\n换行美点*/

else
if(a==b&&a==c&&a==c)

printf("等腰三角形\n");

else
if(a==b&&b==c&&a==c&&a*a==(b*b+c*c)&&b*b==(a*a+c*c)&&c*c==(a*a+b*b))/*要加括号*/

printf("等腰直角三角形\n");

else
if(a*a==(b*b+c*c)&&b*b==(a*a+c*c)&&c*c==(a*a+b*b))/*加括号*/

printf("直角三角形\n");

else
if(a+b>c&&a+c>b&&b+c>a)

printf("一般三角形\n");/*换行*/

return
0;

}
}
/*vc++6.0测试如下:
please
input
a,b,c:
5
5
5
等边三角形
please
input
a,b,c:
5
4
3
一般三角形*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
始霞赏婉
2020-02-08 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.4万
采纳率:34%
帮助的人:977万
展开全部
for多重循环的执行顺序是先执行内部循环,再执行外部循环
  通过对代码进行等价转换,按照上述原理即可知道代码的执行顺序
  对于上面代码:
for(i=0;i<8;i++)
for(j=0;j<10;j++)
scanf("%d,%d",&i,&j);  它等价于下面
for(i=0;i<8;i++){
for(j=0;j<10;j++){
scanf("%d,%d",&i,&j);
}
}  从上面可以看出,每执行完一次j循环,i的值才增加1
  但是注意,该代码有一个陷阱:scanf函数会改变i和j的值
  实际执行顺序会受用户输入的i、j值的不同而不同
  对于下面的代码
for(i=0;i<8;)
min_m(i++)=i
for(j=0;j<8;j++)  它等价于下面的代码:
for(i=0;i<8;){
min_m(i++)=i
}
for(j=0;j<8;j++){}  会先执行min_m函数8次
然后再执行j循环
  注意,该代码有一个问题,就是min_m函数的返回值必须是一个左值。
  这意味着某些变量的值发生了更改,可能会影响到循环。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式