2012-12-22 72 views
0

我创建这个简单的程序来自动生成帧序列中的Avisynth素文字使用:优先分配

#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的海湾合作委员会4.6.2,我得到这个错误:作为赋值左操作数所需的左值。

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

+8

对于编写这样的代码,你应该受苦。 –

+0

@DavidHeffernan我知道。这只是一个简单的任务。 –

回答

3

Wikepedia公顷SA短部分,其说明了这一点:http://en.wikipedia.org/wiki/Operators_in_C_and_C++#Notes

在下条件运算符的语法是

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不是左值表达。

+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

+0

“条件运算符的优先级高于C中的赋值运算符。” - 实际上,不。 C中运算符的优先级取决于它们的上下文,不能通过优先级表正确描述。事实上,这段代码应该编译好。 – 2012-12-22 11:23:10

+1

@ H2CO3为什么它应该编译好?也许在C++中,但不是C.请参阅我的答案。 – Pubby

+0

@Pubby这是一个很好的观点+1。 (是的,这确实是一个编译器错误。) – 2012-12-22 11:30:50

0

它总是建议使用括号,如果你以这种方式

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

编写代码就像

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

9个10倍,你会卡住。

所以养成括号的习惯,这样不会对编译器造成任何负担!