int i=1,2,3,4; // Compile error
// The value of i is 1
int i = (1,2,3,4,5);
// The value of i is 5
C 中 i 的这些定义有什么区别,它们是如何工作的?
编辑:第一个是编译器错误。第二个如何工作?
=
优先于,
1。所以第一条语句是声明和初始化i
:
int i = 1;
……后面是很多逗号分隔的表达式,它们什么都不做。
另一方面,第二个代码由一个声明和一个初始化表达式组成(括号优先,因此 和 的相应优先级,
不再=
相关)。
再说一次,这纯粹是学术性的,因为第一个代码在 C 和 C++ 中都是无效的。我不知道您正在使用哪个编译器接受此代码。我的(正确)抱怨
错误:数字常量之前的预期不合格 id
1无论如何使用运算符,C++ 中的优先规则都适用。=
并且,
在 OP 的代码中不要引用operator=
or operator,
。然而,就C++ 而言,它们是运算符=
(标准的第 2.13 节),并且标记的优先级,
并不取决于它们的用法——它的优先级,
总是低于=
,无论语义如何。
不确定 C++,但至少对于 C 来说,第一个是无效的语法,所以你不能真正谈论声明,因为它不编译。第二个只是误用了逗号运算符,结果为 5。
因此,坦率地说,区别在于第一个不是 C,而第二个是。
您遇到了逗号运算符 ( ,
) 的一个有趣的极端情况。
基本上,它获取上一条语句的结果并将其丢弃,并用下一条语句替换它。
第一行代码的问题是operator precedence
。因为=
运算符的优先级高于,
运算符,所以您会得到逗号链 (1) 中第一条语句的结果。
更正(感谢@jrok!) - 第一行代码既不编译,也不使用逗号作为运算符,而是作为表达式分隔符,它允许您一次定义多个相同类型的变量名称。
在第二个中,所有第一个值都被丢弃,您将获得项目链中的最终结果 (5)。