C ++ ::不要混淆分配(=)与平等测试(==)

如果C ++更像是BASIC,则下面的代码看起来很简单,并且可以正常编译和运行:

if (a = b)
     cout << "a is equal to b.";

因为这看起来很无辜,所以它会产生逻辑错误,除非您正在寻找它,否则在大型程序中需要花费数小时才能进行跟踪。(因此,当程序需要调试时,这是我要寻找的第一件事。)在C和C ++中,以下内容不是对相等性的测试:

a = b

当然,这是将b的值分配给a,然后求值到所分配的值。

问题是a = b通常不会评估为合理的正确/错误条件-我将在稍后提到一个主要例外。但是在C和C ++中,任何数值都可以用作“ if”或“ while”的条件。

假设a和b设置为0。前面显示的if语句的作用是将b的值放入a;中。则表达式a = b的值为0。值0等于false。因此,a和b相等,但是打印出的东西恰恰是错误的:

if (a = b)     // 此确保a和b相等...
     cout << "a and b are equal.";
else
     cout << "a and b are not equal.";  // 但此图已打印!

当然,解决方案是在您需要时使用相等性测试。请注意使用双等号(==)。在条件内这是正确的。

// 正确的版本:
if (a == b)
     cout << "a and b are equal.";