for 语句中的比较运算符
Comparison operator in for statement
我有一个名为 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 点。
有什么问题吗?
你被 operator precedence 击中了。
关系运算符的优先级高于三元运算符(条件运算符),因此您的循环条件被视为
for(i = 0; (i < ((end_jump % 3) == 0)) ? 4 : 10; i++)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
其中三元的结果是 4
或 10
,它们都是 "truthy",导致无限循环。
你需要一对额外的括号。
for(i = 0; i < (((end_jump % 3) == 0) ? 4 : 10); i++){
/* do something with */
}
应该完成这项工作。
请参阅 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++){
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
我有一个名为 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 点。
有什么问题吗?
你被 operator precedence 击中了。
关系运算符的优先级高于三元运算符(条件运算符),因此您的循环条件被视为
for(i = 0; (i < ((end_jump % 3) == 0)) ? 4 : 10; i++)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
其中三元的结果是 4
或 10
,它们都是 "truthy",导致无限循环。
你需要一对额外的括号。
for(i = 0; i < (((end_jump % 3) == 0) ? 4 : 10); i++){
/* do something with */
}
应该完成这项工作。
请参阅 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++){
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~