哪些是C++中条件(if)语句最常见的陷阱?

use*_*042 -8 c++

前言

这个问题是指使用类似if() ... else或类似条件语句的最常见(初学者)错误的规范集合.答案旨在描述运行时的意外行为,语法缺陷和误解

if(x) {}
else (y) {}
Run Code Online (Sandbox Code Playgroud)

不应该在这里解决.


解决了问题

use*_*042 7

对条件表达式的误解

  • if(x = 1) // ...
    
    Run Code Online (Sandbox Code Playgroud)

    平等比较用表达式表示==.=是一个赋值,结果被评估为强制转换bool.即任何评估!= 0结果的值true.作为预防机制,请考虑以下表达式:

  •    if(1 = x)  // invalid assignment compilation error!
       if(1 == x) // valid equality comparison
    
    Run Code Online (Sandbox Code Playgroud)

    通过始终将常量放在表达式的左侧,可以避免错误地使用赋值运算符.编译器将标记触发无效赋值错误的任何错误.

  • if(answer == 'y' || 'Y')
    
    Run Code Online (Sandbox Code Playgroud)

    变化:if(answer == 'y','Y')
    必须通过单独的比较来测试条件.该||运营商绑定不去做怎么在这里期待.请if(answer == 'y' || answer == 'Y')改用.

  • if (0 < x < 42)  
    
    Run Code Online (Sandbox Code Playgroud)

    在Python有效的语法,与预期的行为,该语法是在C++中有效,但解析为if ((0 < x) < 42)这样false/ true转换到0/ 1,然后对所测试< 42- >总是true.条件必须通过单独的比较进行测试:if (0 < x && x < 42)


use*_*042 5

格式化和范围错误


这同样适用于任何错误放置;在循环语句中的语句,例如

要么