这会产生编译错误。
int main(void)
{
int a = 1, 2, 3;
printf("%d", a);
return 0;
}
但是,
int main(void)
{
int a;
a = 1, 2, 3;
printf("%d", a);
return 0;
}
打印1.为什么?我不知道为什么会这样。
答案 0 :(得分:3)
在您的第一个代码中,逗号用作分隔符。 在第二个代码中,它用作运算符。
所以,第一个代码只是给出错误。
在precedence table中,逗号运算符的优先级最低。所以,在第二个程序中,
a = 1, 2, 3
相当于
(a = 1), 2, 3
as,打印a = 1,1。
答案 1 :(得分:3)
啊逗号操作员:)。
在C中,逗号是+, - *和/的运算符。这意味着它遵循优先级规则,并且它具有非常低的优先级(实际上是最低的)。鉴于它的优先级低于赋值运算符,它将在同一表达式中的任何赋值之后进行求值。当您输入:
a = 1, 2, 3;
它评估赋值,a = 1,然后是逗号。这相当于写作:
(a = 1), 2, 3;
如果您在代码中放置括号,分配给a的值会有所不同:
a = (1, 2, 3); // a now equals 3.
这是因为逗号运算符会丢弃左手参数,并产生右手参数。所以在这种情况下,1,2评估为2,2,3评估为3。
第一个示例无法编译,因为C支持以下语法:
int a = 1, b = 2, c = 3;
其中声明了3个变量a,b和c,分别赋值1,2和3。 =和,运算符的组合令人困惑,因此您编写的内容会导致编译器错误。如果您按如下方式重写作业:
int a = (1, 2, 3);
它阐明了操作的顺序,并将值3分配给a。
Here's一个表格,显示C中的运算符优先级。
答案 2 :(得分:1)
在第一行:
int a = 1, 2, 3;
您正在尝试声明类型为int
的变量2和3,我不允许这样做。
int a = 1, b, c; // OK
int a = 1, b = 2, c = 3; // OK
int a = (1, 2, 3); // OK - a == 3
在第二行:
a = 1, 2, 3;
您正在使用逗号运算符; a
被分配1(不是我第一次写的3;逗号具有所有运算符优先级中最低的 - 并且2和3被丢弃)。
答案 3 :(得分:1)
作为声明的一部分,逗号表示后面是另一个声明(相同类型)。
在你的第二个例子中,它是逗号运算符,它的优先级非常低。它相当于
(a = 1), 2, 3;
答案 4 :(得分:0)
因为标准是这样说的:
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
(6.7) declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
(6.7) init-declarator-list:
init-declarator
init-declarator-list , init-declarator
(6.7) init-declarator:
declarator
declarator = initializer
(6.7.8) initializer:
assignment-expression
(6.5.16) assignment-expression:
conditional-expression
unary-expression assignment-operator assignment-expression
(6.5.17) expression:
assignment-expression
expression , assignment-expression
在初始值设定项(6.7)中,逗号是分隔符。在表达式(6.5.17)中,逗号是一个运算符。