![](/img/trans.png)
[英]In C++, is A+=B preferable to A=A+B in the same way ++A is to A++?
[英]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;
}
无论a
和b
值是什么, if
语句始终为true,并且b
的值不会更改(即, a
的cout
在首次分配时将打印a的值。但是,当我放置a一对括号(a+=2)
,代码将按预期执行,所以我的问题是,为什么if
语句中的表达式始终为true
?
运算符==
优先级高于+=
。 该语句等于a += (2 == b)
。 该语句返回的新价值a
,当新的值不是零,这是真的。
的值a
不改变这里,因为2 == b
是假的,转换为整数时,这是零。
运算符优先级意味着a+=2 == b
将被分组为a += (2 == b)
。 因此a
随b
和2
之间的比较结果而增加。
比较结果是一个布尔值,因此当转换为整数时,它将产生0
或1
。
由于复合加法( +=
)也会求和运算的结果,因此if
语句中的条件将在a
的值加上0
或1
后检查a的值不为0
。 由于a
初始化为3
,因此该条件为真。
https://zh.cppreference.com/w/cpp/language/operator_precedence
您的答案是所谓的运算符优先级和布尔值的定义。
C ++以特定的方式评估您的if语句的条件。 首先,它评估您的'=='运算符。 在大多数情况下2将不等于'b'并且==运算符将返回false。 您现在拥有:
int main()
{
int a = 3, b = 4;
if (a += false) {
cout << a << endl;
cout << "True" << endl;
}
return 0;
}
在您认为布尔假值也为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语句中,任何非零数字都等于true。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.