我在gcc中尝试了以下代码:
#include<stdio.h>
int main()
{
int a=3,2,1;//////////////////////ERROR!//////////////////////////
printf("%d", a);
return 0;
}
我希望它能成功编译为:
- 一系列以逗号分隔的整数表达式将从左到右求值,最右边的表达式的值将成为逗号分隔的整个表达式的值。
那么,整型变量a的值应该是1,对吗?还是3?
为什么我得到这个错误当我试图执行这个程序?
错误:期望的标识符或'('前的数字常量
它被解析为一个由三部分组成的变量声明,其中包含两个无效变量。
您需要将整个初始化式包装在圆括号中,以便将其解析为单个表达式:
int a=(3,2,1);
如果你把初始化和声明分开,你可能会得到你想要的:
int a;
a = 3, 2, 1; // a == 3, see note bellow
或
int a;
a = (3, 2, 1); // a == 1, the rightmost operand of 3, 2, 1
作为您的原始命令在语法上不正确(它是声明,因此它期望其他变量声明而不是数字2
和1
)
注释:左操作数求值的所有副作用都在开始右操作数求值之前完成。
a = 3, 2, 1
是三个逗号运算符a = 3
, 2
和1
,从左到右求值,因此第一次求值为
a = 3, 2
的结果2(右操作数)(顺便说一下,没有将赋值给任何变量,因为左操作数a = 3
的值只是3
),但是在给出该结果之前完成了左操作数的副作用a = 3
,即将3
赋值给变量a
。(感谢AnT的观察)