【问题标题】:Comparison operator in for statementfor 语句中的比较运算符
【发布时间】:2018-11-10 04:32:38
【问题描述】:

我有一个名为 end_jump 的全局变量,它是 3 或 7。
根据值是什么,我想结束一个 for 循环(优化)。
我当前的代码是:

int i;
for(i = 0; i < ((end_jump % 3) == 0) ? 4 : 10; i++){  
    /* do something with */ array[i];  
}  

我没有收到任何错误消息,for 循环继续,但没有停止。不是 4 点,也不是 10 点。

有什么问题?

【问题讨论】:

标签: c linux ternary-operator operator-precedence


【解决方案1】:

GCC编译器警告:

warning: ?: using integer constants in boolean context, the expression will always evaluate to 'true' [-Wint-in-bool-context]
 for(i = 0; i < ((end_jump % 3) == 0) ? 4 : 10; i++){
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~

【讨论】:

    【解决方案2】:

    你被operator precedence 击中。

    关系运算符的优先级高于三元(条件),因此您的循环条件被视为

     for(i = 0; (i < ((end_jump % 3) == 0)) ? 4 : 10; i++)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    其中三元的结果要么是4 要么是10,它们都是“真实的”,导致无限循环。

    你需要一个额外的括号。

    for(i = 0; i < (((end_jump % 3) == 0) ? 4 : 10); i++){  
        /* do something with */ 
    }
    

    应该做的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2021-11-21
      • 2014-09-08
      • 1970-01-01
      • 2017-01-03
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多