2012-03-01 191 views
0

我有一个C代码,它使用简单的逗号运营商为什么下面的C代码失败而编译

main() 
{ 
int a= 1,2,3; 
printf("%d",a); 
} 

现在,当我编译了一个错误,而很少修改同一程序运行正常

main() 
{ 
int a; 
    a= 1,2,3; 
    printf("%d",a); 
} 

为什么这样?

+1

第二个代码不会**编译。 '.. \ main.c:7:5:error:expected';' 'printf''之前 – m0skit0 2012-03-01 11:31:05

+0

我的错误,更正了它 – 2012-03-01 11:32:28

+0

其中是3printf(“%d”,3); ,我只能看到printf(“%d”,a); – 2012-03-01 11:38:35

回答

6

在第一种情况下,会引发错误,因为如果您假装声明多个变量或分配多个值,编译器无法区分。

int a= 1,2,3; 

您的意思是int a; a = 1, 2, 3,或者int a = 1, int 2, int 3?编译器无法从上下文中得知(即使或不是合法变量名称)。

第二种情况下不存在这种歧义,因此没有错误(但是仍然发出警告)。

PS:它是int main()而不是void main()

+1

和声明'a = 1,2,3;'就像有 a = 1; 2; 3; 并且在执行第一个语句之后,a被赋值1, 表达式'2'和'3'被评估,但没有任何变化... – Mallik 2012-03-01 12:01:38

0

使用变量初始化形式时,逗号不作为相同的运算符。这是一种特殊的简短形式,用于在同一行中声明多个变量,因此需要自己的语法。

因此,在语句int a = 1, 2, 3中,逗号实际上的解释与语句a = 1, 2, 3中的不同。

前者是语法错误,因为它不符合多变量声明形式。第二种是有效的语法,但正如其他人指出的那样毫无意义,因为语句2;3;虽然在语法上正确,但什么也不做。

请参阅this article on Wikipedia