C ++三元运算符混淆

时间:2014-01-18 18:28:18

标签: c++ operator-keyword ternary

我有以下程序,对我这个人来说应该很简单!

#include <iostream>
using namespace std;
int main()
{

int a, b;
b = 1;

cout << ((a = --b) ? b : (b = -99)) << '\n' << "a is " << a << '\n' << "b is " << b << endl;

b = 1;
cout << (a = --b ? b : (b = -99)) << '\n' << "a is " << a << '\n' << "b is " << b << endl;


}

该计划的输出是:

-99

a是0

b是-99

-99

a是-99

b是-99

在第一段代码中我理解的是a给出了值-b,0,因此它变为false,因此执行b = -99。我无法理解第二段代码,其中a = - b没有括号,为什么给出了-99的值。

3 个答案:

答案 0 :(得分:5)

这是因为=具有与?:C++ operator priorities)相同的优先级。在这种情况下,并且因为它们具有从右到左的关联性,所以它们从右到左进行评估。因此,首先将表达式--b ? b : (b = -99)计算为-99,然后将其分配给a

答案 1 :(得分:1)

三元运算符具有从右到左的关联性,并且具有与赋值相同的优先级,这意味着条件术语第二段被解释为a =( - b?b:(b = -99))

答案 2 :(得分:1)

(a = --b ? b : (b = -99))

此处,因为=?the same priority(根据提供的链接为15)并且从右到左进行评估,所以执行如下:

a = --b ? b : (b = -99)
1. --b ( =0)
2. 0?
3. 0 so not what is immediately after ? but what is after :
4. b=-99 (evaluate second expression)
5. a = -99 (assign the result of expression)