扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
您好,是这样的;函数在传参时是先传右面的,所以导致结果为0;
站在用户的角度思考问题,与客户深入沟通,找到新乐网站设计与新乐网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、网站制作、企业官网、英文网站、手机端网站、网站推广、主机域名、网站空间、企业邮箱。业务覆盖新乐地区。
如果改为p = f ( ++i, i ); 结果就不同了;请采纳
楼主您好,首先您要理解一下i++的行为,即先用i,然后再++,所以,传递参数时先用i=1的值,用完了然后++,即先用x=y=1=i,然后i=2;我把程序给您改一下,你就会根据结果看的很明白了。
#include
stdio.h
int
f(int
x,int
y)
{
printf("x=%d\n",x);//显示传递过来的i值
printf("y=%d\n",y);
//显示传递过来的i++值
if(xy)
return
1;
else
if(xy)
return
-1;
else
return
0;
}
int
main()
{
int
i=1;
int
k;
k=f(i,i++);
printf("i=%d\n",i);//显示执行完函数后i的值
printf("k=%d\n",k);
return
0;
}
结果:x=1
y=1
i=2
k=0
楼主您的部分理解是对的,而结果有时候跟编译器有关,它的编译顺序是不一样的。
f(++i,i)
和f(i,++i)运行结果都与理解一致,
f(i++,i)
和f(i,i++)运行结果与理解不一致;++是一种缩写,对于y=i++,就是y=i,然后i=i+1;对于y=++i,就是i=i+1,然后y=i.
楼主fun(m+3,m++);与fun(m+3,++m);都是所谓“实现未定义的”
关于实现未定义,请参看我的另一篇回答:
本例中涉及函数调用前的参数求值顺序,ANSI C又有规定:函数参数求值顺序是不确定的,编译器制造者可以随意实现。大多数主流编译器求值顺序都是从右向左。你所使用的编译器对这两例语句输出的结果表明它是从右向左求的。
fun(m+3,m++);中先求得m++,它返回m后编译器有两种选择:一种先求得m+3再m自增,一种先自增再求得m+3。遗憾的是,这也是未定义的,编译器可以随意做出选择。你的编译器选择了前者,得到的结果是8,5。
对后一个调用应该是没什么疑惑了。注意,疑惑都是产生于x++,像++x这种代码是明明白白的。所以尽量不要在复杂表达式中用后置自增自减
函数的参数调用和传递是这样的:
调用子程序或函数
参数顺序(一般是倒序)压入堆栈:如果是数据,直接压栈;如果是表达式,求取其值后将值压栈;变量则将其值取出压栈
进入子程序,子程序分配存放在堆栈中的各数据以临时变量名,这些变量名就是函数头部的参数名,子程序中用这些临时变量名进行运算
如果函数有返回值,返回时需要提供一个返回值,存放在指定位置(一般是个通用寄存器),然后丢弃堆栈中的数据(包括调用时压栈的那些参数),返回调用者调用位置之后继续运行
正常应该是从左到右的,我的机器上运行结果是2,3,3。
可能有些编译器比较特别从右到左也是有可能的,但是我见过的编译器都是从左到右的。
当实参列表包括多个实参时,对实参的求值顺序是不确定的,
有的系统按自左至右顺序求实值,
有的系统则安自右至左的顺序。
许多C版本(如turbo
c
和ms
c)是自右而左的顺序求值
(见谭浩强C语言程序第二版p150)
故上述程序先算i++,
第二个参数的值为i=2之后i的值变为3,
再将i代入第一个参数,
故两个参数的值分别为3,2,所以计算结果为1
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流