我正在学习C ++,在使用,
and?:
运算符时偶然发现以下行为。条件运算符具有这样的语法E1 ? E2 : E3
,其中E1,E2和E3是表达式[1],[2]。我从以下代码开始:
#include <iostream>
using namespace std;
int main(){
int x = 20, y = 25;
x > y ? cout << "x > y\n" , cout << "x is greater than y" : cout << "x !> y\n", cout << "x is not greater than y";
return 0;
}
和输出:
x !> y
x is not greater than y
这是我所期待的结果。但是,当我将值更改为int x = 25, y = 20
x大于y时,得到以下输出:
x > y
x is greater than y
x is not greater than y
但我期望:
x > y
x is greater than y
这样表达的最后部分E3
被计算即使当表达式的结果E1
是true
。
但是,当我将E2和E3放在圆括号中时,对于两种情况,当x> y和x <y时,程序的输出都是预期的。根据[1],逗号,
由[1]表示,运算符为E1和E2,如中的E1, E2
,它本身就是一个表达式。基于此,我不理解为什么?:
即使表达式E1
为真,也要为表达式E3都计算运算符的最后部分。
我的问题是:
1)我是否正确使用条件运算符?:
?
2)发生此意外结果的机制是什么?
3)为什么使用括号可以解决问题(或至少符合我的期望)?
我正在使用:gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1〜16.04.11)
非常感谢你。
[1] https://en.cppreference.com/w/cpp/language/expressions
[2] https://en.cppreference.com/w/cpp/language/operator_other
为了简单起见,我们考虑一个更易于阅读的语句:
foo ? a(), b() : c(), d();
我们遇到的第一个运算符是条件运算符(第7.6.16节):
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
第二个操作数可以是一个表达式,也可以a(), b()
是一个复合表达式。但是,第三个操作数只能是一个赋值表达式(第7.6.19节):
assignment-expression:
conditional-expression
yield-expression
throw-expression
logical-or-expression assignment-operator initializer-clause
assignment-operator: one of
= *= /= %= += -= >>= <<= &= ^= |=
c(), d()
不是其中之一,而是逗号表达式(第7.6.20 / 1节):
expression:
assignment-expression
expression , assignment-expression
一对用逗号分隔的表达式从左到右求值;左边的表达式是一个废弃值表达式。与左表达式相关联的每个值计算和副作用在与右表达式相关联的每个值计算和副作用之前进行排序。[...]
因此,整个语句中最后一个逗号运算符左侧的所有内容都是一个舍弃值表达式,该表达式将在逗号运算符右侧之前进行计算(并丢弃其结果)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句