悬赏分:10 浏览:270 次
|
把一个语句写成多行,用调试器调一下不就知道了. 应该是函数调用的时间问题 printf是先对必须求值的都求值,然后再调用函数进行打印 这里++i,++i必须求值 所以两次自加运算后为5,而i++不用求值,故调用打印函数时i的值为5 第二个语句我的理解是 整个语句先搜索必须求值的进行求值,于是++i,++i之后i为5,然后调用打印 于是打印i++,i++之后i值为7,故输出为5577 单步调试,挨个查看,即时的值...... 去掉endl试一下 |
|
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在作为函数参数时候的编译器行为。 |