简述C疑难杂症_序列点(二)

引问: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:由于作者技术水平有限,如有错误和不恰当之处,还望读者不吝赐教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值