为什么用逗号进行双重初始化是非法的?

时间:2011-12-15 12:07:47

标签: c++ comma-operator

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

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

编译好。这一个:

double d = (1, 7);

也编译好了。然而这一个:

double d = 1, 7;

无法编译。 gcc-4.3.4说

  

错误:数字常量

之前的预期unqualified-id

和Visual C ++ 10说

  

错误C2059:语法错误:'常量'

为何如此差异?为什么三个编译都没有,在所有三个中都有相同的效果?

4 个答案:

答案 0 :(得分:13)

在前两种情况下,语句使用的是C ++的comma operator

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

最后一种情况类似于:

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

执行此操作时:

double d = 1, 7;

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

但是当你这样做时:

double d = (1,7);

正在使用普通逗号运算符:1被评估并丢弃,而7被存储在d。

答案 1 :(得分:5)

区别在于1, 7;(1, 7)中有表达式,允许使用逗号运算符。

你的最后一个例子

double d = 1, 7; 

是一个声明,其中逗号不是运算符而是分隔符。编译器会出现像

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

这将是一个正确的变量声明。

请注意,逗号有时是运算符(在表达式中),但在函数声明中的参数列表等其他位置也可用作分隔符。

答案 2 :(得分:3)

  1. double d = (1, 7);此处将评估(1, 7) 第一;逗号用作顺序评估运算符,和 7将被分配到d

  2. double d = 1, 7;在这种情况下有一个问题:部分 在逗号之前意味着你声明一个double并设置它的值,但是 逗号之后的部分无意义,因为它只是一个单独的 整数常数。

答案 3 :(得分:0)

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