C ++中的条件运算符“?:”

时间:2011-02-07 14:20:04

标签: c++ ternary-operator

为什么这句话:

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;

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

3 个答案:

答案 0 :(得分:11)

答案 1 :(得分:2)

只需将其放在多行上即可看出差异:

c = b>a        // true
    ? a>b      // false
      ? a++
      : b++    // b is incremted = 9; c = 8 (post increment)
    : a++ 
      ? b++
      : a--;

不等于:

c = ( b>a     // true
    ? ( a>b   // false
      ? a++
      : b++ ) // b is incremted = 9
    : a++ )   // a = 7 (= 8 after post increment), thus true
    ? b++     // ... b is incremented = 10, c = 9 (post increment)
    : a--;

并且等于:

c = b>a         // true
    ? ( a>b     // false
      ? a++
      : b++ )   // b is incremnted = 9, c = 8 (post increment)
    : ( a++     
        ? b++   
        : a-- );

答案 2 :(得分:0)

此外,请注意,这些(可怕的)表达式仅是确定性 ,因为使用了?:运算符。此运算符是C语言中极少数运算符之一,其中实际指定了评估顺序。如果你写了一些像i++ + ++i;这样的其他可憎的东西,那么编译器可能首先评估左操作数或右操作数,它选择的是未在C语言中定义的。

根据经验,永远不要将++运算符用作其他运算符的表达式的一部分。只在它自己的行上使用它(或作为循环迭代器)。因为,与主流信念相反,实际上从来没有理由与其他运营商一起使用它。