解释差异:

时间:2013-02-10 23:02:55

标签: c++ c operators

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的定义有何区别?它们是如何工作的?

编辑:第一个是编译器错误。第二个如何运作?

3 个答案:

答案 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 结果。