C 三元操作员混淆

C++ ternary operator confusion

本文关键字:操作员 三元      更新时间:2023-10-16

我有以下程序,除了我以外的所有人都应该简单!

#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没有括号,为什么a给出a值-99。

这是因为=的优先级与?:(C 操作员优先级)相同。在这种情况下,由于它们具有左右左右的关联性,因此对它们进行了从右到左的评估。因此,首先将--b ? b : (b = -99)表达式评估到-99中,然后将其分配给a

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

在这里,因为=?具有相同的优先级(根据提供的链接为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)

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