C 三元操作员混淆
C++ ternary operator confusion
我有以下程序,除了我以外的所有人都应该简单!
#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))
相关文章:
- <<操作员在下面的行中工作
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- 三元运算符和 if constexpr
- 比根<操作员
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 三元运算符在返回语句中给出意外的结果
- Boost Spirit x3 条件(三元)运算符解析器
- 为什么用三元初始化类会导致双重释放?
- 如何有效地找到数组中三元组和的最小差异?
- C 三元操作员具有范围分辨率和条件
- C 三元操作员的转换理解
- 为什么三元操作员在我的代码中不起作用
- C 三元操作员混淆
- 带三元回路和短路的操作员