int i = 0;
s = (i++)*(i++)
printf(“%d”,s);
这个结果应该是多少?我个人分析应该是2,第一个i++使用的是1 然后i的值应该变成2然后第二个i使用的是2 然后i变成3 结果s的值应该是2 但是在vc++6.0的环境下运行结果为什么是1呢?新手求解。
这个问题问了无数遍,我想这么告诉你。
就C++语言来说,这个是语言未定义行为,所谓语言未定义行为,就是在语言规范中没有规定遇到这样的代码应该输出什么。不同编译器输出结果可以不同。根据编译器实现的机制以及优化的机制,不同的编译器以它认为合理的方式产生代码。
就VC++6.0来说,你可以通过反汇编的方式搞清楚它究竟被编译成了什么,但是注意,即便相同的编译器,不同的优化选项和代码上下文输出也可能不同。
各个编译器对这玩意都有不同解释,也会有不同结果,所以你知道前++和后++怎么回事就行了
楼主,询问下,本例中,你是否将 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