在 C++ 中 a+=b == c 做什么?

What a+=b == c does in C++?

这段代码困扰了我一整天,我想我需要一些帮助,这是用 C++ 编写的代码:

    int main()
    {
        int a = 3, b = 4;
        if (a+=2 == b) {
            cout << a << endl;
            cout << "True" << endl;
        }
        return 0;
    }

无论ab的值是什么,if语句总是为真,并且a的值不会改变(即cout for a 将在第一次分配时打印 a 的值。但是,当我将一对括号放在 (a+=2) 时,代码将按预期执行。所以我的问题是为什么if 语句中的表达式总是 true?

运算符 ==precedence 高于 +=。此语句等于 a += (2 == b)。语句returnsnew value of a,当new value不为零时为真

a的值在这里没有改变,因为2 == b是false,转换为整数时为零。

运算符优先级意味着 a+=2 == b 将被分组为 a += (2 == b)。所以 a 随着 b2 之间比较的结果递增。

比较结果是一个布尔值,所以当转换为整数时会得到 01.

由于复合加法 (+=) 的计算结果也是运算结果,因此 if 语句中的条件将检查 a 的值是否为 0 添加 01 后。由于 a 被初始化为 3,无论哪种方式,条件都为真。

https://en.cppreference.com/w/cpp/language/operator_precedence

你的答案在所谓的运算符优先级和布尔值的定义中。

C++ 以特定方式评​​估您的 if 条件语句。首先,它会评估您的“==”运算符。在大多数情况下,2 不等于 'b',== 运算符将为 return false。您现在拥有:

int main()
{
    int a = 3, b = 4;
    if (a += false) {
        cout << a << endl;
        cout << "True" << endl;
    }
    return 0;
}

在您认为布尔值 false 也是值 0 之前,这没有什么意义。您现在有:

int main()
{
    int a = 3, b = 4;
    if (a += 0) {
        cout << a << endl;
        cout << "True" << endl;
    }
    return 0;
}

'a' += 0 永远保持a的值。因此,当输出时,你得到不变的 'a' 和 'b' 值。

如果您再次 运行 将 b 初始化为 2 的代码,如下所示:

int main()
{
    int a = 3, b = 2;
    if (a += 2 == b) { // 2 == b becomes true (which is 1); a += 1 is then executed;
        cout << a << endl;
        cout << "True" << endl;
    }
    return 0;
}

'a' 的输出为 3。这是因为 true 也是 1,然后 1 被添加到 'a'.

if 语句似乎总是 运行 的原因是因为任何非零数字在 if 语句中的计算结果为真。