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

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 ) !=

我创建了这个简单的程序来自动生成用于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;
}
#包括
内部主(空){
常数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)