繁体   English   中英

一元运算符的条件运算符 output 是什么

[英]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;

然后将结果用于+=赋值。

C++20 标准草案

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 无论Delaytrue还是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM