9

为什么这个声明:

int a = 7, b = 8, c = 0;
c = b>a?a>b?a++:b++:a++?b++:a--;
cout << c;

不等于:

int a = 7, b = 8, c = 0;
c = (b>a?(a>b?a++:b++):a++)?b++:a--;
cout << c;

并且等于:

int a = 7, b = 8, c = 0;
c = b>a?(a>b?a++:b++):(a++?b++:a--);
cout << c;

请给我一些理由。为什么 ?

4

3 回答 3

15

因为? :是从右到左关联的。它在语言中是这样定义的。

于 2010-05-09T11:58:29.457 回答
7

我相信@sth 提供了正确的答案,但是,我认为@Skilldrick 在评论中得到了正确的答案——你为什么要写这样的东西。

除了优先级问题外,在单个语句中增加相同变量时确实需要小心。语句中可能有也可能没有序列点,因此可能无法保证增量的评估顺序。使用不同的编译器,甚至同一编译器上的不同优化设置,您最终可能会得到不同的结果。

于 2010-05-09T11:52:58.660 回答
1

运算符 、 和 执行表达式中的&&||控制?:?:行为类似于 if-else 语句。

c = b>a?a>b?a++:b++:a++?b++:a--;

if ( b>a )
    if ( a>b )
        a ++;
    else
        b ++;
else if ( a ++ )
    b ++;
else
    a --;

b>a? (
    a>b ?
        a ++
    :
        b ++
) : ( a ++ ?
    b ++
:
    a --
)

关联性对于具有类似 的行为是必要的if … else if … else

有时我使用类似于您的表达式来进行词典序列比较:

operator< ()( arr &l, arr &r ) {
    return l[0] < r[0]? true
         : r[0] < l[0]? false
         : l[1] < r[1]? true
         : r[1] < l[1]? false
         : l[2] < r[2];
}
于 2010-05-10T00:39:00.357 回答