[英]what is the output of conditional operator with unary operator
我有以下代码,我不清楚其中的行为。 有人可以帮助条件运算符如何评估以下代码和 output ans 作为 1
#包括
int main() {
bool delayMessages=0;
bool Delay = false;
delayMessages += Delay ? 1 : -1;
std::cout << "Hello world!"<<delayMessages;
return 0;
}
Ans: Hello world!1
Soemone 能否请帮助如何评估代码“delayMessages += Delay?1:-1;”
来自C++ 17标准(7.6积分优惠)
6 bool 类型的纯右值可以转换为 int 类型的纯右值,其中 false 变为零,true 变为 1。
和(7.14 Boolean 次转换)
1 算术纯右值、无作用域枚举、指针或指向成员类型的指针可以转换为 bool 类型的纯右值。 零值、null 指针值或 null 成员指针值转换为 false; 任何其他值都将转换为 true。 对于直接初始化 (11.6),std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值; 结果值为假。
最后(8.7 加法运算符)
1 加法运算符 + 和 - 从左到右分组。 对算术或枚举类型的操作数执行通常的算术转换。
这个表情语句
delayMessages += Delay ? 1 : -1;
可以像这样重写
delayMessages = delayMessages + ( Delay ? 1 : -1 );
带有条件运算符的表达式的结果是-1
,因为第一个子表达式 ( Delay
) 的计算结果为false
。
所以事实上你有
delayMessages = delayMessages + -1;
变量delayMessage
声明如下
bool delayMessages=0;
根据 7.14 节中的引述,其值为false
。
在带有二元加运算符 + 的表达式中,它根据引号(7.6 积分提升)和 8.7 加法运算符转换为 integer 0 并且您有
delayMessages = 0 + -1;
或者
delayMessages = -1;
再次根据引用 7.14 Boolean 转换,变量delayMessage
的结果值为true
。
运算符 << 在此语句中输出 boolean 值为 true 为 1
std::cout << "Hello world!"<<delayMessages;
右侧的表达式的计算方式类似于 if 语句。
if (Delay == true)
return 1;
else
return -1;
然后将结果用于+=
赋值。
7.6.19 (6)(赋值和复合赋值运算符)
E1 op= E2
形式的表达式的行为等同于E1 = E1 op E2
除了 E1 只计算一次。 [...]
由于Delay == false
,三元运算符的返回值为-1
。 事实上,您在bool
ean 而不是int
上操作可以使它看起来像您获得了+1
。
请注意,您会收到编译器警告C4804 :
警告 C4804:“+=”:在操作中不安全地使用类型“bool”
它是未定义的行为吗? 不。
7.6.19 (6)(赋值和复合赋值运算符)
[...] 对于 += 和 -=,E1 应具有算术类型或指向可能的 cv 限定的完全定义的 object 类型的指针。 在所有其他情况下,E1 应具有算术类型。
和
7.3.8(2)(积分转换)
如果目标类型是 bool,请参见 7.3.14。
这说
7.3.14(1)(布尔转换)
算术纯右值、无作用域枚举、指针或指向成员的指针类型可以转换为 bool 类型的纯右值。 零值、null 指针值或 null 成员指针值转换为 false; 任何其他值都将转换为 true。
所以 -1 被转换为true
并且true
打印为 1。
Delay ? 1 : -1
计算结果为-1
,因为Delay
为假。 将-1
转换为bool
会产生true
,因为只有0
会转换为false
。 然后印刷true
的印刷品1
。 无论Delay
是true
还是false
,结果都是true
并且在两种情况下都打印1
。
对布尔值使用true
/ false
,对整数使用 integer 类型。 也许这就是您真正想要做的:
int delayMessages=0;
bool Delay = false;
delayMessages += Delay ? 1 : -1;
std::cout << "Hello world!"<<delayMessages;
delayMessages += Delay ? 1 : -1;
这基本上意味着如果Delay
为真,则delayMessages += 1
(即 1),否则delayMessages += -1
(也是 1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.