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

sha*_*oth 5 c++ comma-operator

我有三个代码片段.这个:

1,7; //yes, that's all the code
Run Code Online (Sandbox Code Playgroud)

编译好吧.这个:

double d = (1, 7);
Run Code Online (Sandbox Code Playgroud)

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

double d = 1, 7;
Run Code Online (Sandbox Code Playgroud)

无法编译.gcc-4.3.4说

错误:数字常量之前的预期unqualified-id

和Visual C++ 10说

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

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

sha*_*eel 13

在前两种情况下,语句使用的是C++的逗号运算符

在后一种情况下,逗号被用作变量分离,编译器期望您声明多个标识符; 逗号在此处未被用作运算符.

最后一种情况类似于:

float x,y;
float a = 10, b = 20;
Run Code Online (Sandbox Code Playgroud)

当你这样做:

double d = 1, 7;
Run Code Online (Sandbox Code Playgroud)

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

但是当你这样做时:

double d = (1,7);
Run Code Online (Sandbox Code Playgroud)

正在使用正常的逗号运算符:1被评估并丢弃,而7被存储在d中.

  • "逗号运算符没有按正常方式使用" - 确切地说,逗号标记根本不是逗号运算符.它是两个声明符之间的分隔符,`7`不是有效的声明符. (5认同)

Bo *_*son 5

所不同的是,1, 7;(1, 7)你有表现,其中一个逗号操作符是允许的.

你最后一个例子

double d = 1, 7; 
Run Code Online (Sandbox Code Playgroud)

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

double d = 1, e = 7; 
Run Code Online (Sandbox Code Playgroud)

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

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