2 shadow swm shadow_swm 于 2014.12.16 10:49 提问

vc++6.0内关于s=(i++)*(i++)的问题

int i = 0;

s = (i++)*(i++)
printf(“%d”,s);

这个结果应该是多少?我个人分析应该是2,第一个i++使用的是1 然后i的值应该变成2然后第二个i使用的是2 然后i变成3 结果s的值应该是2 但是在vc++6.0的环境下运行结果为什么是1呢?新手求解。

3个回答

caozhy
caozhy   Ds   Rxr 2014.12.16 10:55
已采纳

这个问题问了无数遍,我想这么告诉你。
就C++语言来说,这个是语言未定义行为,所谓语言未定义行为,就是在语言规范中没有规定遇到这样的代码应该输出什么。不同编译器输出结果可以不同。根据编译器实现的机制以及优化的机制,不同的编译器以它认为合理的方式产生代码。
就VC++6.0来说,你可以通过反汇编的方式搞清楚它究竟被编译成了什么,但是注意,即便相同的编译器,不同的优化选项和代码上下文输出也可能不同。

u011767611
u011767611 x++在cpp里面重载时使用零时变量,在没有优化的情况下,x++要比++x慢。当然如你所说有些依赖于不同编译器。
接近 3 年之前 回复
bdmh
bdmh   Ds   Rxr 2014.12.16 11:07

各个编译器对这玩意都有不同解释,也会有不同结果,所以你知道前++和后++怎么回事就行了

underskywf
underskywf   2014.12.16 11:53

楼主,询问下,本例中,你是否将 i 值看错了:

 int i=0; 

还是

 int i=1;

若是

 int i=1;

以我个人理解,对于VC++6.0,在赋值语句中,自增自减运算符若作为前缀形式 ,其运算优先级高于其它算术运算,即先按照“从右至左 ”的结合性进行自增自减运算,再进行其它运算;若作为后缀形式,其运算优先级低于其它算术运算,即先进行其它算术运算,再按 照“从 右至左 ”的结合性进行自增自减运算。
即对于本例,

#include<stdio.h>

int main()
{
    int i = 1;
    int s = (i++)*(i++);
    printf("s = %d,i= %d \n", s,i);

    system("pause");
    return 0;
} 

对s的赋值语句中,先使用i=1进行算术运算,之后再自增2次,即运算后s=1 ,i=3

Csdn user default icon
上传中...
上传图片
插入图片