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的定义有何区别?它们是如何工作的?
编辑:第一个是编译器错误。第二个如何运作?
答案 0 :(得分:7)
=
优先于,
1 。所以第一个声明是i
:
int i = 1;
...后跟许多不做任何操作的逗号分隔表达式。
另一方面,第二个代码由一个声明后跟一个初始化表达式组成(括号优先,因此,
和=
各自的优先级是不再相关)。
然后再次,这纯粹是学术性的,因为第一个代码无效,无论是在C还是在C ++中。我不知道你使用哪个编译器它接受这个代码。我(正确)抱怨
错误:数字常量
之前的预期unqualified-id
1 无论使用何种运算符,C ++中的优先规则都适用。 OP代码中的=
和,
并未引用operator=
或operator,
。然而,就C ++而言,它们是运算符(标准的第2.13节),并且标记=
和,
的优先级不依赖于它们的用法 - 碰巧,,
总是的优先级低于=
,无论语义如何。
答案 1 :(得分:6)
不确定C ++,但至少对于C,第一个是无效的语法,所以你不能真正谈论一个声明,因为它不能编译。第二个是逗号运算符误用,结果为5.
所以,直截了当地说,区别在于第一个不是C而第二个是。
答案 2 :(得分:6)
您遇到了逗号运算符(,
)的有趣边缘情况。
基本上,它接受前一个语句的结果并丢弃它,用下一个语句替换它。
第一行代码的问题是 operator precedence
。由于=
运算符的优先级高于,
运算符,因此您将获得逗号链(1)中第一个语句的结果。
更正(感谢@jrok!) - 第一行代码既不编译,也不使用逗号作为运算符,而是作为表达式分隔符,它允许您在一个表达式中定义多个相同类型的变量名称。时间。
在第二个值中,所有第一个值都被丢弃,并且在项目链(5)中给出 final 结果。