C语言程序的运行顺序
展开全部
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传送前两个双字或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。
运行结果跟编译器有一定的关系,不同的编译器参数的入栈的顺序不同
一般的编译器是从右到左
如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传送前两个双字或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。
展开全部
C语言是一条语句一条语句的运行,从上到下。当然,循环,条件,选择等语句时根据条件进行选择执行。还有,遇到子程序和中断服务程序也会跳到相应的接口上去执行。
1.以上是先执行内嵌语句,就是j<10,等循环10次后再执行一次i<8,如何又继续执行里面的for一次类推,知道i的条件不满足为止。
2.语句到分号为止。
关键是内嵌语句比较不好看,多看看,多练练
1.以上是先执行内嵌语句,就是j<10,等循环10次后再执行一次i<8,如何又继续执行里面的for一次类推,知道i的条件不满足为止。
2.语句到分号为止。
关键是内嵌语句比较不好看,多看看,多练练
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*源程序修改后如下:*/
#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
一般三角形*/
#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
一般三角形*/
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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函数的返回值必须是一个左值。
这意味着某些变量的值发生了更改,可能会影响到循环。
通过对代码进行等价转换,按照上述原理即可知道代码的执行顺序
对于上面代码:
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函数的返回值必须是一个左值。
这意味着某些变量的值发生了更改,可能会影响到循环。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询