关于 C++ Primer 练习题 5.29 的疑问

关于 C++ Primer 习题 5.29 的疑问
对于 (d) 表达式,习题的参考答案说是错的,LZ 却感觉应该是对的,因为 && 会产生序列点,求解




原题及解答

    假设ptr 指向类类型对象,该类拥有一个名为ival 的int 型数据成员,vec 是保存int 型元素的vector 对象,而ival、jval 和kval 都是int 型变量。请解释下列表达式的行为,并指出哪些(如果有的话)可能是不正确的,为什么?如何改正?

    (a) ptr->ival != 0 (b) ival != jval < kval

    (c) ptr != 0 && *ptr++ (d) ival++ && ival

    (e) vec[ival++] <= vec[ival]

    【解答】

    表达式的行为如下:

    (a) 判断ptr 所指向的对象的ival 成员是否不等于0。

    (b) 判断ival 是否不等于“jval 是否小于kval”的判断结果,即判断ival 是否不等于true(1)或false(0)。

    (c) 判断ptr 是否不等于0。如果ptr 不等于0,则求解&&操作的右操作数,即,ptr 加1,且判断ptr 原来所指向的对象是否为0。

    (d) 判断ival 及ival+1 是否为true(非0 值)(注意,如果ival 为false,则无需继续判断ival+1)。

    (e) 判断vec[ival]是否小于或等于vec[ival+1]。

    其中,(d)和(e)可能不正确,因为二元操作符的两个操作数涉及同一对象,并改变该对象的值。可改正如下:

    (d) ival && ival + 1

    (e) vec[ival] <= vec[ival + 1]


------解决方案--------------------
建议楼主不用纠结这些细节了,说实话,这么写不科学啊,这些都是依赖编译器行为了。也就是说不同的编译器下结果可能是不同的。而且这代码人看起来也费劲啊。

 ival++ && ival
 
在VS 2008上,&&操作符会先计算左边表达式的值,如果为false则右边的不会计算。别的编译器不清楚。至于ival++ ,我也不知道值是多少。