条件运算符中赋值的优先级

时间:2012-12-22 11:15:53

标签: 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 ) != ii ? ++ii : ii = 0) {

        printf("freezeframe(%d,%d,%d)\n", i, i + step, arr[ii]);

    }

    return 0;
}

使用MinGW和GCC 4.6.2,我收到此错误:左值作为赋值的左操作数。

通过在 ii = 0 周围使用括号可以简单地解决问题。但是,我不明白为什么这是一个错误。不应该首先评估赋值运算符吗?

3 个答案:

答案 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次。

所以养成括号的习惯,这不会给编译器带来任何开销!!!