for语句中的比较运算符

时间:2018-05-31 08:07:26

标签: c linux ternary-operator operator-precedence

我有一个名为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岁。

问题是什么?

2 个答案:

答案 0 :(得分:3)

请参阅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++){
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~

答案 1 :(得分:2)

你被operator precedence击中了。

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

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

三元的结果是410,它们都是&#34; truthy&#34;,导致无限循环。

你需要一对额外的括号。

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

应该做的。