设为首页 加入收藏

TOP

2.4.3 陷阱:在该用==的时候错用了=
2013-10-07 14:56:38 来源: 作者: 【 】 浏览:63
Tags:2.4.3 陷阱 时候

2.4.3  陷阱:在该用==的时候错用了=

视频讲解:Common Bugs with = and ==

遗憾的是,在C++(www.cppentry.com)中,你认为正确的许多C++(www.cppentry.com)语句实际上都会产生歧义。换言之,即使语句在语法上正确,程序能成功编译并运行,而且不报告任何错误消息,但结果仍然和希望的不符。你可能没有意识到一些语句写错了,所以可能导致非常严重的问题。即使发现结果不正确,但绞尽脑汁也想不出症结在哪里。一个常见的错误是在本来应该使用==的地方使用了=。例如像下面这样开头的一个if-else语句:

  1. if (x = 12)  
  2.   Do_Something  
  3. else  
  4.   Do_Something_Else  

假定你想测试x的值是否等于12,所以你的本意是用==而不是=。你也许以为编译器能捕捉这个错误,因为对于以下表达式来说:
  1. 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放在比较表达式左侧(如下所示):

  1. if (12 == x)  
  2.   Do_Something  
  3. else  
  4.   Do_Something_Else  

那么一旦错误地用操作符=来取代上面的操作符==,编译器就会报错。

记住,在操作符==中少写一个=是许多编译器都不能捕捉的常见错误,这个错误很难发现,而且几乎肯定不能产生你希望的结果。在C++(www.cppentry.com)中,许多可执行语句能作为几乎任何种类的表达式使用,其中包括if-else语句的布尔表达式。在本来希望使用布尔表达式的地方使用了赋值语句,赋值语句会被解释为布尔表达式。然而,此时的"测试"结果肯定和你希望的不符。上述if-else语句乍一看是对的,也能正常编译和运行,但结果可能出乎你的预料。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.3.2 其他数值类型 下一篇2.3.7 算术操作符和表达式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ 语言社区-CSDN社 (2025-12-24 17:48:24)
·CSDN问答专区社区-CS (2025-12-24 17:48:22)
·C++中`a = b = c`与` (2025-12-24 17:48:19)
·C语言结构体怎么直接 (2025-12-24 17:19:44)
·为什么指针作为c语言 (2025-12-24 17:19:41)