C:仅在声明后分配时进行编译

时间:2012-01-28 23:43:12

标签: c

这会产生编译错误。

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.为什么?我不知道为什么会这样。

5 个答案:

答案 0 :(得分:3)

在您的第一个代码中,逗号用作分隔符。 在第二个代码中,它用作运算符。

所以,第一个代码只是给出错误。

precedence table中,逗号运算符的优先级最低。所以,在第二个程序中,

a = 1, 2, 3 

相当于

(a = 1), 2, 3

as,打印a = 1,1。

The Wiki article for this one is just fine.

答案 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)中,逗号是一个运算符。