为什么带逗号的双重初始化是非法的?

Why is this double initialization with a comma illegal?

本文关键字:初始化 非法 为什么      更新时间:2023-10-16

我有三个代码片段。这一个:

1,7; //yes, that's all the code

编译好了。这一个:

double d = (1, 7);

也可以正常编译。然而这一个:

double d = 1, 7;

编译失败。gcc-4.3.4说

错误:expected unqualified-id before numeric constant

和Visual c++ 10显示

error C2059:语法错误:'constant'

为什么会有这样的差异?为什么不是所有的三个编译与,在所有三个有相同的效果?

在前两种情况下,语句使用c++的逗号操作符

在后一种情况下,逗号被用作变量分隔符,编译器希望您声明多个标识符;这里没有使用逗号作为操作符。

最后一种情况类似于:

float x,y;
float a = 10, b = 20;

当你这样做的时候:

double d = 1, 7;

编译器需要一个变量标识符,而不是一个数字常量。因此7在这里是非法的。

但是当你这样做的时候:

double d = (1,7);

正在使用普通的逗号操作符:1被求值并丢弃,而7被存储在d中。

不同之处在于,在1, 7;(1, 7)中,您有允许逗号操作符的表达式。

你的最后一个例子

double d = 1, 7; 

是一个声明,其中逗号不是操作符,而是分隔符。编译器期望像

这样的内容
double d = 1, e = 7; 

应该是一个正确的变量声明。

请注意,逗号有时是一个操作符(在表达式中),但在其他地方也用作分隔符,如函数声明中的参数列表。

  1. double d = (1, 7);这里将评估(1, 7)第一个;逗号用作顺序求值运算符,和7将被分配给d

  2. double d = 1, 7;在这种情况下,有一个问题:部分在逗号前表示声明双精度类型并设置其值,但是逗号后面的部分是无意义的,因为它只是一个单整数常数。

我认为这是因为最后一个被视为(不正确的)声明行:(double d = 1), (7)