if 子句中的赋值不起作用

Assignment in if clause has no effect

本文关键字:赋值 不起作用 子句 if      更新时间:2023-10-16

考虑以下代码(我意识到这是不好的做法,只是好奇为什么会发生这种情况(:

#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 Toolchain。

这与运算符优先级有关。您的代码:

if (show = output || show)

if (show = (output || show))

如果更改顺序,结果将更改:

if ((show = output) || show)

使用类似于上面的 if 语句,它打印:

3
show: 1
show: 0

赋值不会发生,因为 || 运算符的运算符优先级高于赋值运算符。您分配输出 ||显示哪个是 0 || 真,在第二个 if 中计算为 true。