0

我已经完成了 LinkedIn C++ 评估并得到了以下问题:


执行此代码片段的结果是什么?

bool x=true, x=false;

if(~x || y) {
    /*part A*/
}
else {
   /*part B*/
}

我不知道答案是什么了,但我认为应该显示“B”,对吧?

我认为通过“~”,x 是倒置的(“按位非”),因此不再是“真”

但是当我运行代码时,我得到“A”:

代码:

#include <iostream>

int main()
{

    bool x = true, y = false;

    std::cout << "x: " << x << std::endl;
    std::cout << "~x: " << ~x << std::endl;

    if (~x || y) {
        std::cout << "A" << std::endl;
    }
    else {
        std::cout << "B" << std::endl;
    }

    return 0;
}

输出:

x: 1
~x: -2
A

谁可以给我解释一下这个?

4

1 回答 1

2

在这个表达式中

~x

将积分提升应用于 bool 类型的操作数 x。提升的结果是int值等于 1 的类型的对象,例如(二进制)

00000000 00000000 00000000 00000001 

运算符 ~ 反转位,你会得到

11111111 11111111 11111111 11111110

来自 C++ 14 标准(5.3.1 一元运算符)

10 ~ 的操作数应具有整数或无范围枚举类型;结果是其操作数的反码。进行整体促销。结果的类型是提升的操作数的类型。

和(4.5 积分促销)

6 bool 类型的prvalue 可以转换为int 类型的prvalue,false 变为0,true 变为1。

7 这些转换称为积分促销。

由于此值不等于 0,因此用作逻辑 OR 运算符的操作数,它被隐式转换为布尔值 true。

来自 C 标准(5.15 逻辑或运算符)

1 || 运算符组从左到右。操作数都根据上下文转换为 bool(第 4 条)。如果其中一个操作数为真,则返回真,否则返回假。与 |、|| 不同 保证从左到右的评估;此外,如果第一个操作数的计算结果为真,则不计算第二个操作数。

和(4.12 布尔转换)

1 算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。将零值、空指针值或空成员指针值转换为 false;任何其他值都将转换为 true。对于直接初始化 (8.5),std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值;结果值为假。

于 2021-09-06T21:29:47.103 回答