【问题标题】:Conditional operator "?:" in C++C ++中的条件运算符“?:”
【发布时间】:2011-02-07 14:20:03
【问题描述】:

为什么会这样说:

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;

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

【问题讨论】:

  • 如果是作业,请标记。
  • 括号里都是。注意它们,你应该能够弄清楚。
  • 你的意思是等价,不等价。
  • 我希望你不是真的在写这样的代码。
  • 哦不...这不是家庭作业!

标签: c++ ternary-operator


【解决方案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-- );

【讨论】:

  • 这真是循环推理。您以这种方式缩进了第一个 sn-p,因为 ?: 是从右到左关联的。由于您的缩进,它不会成为从右到左的关联。 IOW,缩进不是“为什么”它具有特定含义。
【解决方案3】:

另外,请注意,这些(可怕的)表达式是确定性的,只有,因为使用了 ?: 运算符。该运算符是 C 语言中为数不多的实际指定 求值顺序 的运算符之一。如果你写了一些其他可憎的东西,比如i++ + ++i;,那么编译器可能会先评估左操作数或右操作数,它选择的不是 C 语言定义的。

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

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 2023-04-03
    • 2011-03-21
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2014-08-09
    • 2011-02-21
    相关资源
    最近更新 更多