2.4.3 陷阱:在该用==的时候错用了=
视频讲解:Common Bugs with = and ==
遗憾的是,在C++(www.cppentry.com)中,你认为正确的许多C++(www.cppentry.com)语句实际上都会产生歧义。换言之,即使语句在语法上正确,程序能成功编译并运行,而且不报告任何错误消息,但结果仍然和希望的不符。你可能没有意识到一些语句写错了,所以可能导致非常严重的问题。即使发现结果不正确,但绞尽脑汁也想不出症结在哪里。一个常见的错误是在本来应该使用==的地方使用了=。例如像下面这样开头的一个if-else语句:
- if (x = 12)
- Do_Something
- else
- Do_Something_Else
假定你想测试x的值是否等于12,所以你的本意是用==而不是=。你也许以为编译器能捕捉这个错误,因为对于以下表达式来说:- x = 12
它不是逻辑表达式,不能表示一个条件是否满足。相反,它是赋值语句,所以编译器理应报错。但遗憾的是,现实并非如此。在C++(www.cppentry.com)中,表达式x = 12和x + 12与2 + 3一样,是一个能返回值的表达式(或者说是具有一个值的表达式)。一个赋值表达式的值就是传给等号左侧变量的值。例如,x = 12的值就是12。从前面对布尔值兼容性的讨论可知,int值可转换成true或false。由于12是一个非0的值,所以会转换成true。如果将x = 12用作if语句中的布尔表达式,这个布尔表达式将始终为true,所以,程序始终会执行第一个分支(Do_Something)。
这个错误很难发现,因为它看起来是正确的!相反,假如将12放在比较表达式左侧(如下所示):
- if (12 == x)
- Do_Something
- else
- Do_Something_Else
那么一旦错误地用操作符=来取代上面的操作符==,编译器就会报错。
记住,在操作符==中少写一个=是许多编译器都不能捕捉的常见错误,这个错误很难发现,而且几乎肯定不能产生你希望的结果。在C++(www.cppentry.com)中,许多可执行语句能作为几乎任何种类的表达式使用,其中包括if-else语句的布尔表达式。在本来希望使用布尔表达式的地方使用了赋值语句,赋值语句会被解释为布尔表达式。然而,此时的"测试"结果肯定和你希望的不符。上述if-else语句乍一看是对的,也能正常编译和运行,但结果可能出乎你的预料。