C 条件运算符中赋值的优先级
我创建了这个简单的程序来自动生成用于Avisynth scipt的帧序列:C 条件运算符中赋值的优先级,c,operator-precedence,C,Operator Precedence,我创建了这个简单的程序来自动生成用于Avisynth scipt的帧序列: #include <stdio.h> int main(void) { const int step = 3; const int arr[] = {31997, 31998, 32001}; int i, ii = 0; for(i = 32002; i <= 32121; i += step, (sizeof(arr)/sizeof(int) - 1 ) !=
#include <stdio.h>
int main(void) {
const int step = 3;
const int arr[] = {31997, 31998, 32001};
int i, ii = 0;
for(i = 32002; i <= 32121; i += step, (sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0) {
printf("freezeframe(%d,%d,%d)\n", i, i + step, arr[ii]);
}
return 0;
}
#包括
内部主(空){
常数int step=3;
常量int arr[]={31997、31998、32001};
int i,ii=0;
对于(i=32002;i而言,条件运算符的优先级高于C中的赋值运算符
(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0
被评估为
((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0
有关C中运算符优先级的快速提示,您可以看到:
Wikepedia有一小段解释了这一点:
C中条件运算符的语法是
logical-OR-expression ? expression : conditional-expression
请注意,赋值表达式
不被视为条件表达式
,条件表达式不能位于赋值表达式的左侧,因此从技术上讲是语法错误。请参阅语法:
但是,GCC(错误地)将其解析为:
((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0
这是一个语义错误,因为++i
不是左值表达式。如果以这种方式编写代码,建议始终使用括号
(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0
像
10次中有9次你会被卡住
所以养成放括号的习惯,这不会给编译器带来任何开销!!!编写这样的代码,你应该受到惩罚。@DavidHeffernan我知道。这只是为了手头的一个简单任务。“条件运算符的优先级高于C中的赋值运算符。”事实上,没有。C中操作符的优先级取决于它们的上下文,不能简单地用一个优先级表来描述。实际上,这个代码应该编译好。@ H2CO3为什么它编译得好?也许在C++中,但是C不。我的答案。@ PuBeBY,这是个好的点,+1。(是的,这是编译器错误。非常感谢。这是我第一次知道优先级并不是决定评估顺序的唯一因素。
(((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0)