老生常谈的问题,关于 i++,++i

demo001 2004-03-14 09:01:23
再次请教一下诸位

i = 3;
k = (i++) + (i++) + (i++);

i=3;

k = (++i) + (++i) + (++i);

VC和TC编译得到k的结果不一样
一个是9、16
一个是9、18
i的值都是6

但是不管是什么编译器我都想不通为什么,请指点!


...全文
53 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fvv 2004-04-01
  • 打赏
  • 举报
回复
k = (++i) + (++i) + (++i); =18 //是这么加的 6+6+6 就是把i全部算完 才做总合.
k = (++i) + (++i) + (++i); =16 相当于这样{[(++i)+(++i)]+(++i)} 5+5+6=16 先算两个合并.然后找第三个.
薛定谔之死猫 2004-04-01
  • 打赏
  • 举报
回复
发现过,看看汇编代码就知道了,MSC确实做了不大好理解的处理,现实中很少这样用,MS追求合乎人性化
ckp 2004-04-01
  • 打赏
  • 举报
回复
没必要研究得那么细。
ckp 2004-04-01
  • 打赏
  • 举报
回复
和编译器优化代码有关。
demo001 2004-03-17
  • 打赏
  • 举报
回复
up!
demo001 2004-03-16
  • 打赏
  • 举报
回复
up!
demo001 2004-03-15
  • 打赏
  • 举报
回复
谁能帮我看一下汇编的?
msmouse 2004-03-15
  • 打赏
  • 举报
回复
楼上得16的那位朋友.. 我用vc编译得18啊
abrams2004 2004-03-15
  • 打赏
  • 举报
回复
看一下反汇编,什么都明白了
mjm_d 2004-03-15
  • 打赏
  • 举报
回复
强烈建议不要在同一行里使用++ --之类的混合运算
你会为你的白痴行为付出很大(巨大)代价的,让那些出考卷的老师去干吧
demo001 2004-03-15
  • 打赏
  • 举报
回复
up
ckp 2004-03-14
  • 打赏
  • 举报
回复
编译器对代码进行了优化,不同的编译器的优化是不同的,如果要研究的化,要读汇编码.
yjjbmk0113 2004-03-14
  • 打赏
  • 举报
回复
???????期待中!!!
demo001 2004-03-14
  • 打赏
  • 举报
回复
楼上的真有意思
编译原理当然听说过一些,但是说到具体编译器的规则当然会有差异

我就是想问问这种差异啊

尤其这个16难解释啊


3个++j 你们在VC下得到15???
我怎么是16呢

#include"stdio.h"
main()
{
int i=3,j=3,k1,k2;
k1=(i++) + (i++) + (i++);
k2=(++j) + (++j) + (++j);

printf("k1=%d\n",k1);
printf("i=%d\n",i);
printf("k2=%d\n",k2);
printf("j=%d\n",j);
}

Output:
k1=9
i=6
k2=16
j=6

不信诸位试试看

PingJie 2004-03-14
  • 打赏
  • 举报
回复
看看编译方面的东西
这是编译时规定的规则 你只要知道了他的规则你就会明白的
mdf2008 2004-03-14
  • 打赏
  • 举报
回复
这样问题我不是很关心
xiakebuxing 2004-03-14
  • 打赏
  • 举报
回复
这个问题是教课书中的典型问题。其实,这是操作符的优先级问题。

现在讨论一下这个题目:
i = 3;                     //i=3
k = (i++) + (i++) + (i++); //i++时,i没有被附值, i=3
//三个3相加,k = 9
i=3; //i=3
k = (++i) + (++i) + (++i);          //第一次++i时,i = i + 1, i=4
                       //第二次++i时,i = i + 1, i=5
                       //第三次++i时,i = i + 1, i=6
                       //所以k=4+5+6=15

不知道别人怎么想的。


ckp 2004-03-14
  • 打赏
  • 举报
回复
补充一句,这种语句在研究编译原理时是非常有用的。
ckp 2004-03-14
  • 打赏
  • 举报
回复
k = (++i) + (++i) + (++i);
虽然是三个++i相加,但编译器是将三个++i看成是同一个变量,在第一个++i进行增量运算后,i的值变为4,然后,在第二个++i处,再进行增量运算后,i=5;同理,第三个++i处,i=6;
本来应该是k = 4+5+6 = 15;
但由于不同的编译器采用不同的代码优化策略,所以,最后得到的k值是不同的。
也可以说这一个语句是对代码优化敏感的。
msmouse 2004-03-14
  • 打赏
  • 举报
回复
先解释一下9和18
k = (i++) + (i++) + (i++); 这句里i是"先使用,后自加" 就是说以i=3先计算表达式k=i+i+i的值为9, 然后i自加3次变成6

k = (++i) + (++i) + (++i); 这句里是"先自加,后使用", 编译器首先扫描整个表达式, 没遇到++i时就使i自加1, 这是i已经变成了6, 接着进行表达式k=i+i+i, 值为三个6的和, 是9


16的结果我没有得到 在tc下 如果先写k = (++i) + (++i) + (++i); 再printf("%d",k);的话结果是18, 与vc相同. 但printf("%d",k = (++i) + (++i) + (++i));或者printf("%d", (++i) + (++i) + (++i));结果都是15, 这个问题我很早就发现了. 15=4+5+6, 我是这样理解的, 在处理printf()参数表时tc采用了一种不同的表达式扫描策略, 即不是从头至尾处理完自加操作再计算整个表达式的值, 而是边扫描边求值. 于是遇到第一个++i的4, 第二个++i的5和第三个++i的6相加, 得到15. 这个问题我一直没有搞清楚, 请高手指点.

最后一句还是, 这种问题仿佛没有价值研究, 更不要自己写这样的代码.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧