0

我创建了这个简单的程序来自动生成要在 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周围使用括号来解决。但是,我不明白为什么这是一个错误。不应该先评估赋值运算符吗?

4

3 回答 3

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

于 2012-12-22T11:19:19.967 回答
3

维基百科有一个简短的部分解释了这一点:http ://en.wikipedia.org/wiki/Operators_in_C_and_C++#Notes

C中条件运算符的语法是

logical-OR-expression ? expression : conditional-expression

请注意, anassignment-expression 被视为 a conditional-expression,并且条件表达式不能位于赋值表达式的左侧,因此从技术上讲它是语法错误。见语法:http ://www.lysator.liu.se/c/ANSI-C-grammar-y.html

但是,GCC (错误地)将其解析为:

((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0

这是一个语义错误,因为++i它不是左值表达式。

于 2012-12-22T11:25:43.507 回答
0

如果您以这种方式编写代码,则始终建议使用括号

(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0

(((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0)

10 次中有 9 次你会卡住。

所以养成使用括号的习惯,这不会对编译器造成任何开销!!!

于 2012-12-22T12:57:29.407 回答