引问:int i=3; int b=i++*i++;为什么最后的结果是b=9?
答案:(1)标准规定,两个序列点之间,程序执行的顺序可以是任意的,如果一个对象被修改多次,最后留下的是哪次的结果就不确定。不同编译器运行的结果可能就不一样。
(2)在相邻的两个序列点之间,一个对象最多只允许被修改一次。
(3)C语句结束标志分号(;)是序列点中的一种。也就是说,C语句中由赋值、自增或者自减等引起的副作用(side effect)在分号之前必须结束。
(4)没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表达式 “完成” (按照 ANSI C 的术语, 在下一个”序列点”之前) 之前的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。只有到达一个序列点之后,自增运算才能保证真正被执行(即只要保证在上一个序列点之后到这一个序列点之间的任一时刻执行即可)。
程序分析:
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
int i[12]={3,3,3,3,3,3,3,3,3,3,3,3};
int b[12];
b[0]=i[0]++*i[0]++;
b[1]=++i[1]*++i[1];
b[2]=++i[2]*i[2]++;
b[3]=i[3]++*++i[3];
b[4]=i[4]++*i[4]++*i[4]++;
b[5]=i[5]++*i[5]++*++i[5];
b[6]=++i[6]*++i[6]*++i[6];
b[7]=++i[7]*++i[7]*i[7]++;
b[8]=++i[8]*i[8]++*i[8]++;
b[9]=++i[9]*i[9]++*++i[9];
b[10]=i[10]++*++i[10]*++i[10];
b[11]=i[11]++*++i[11]*i[11]++;
for(int j=0;j<12;j++){
cout<<b[j]<<endl;
}
return 0;
}
下图左侧为Codeblocks运行结果,右侧为VS2010运行结果,可以将以上概念结合以下运行结果对比性记忆理解。
ps:由于作者技术水平有限,如有错误和不恰当之处,还望读者不吝赐教!
原文地址:http://blog.csdn.net/cafuc46wingw/article/details/38616085