楼主fun(m+3,m++);与fun(m+3,++m);都是所谓“实现未定义的”
关于实现未定义,请参看我的另一篇回答:
http://zhidao.baidu.com/question/111663274.html
本例中涉及函数调用前的参数求值顺序,ANSI C又有规定:函数参数求值顺序是不确定的,编译器制造者可以随意实现。大多数主流编译器求值顺序都是从右向左。你所使用的编译器对这两例语句输出的结果表明它是从右向左求的。
fun(m+3,m++);中先求得m++,它返回m后编译器有两种选择:一种先求得m+3再m自增,一种先自增再求得m+3。遗憾的是,这也是未定义的,编译器可以随意做出选择。你的编译器选择了前者,得到的结果是8,5。
对后一个调用应该是没什么疑惑了。注意,疑惑都是产生于x++,像++x这种代码是明明白白的。所以尽量不要在复杂表达式中用后置自增自减
#include "stdio.h"
void fun(int a,int b)
{
printf("a=%d,b=%d\n",a,b);
}
void main()
{
int m=5;
fun(m+3,m++);
}
这个程序中有m++,举个例子p=m++,即p=m,m=m+1。这道题的运算顺序是先得m=5,然后将m的值传给m+3,最后执行m=m+1
即a=8,b=5。
#include "stdio.h"
void fun(int a,int b)
{
printf("a=%d,b=%d\n",a,b);
}
main()
{
int m=5;
fun(m+3,++m);
}
这个程序含有++m,再举个例子,p=++m,即m=m+1,p=m.此时,右边的值为p(即m+1),然后将p的值赋给m+3中的m,即a=9,b=6。
++在变量前时是先自加后使用,
在变量后时是先使用后自加
所以m++是先输出m=5后m再自加
++m是m先自加了再输出的所以m=6
不是从左到右
从右到左
有什么区别么?