为什么带逗号的双重初始化是非法的?
Why is this double initialization with a comma illegal?
我有三个代码片段。这一个:
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;
应该是一个正确的变量声明。
请注意,逗号有时是一个操作符(在表达式中),但在其他地方也用作分隔符,如函数声明中的参数列表。
-
double d = (1, 7);
这里将评估(1, 7)
第一个;逗号用作顺序求值运算符,和7
将被分配给d
。 -
double d = 1, 7;
在这种情况下,有一个问题:部分在逗号前表示声明双精度类型并设置其值,但是逗号后面的部分是无意义的,因为它只是一个单整数常数。
我认为这是因为最后一个被视为(不正确的)声明行:(double d = 1), (7)
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- WinLamb 错误:成员初始化非法
- 非法会员初始化
- C++模板类中的非法成员初始化
- 错误 C2614:'ChildClass':非法成员初始化:'var1'不是基或成员
- 为什么带逗号的双重初始化是非法的?
- C++ 代码错误(非法成员初始化、'class'类型重定义、'return':无法转换)