考虑以下代码(我意识到这是一种不好的做法,只是好奇地知道为什么会发生):
#include <iostream>
int main() {
bool show = false;
int output = 3;
if (show = output || show)
std::cout << output << std::endl;
std::cout << "show: " << show << std::endl;
output = 0;
if (show = output || show)
std::cout << output << std::endl;
std::cout << "show: " << show << std::endl;
return 0;
}
此打印
3
show: 1
0
show: 1
因此,显然在第二个if子句中,output
(即0
)的分配实际上并未发生。如果我这样重写代码:
#include <iostream>
int main() {
bool show = false;
int output = 3;
if (show = output || show)
std::cout << output << std::endl;
std::cout << "show: " << show << std::endl;
output = 0;
if (show = output) // no more || show
std::cout << output << std::endl;
std::cout << "show: " << show << std::endl;
return 0;
}
如我所料,它输出:
3
show: 1
show: 0
有人可以解释这里实际发生的情况吗?为什么在第一个示例的第二个if子句中没有将output
分配给show
?我在Windows 10上使用Visual Studio 2017工具链。
答案 0 :(得分:6)
这与运算符优先级有关。您的代码:
if (show = output || show)
与
相同if (show = (output || show))
如果更改顺序,结果将更改:
if ((show = output) || show)
使用上面的if语句,它会打印:
3
show: 1
show: 0
答案 1 :(得分:2)
由于||的运算符优先级,所以不会发生分配运算符高于赋值运算符。您分配输出||显示哪个是0 || true,在第二个if中计算为true。