-3
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 的这些定义有什么区别,它们是如何工作的?

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

4

3 回答 3

7

=优先于,1。所以第一条语句是声明和初始化i

int i = 1;

……后面是很多逗号分隔的表达式,它们什么都不做。

另一方面,第二个代码由一个声明和一个初始化表达式组成(括号优先,因此 和 的相应优先级,不再=相关)。

再说一次,这纯粹是学术性的,因为第一个代码在 C 和 C++ 中都是无效的。我不知道您正在使用哪个编译器接受此代码。我的(正确)抱怨

错误:数字常量之前的预期不合格 id


1无论如何使用运算符,C++ 中的优先规则都适用。=并且,在 OP 的代码中不要引用operator=or operator,。然而,就C++ 而言,它们是运算符=(标准的第 2.13 节),并且标记的优先级,并不取决于它们的用法——它的优先级, 总是低于=,无论语义如何。

于 2013-02-10T23:06:12.157 回答
6

不确定 C++,但至少对于 C 来说,第一个是无效的语法,所以你不能真正谈论声明,因为它不编译。第二个只是误用了逗号运算符,结果为 5。

因此,坦率地说,区别在于第一个不是 C,而第二个是。

于 2013-02-10T23:05:47.163 回答
6

您遇到了逗号运算符 ( ,) 的一个有趣的极端情况。

基本上,它获取上一条语句的结果并将其丢弃,并用下一条语句替换它。

第一行代码的问题是operator precedence。因为=运算符的优先级高于,运算符,所以您会得到逗号链 (1) 中第一条语句的结果。

更正(感谢@jrok!) - 第一行代码既不编译,也不使用逗号作为运算符,而是作为表达式分隔符,它允许您一次定义多个相同类型的变量名称。

在第二个中,所有第一个值都被丢弃,您将获得项目链中的最终结果 (5)。

于 2013-02-10T23:05:53.947 回答