我有三个代码片段。这个:
1,7; //yes, that's all the code
编译好。这个:
double d = (1, 7);
也可以编译。然而这个:
double d = 1, 7;
无法编译。gcc-4.3.4 说
错误:数字常量之前的预期不合格 id
和 Visual C++ 10 说
错误 C2059:语法错误:“常量”
为什么会有这样的差异?为什么所有三个编译器都没有,
在所有三个中具有相同的效果?
我有三个代码片段。这个:
1,7; //yes, that's all the code
编译好。这个:
double d = (1, 7);
也可以编译。然而这个:
double d = 1, 7;
无法编译。gcc-4.3.4 说
错误:数字常量之前的预期不合格 id
和 Visual C++ 10 说
错误 C2059:语法错误:“常量”
为什么会有这样的差异?为什么所有三个编译器都没有,
在所有三个中具有相同的效果?
在前两种情况下,语句使用 C++ 的逗号运算符
在后一种情况下,逗号被用作单独的变量,编译器希望您声明多个标识符;逗号未在此处用作运算符。
最后一种情况类似于:
float x,y;
float a = 10, b = 20;
当你这样做时:
double d = 1, 7;
编译器需要一个变量标识符,而不是一个数字常量。因此 7 在这里是非法的。
但是,当您这样做时:
double d = (1,7);
正在使用普通逗号运算符:1 被评估并丢弃,而 7 存储在 d 中。
不同之处在于 in1, 7;
和(1, 7)
您有允许逗号运算符的表达式。
你的最后一个例子
double d = 1, 7;
是一个声明,其中逗号不是运算符而是分隔符。编译器执行类似
double d = 1, e = 7;
这将是一个正确的变量声明。
请注意,逗号有时是运算符(在表达式中),但在其他地方也用作分隔符,例如函数声明中的参数列表。
double d = (1, 7);
这里(1, 7)
将首先评估;逗号用作顺序评估运算符,并将
7
分配给d
。
double d = 1, 7;
在这种情况下有一个问题:逗号之前的部分意味着你声明一个双精度并设置它的值,但逗号之后的部分是没有意义的,因为它只是一个整数常量。
我相信这是因为最后一个被视为(不正确的)声明行:(double d = 1), (7)