C/C++中的++问题

++符号是C/C++之中非常有趣的,前段时间发现一个很好玩的算式,在TC和VC下面获得不同的结果。

i=0; i=(++i)+(++i)+(++i);
熟悉C语言的能够分析一下,首先是i=0,i的初值为0,第二步是很多个+号,我们大致可以推导下它的运行过程:先运行第一个++i,i=1,然后++i,i=2,继续++i,i=3,最后再进行+计算,即3+3+3=9,按照传统的C语言来推算,答案应该是9。

通过WIN_TC我们可以测试


得到的结果没错,是9


不过在VC我们却得到一个很奇怪的答案


一模一样的程序来着


答案是7。

在VC在运行的顺序是++i,++i,然后运行+的计算,然后在++i,再+的计算,即2+2+3=7。

如果在添加一个++在VC与TC下还是存在区别,一个是4+4+4+4=16,2+2+3+4=11。

刚被帅哥提醒下,去看了一下完整表达式和非完整表达式,在C Primer Plus中间有比较好的解释

副作用(side effect)是对数据对象或文件的修改。例如,语句:states=50;的副作用是将states的值设为50,从C的角度来看,主要目的是对表达式求值,给C一个表达式4+6,C将计算它的值为10.给C一个表达式states=50,C将计算它的值为50.计算这个表达式的副作用就是把变量的states的值改变为50.跟赋值运算符一样,增量运算符和减量运算符也有副作用,它们由于副作用而被使用。

一个顺序点(sequence point)是程序执行中的一点:在该点处,所有的副作用都在进入下一步前被计算。在C中,语句里的分号标志了一个顺序点,它意味着在一个语句中赋值运算符,增量运算符及减量运算符所作的全部改变必须在程序进入下一个语句前发生。

完整表达式是这样一个表达式-它不是一个更大的表达式的子表达式。完整表达式的例子包括一个表达式的语句里的表达式和在一个while循环里作为判断条件的表达式。

顺序点帮助阐明后缀增量动作何时发生。例如,考虑下面代码

while(guests++ <10) printf("%d\n",guests);

有时C的初学者会摄像在本程序中”先使用该值,然后增加它的值"的意思是在使用了printf()语句后再增加guest的值。然而,因为guest++<10是while循环的判断条件,所以它是一个完整表达式,这个表达式的结束就是一个顺序点。因此,C保证副作用(增加guest的值)在程序进入printf()前发生。同时使用后缀形式保证了guest在与10比较后才增加。

现在考虑这个语句

y=(4+x++)+(6+x++);

表达式4+x++不是一个完整表达式,所以C不能保证在计算子表达式4+x++后立即增加x。这里,完整表达式是整个赋值语句,并且分号标记了顺序点,所以C能保证的是在程序进入后续语句前x被增加两次。C没有指明x是在每个子表达式被计算后增加还是在整个表达式被计算后增加,这就是我们要避免使用这类语句的原因。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值