首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于i++的二义性不理解解决办法

2012-09-07 
关于i++的二义性不理解我看到c++primer 上有一个i++二义性的例子if(ia[index++]ia[index])说这样写的话根

关于i++的二义性不理解
我看到c++primer 上有一个i++二义性的例子
if(ia[index++]<ia[index])
说这样写的话根据编译器的不同,会有两种不同的结果
if(ia[0]<ia[0])

if(ia[0]<ia[1])

然后我在习题6.19看到这样的解答
while(iter!=vec.end()&&value!=*iter++){}
这样会不会出现和上一段一样的问题呢?
P.S.我之前已经看过一遍C++PRIMER。但是看得不够细。重看一遍耗时太多,假期又不够长,有没有更好的解决方法?

[解决办法]
不会,因为&&会保证先计算左边的,再计算右边的,而<没有规定求值顺序
[解决办法]
C++语言规定了operator|| operator&& operator,(逗号操作符) operator?:的计算顺序,其他操作符没做要求。
也就是说ia[index++]<ia[index]这条语句先执行左边还是右边是不确定的,而&&操作符则是先计算左边。
[解决办法]
首先回答楼主的问题:不会出现上面的问题
原因:
表达式计算自左向右进行,所以 if(ia[index++]<ia[index]) 中可能由于编译器对于自增运算的处理不同而导致楼主所说的结果。相应地,第二种情况一定不会出现这种二义性解释;并且while(iter!=vec.end()&&value!=*iter++){}中循环条件语句由于使用了 && 运算符,在大多数编译器中会进行 短路翻译,即会首先检查第一个表达式的值来进行真值判断。

建议:我们知道这种可能出现二义性的情况即可,在写代码过程中,请避免使用这种容易造成理解上错误的语句,即使我们自己非常清楚,技巧虽然重要,但是代码的易读性更重要,楼主如果工作了,会有体会,楼主如果要找工作,弄懂自增这种变态的行为也很必要(唉,这处在笔试题中还极为常见)。

对于看 C++ PRIMER,当然这是本好书,有时间看,多看几遍当然好,我也只看了一遍,没时间啊(没好好利用时间吧)~~。如果楼主没时间,倒不一定真要重新看一遍,大致看一下每章的标题,看自己是否脑海中有相应的概念,完全没有的话,就看看吧。还有就是用到的时候,做为工具书翻翻,可能理解更深。

希望楼主可以有更多的收获,Good Luck!




[解决办法]
@1L 
@2L
虽然如2L所说,对于一些操作符的求值顺序,C++语言并没有要示,但通常编译器对表达式求值的翻译都是自左向右进行的。
出现二义性的关键并不是求值顺序,而是编译器对自增运算符的解释,即什么时候进行自加。可以参见帖子
C语言自增自减运算符深入剖析:http://topic.csdn.net/u/20100329/23/2fc2d30e-3c79-4f55-ada6-cd7b3bbed3ba.html

@3L
同看上面给出的帖子 C语言自增自减运算符深入剖析,问题马上解决。

Good Luck!

热点排行