[已解决问题] 关于++运算符的困惑。
提问时间: 2008-06-25 21:08
悬赏分:10 浏览:270 次
    int i=3,j=3;
    printf("%d,%d,%d,%d\n",i++,i++,++i,++i);
    cout<<j++<<j++<<++j<<++j<<endl;

在Visual Studio 2008 中作为C++ 控制台程序编译 输出结果:
5,5,5,5
5577

问题补充:谁能解释一下为什么是这个结果?谢谢!!

所有回答(4)
把一个语句写成多行,用调试器调一下不就知道了.
3个月前   回答者:deerchao - 大侠五级
应该是函数调用的时间问题 printf是先对必须求值的都求值,然后再调用函数进行打印 这里++i,++i必须求值 所以两次自加运算后为5,而i++不用求值,故调用打印函数时i的值为5 第二个语句我的理解是 整个语句先搜索必须求值的进行求值,于是++i,++i之后i为5,然后调用打印 于是打印i++,i++之后i值为7,故输出为5577
3个月前   回答者:MiniThi@k - 菜鸟二级
单步调试,挨个查看,即时的值......
3个月前   回答者:林间曦阳 - 小虾三级
去掉endl试一下
3个月前   回答者:chengxu - 初学一级
评论
3个月前   smwikipedia :
其实最让我奇怪的是,printf 和 cout 输出的结果不一样。
3个月前   smwikipedia :
MiniThi@k,同样的思路,请问第二句怎么理解?
3个月前   deerchao :
还没调出来?

第一个语句是个函数调用.
函数调用当然要先计算参数值,然后再调用.

第二个语句是个左移运算符的表达式语句,左左移运算符是结合的,所以从左向右,一个个地求值.就像 if(!a && !a.b)这样,从左向右逐渐执行的,不是在运算 &&之前就求出它两端的值的.

3个月前   deerchao :
所以说,++或者--运算符一行里不要出现一个,最好是单独一行,简单明了,多好.
这些崎角旮旯,能不碰还是不碰的好,没什么意思.
1个月前   hoodlum1980 :
6,5,7,7
6577
------------
你是不是搞错了啊,我这里用vs2008,输出的结果如上。
i=3;
printf("%d,%d,%d,%d\n",i++,i++,++i,++i);

上面的代码可以等效为:

i=i+1; //++i 第4个参数 i=4
i=i+1; //++i 第3个参数 i=5

int t1=i; //实际上这里的汇编代码是push i, t1=5
i=i+1; //i=6

int t2=i; //t2=6
i=i+1; //i=7

printf("%d,%d,%d,%d\n", t2,t1, i,i);

我的博客中写过一篇文章,根据反汇编分析i++和++i在作为函数参数时候的编译器行为。

   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题

> 问题排行榜

相关内容

相关链接