A = 3,2,1; 在gcc中给出错误

J..*_*..S 5 c gcc variable-assignment comma-operator

我在gcc中尝试了以下代码:

#include<stdio.h>
int main()
{
    int a=3,2,1;//////////////////////ERROR!//////////////////////////
    printf("%d", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它能成功编译为:

  • 由逗号分隔的一系列整数表达式将从左到右进行计算,最右侧表达式的值将成为逗号分隔总表达式的值.

那么,整数变量a的值应该是1吗?还是3?

当我尝试执行此程序时,为什么会出现此错误?

错误:预期标识符或'('在数字常量之前

SLa*_*aks 12

这被解析为一个由三部分组成的变量声明,带有两个无效变量.

您需要将整个初始化程序包装在括号中,以便将其解析为单个表达式:

int a=(3,2,1);
Run Code Online (Sandbox Code Playgroud)


Mar*_*anD 3

如果将初始化与声明分开,您可能会得到您所期望的结果:

int a;
a = 3, 2, 1;     // a == 3, see note bellow
Run Code Online (Sandbox Code Playgroud)

或者

int a;
a = (3, 2, 1);   // a == 1, the rightmost operand of 3, 2, 1
Run Code Online (Sandbox Code Playgroud)

因为您的原始命令在语法上不正确(它是声明,因此它期望声明其他变量而不是数字21

注意:左操作数评估的所有副作用都会在开始右操作数评估之前完成。

所以

a = 3, 2, 1
Run Code Online (Sandbox Code Playgroud)

其中有 3 个逗号运算符a = 32并且1从左到右计算,因此第一个计算是

a = 3, 2
Run Code Online (Sandbox Code Playgroud)

结果 2 (右操作数)(顺便说一下,它没有分配任何变量,因为左操作数的值a = 3只是3),但在给出此结果之前a = 3,它完成了左操作数的副作用,即分配3给变量a. (感谢AnT的观察。)