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

时间:2017-12-24 10:41:02

标签: c++

前言

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

if(x) {}
else (y) {}

不应该在这里解决。

解决问题

3 个答案:

答案 0 :(得分:6)

条件表达式的误解

  • if(x = 1) // ...
    
         

    使用==表示平等比较。 =是一项分配,结果将作为强制转换评估为bool。即评估为!= 0的任何值都会导致true。作为预防机制,请考虑以下表达式:

  •    if(1 = x)  // invalid assignment compilation error!
       if(1 == x) // valid equality comparison
    
         

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

  • if(answer == 'y' || 'Y')
    
         

    变体:if(answer == 'y','Y')
      必须通过单独的比较来测试条件。 ||运营商绑定并未执行此处预期的操作。请改用if(answer == 'y' || answer == 'Y')

  • if (0 < x < 42)  
    
         

    Python中的有效语法,具有预期的行为,该语法在C ++中有效,但解析为if ((0 < x) < 42),因此false / true转换为0 / {{1然后针对1 - &gt;进行测试总是< 42。   必须使用单独的比较来测试条件:true

答案 1 :(得分:4)

格式化和作用域错误

  • if(mycondition);
    {
        // Why this code is always executed ???
    }
    
         

    ;声明之后,有一个多余的 if()

  • if(mycondition)
         statement1();
         statement2(); // Why this code is always executed ???
    
         

    代码相当于

    if(mycondition) {
         statement1();
    }
    statement2();
    
         

    statement2();超出了条件块的范围。将{}添加到群组对帐单。

  • if (mycondition)
         if (mycondition2)
             statement1();
     else
         statement2();
    
         

    代码相当于

    if(mycondition) {
     if (mycondition2)
         statement1();
     else
         statement2();
    }
    
         

    else适用于之前的if。添加{}

    if (mycondition) {
        if (mycondition2)
             statement1();
    }
    else
        statement2();
    

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

  •   for(int x = 0;x < 5;++x);
                           // ^
      {
           // statements executed only once
      }
    

  • while(x < 5);
             // ^
    {
        // statements executed only once
    }
    

答案 2 :(得分:-2)

if (north) {

} else if (south) {

} else if (west) {

} else if (east) {

}

潜在的错误的其他条款 - 错误的方向。

有趣放置{}因为他们添加了它们,错放了它们然后删除了错误的。

if (a) {
}
if (b) {
}
if (c) {
}

缺少其他内容,因为即使有更多属实,也只应完成其中一项。