我创建了这个简单的程序来自动生成要在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 ) != ii ? ++ii : ii = 0) {
printf("freezeframe(%d,%d,%d)\n", i, i + step, arr[ii]);
}
return 0;
}
使用MinGW和GCC 4.6.2,我收到此错误:左值作为赋值的左操作数。
通过在 ii = 0 周围使用括号可以简单地解决问题。但是,我不明白为什么这是一个错误。不应该首先评估赋值运算符吗?
答案 0 :(得分:4)
条件运算符的优先级高于C中的赋值运算符。
(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0
评估为
((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0
为了快速提醒C中的运算符优先级,您可以看到:
http://www.kernel.org/doc/man-pages/online/pages/man7/operator.7.html
答案 1 :(得分:3)
Wikepedia有一个简短的部分解释了这一点:http://en.wikipedia.org/wiki/Operators_in_C_and_C++#Notes
C中条件运算符的语法是
logical-OR-expression ? expression : conditional-expression
请注意,assignment-expression
不是被视为conditional-expression
,并且条件表达式不能是赋值表达式的左侧,因此从技术上讲它是语法错误。请参阅语法:http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
但是,GCC(错误地)将其解析为:
((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0
这是一个语义错误,因为++i
不是左值表达式。
答案 2 :(得分:0)
如果您以这种方式编写代码,建议使用括号
(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0
像
(((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0)
你会卡住10次中的9次。
所以养成括号的习惯,这不会给编译器带来任何开销!!!