解释差异:

Abh*_*ury -3 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 
Run Code Online (Sandbox Code Playgroud)

C中这些i的定义有什么区别?它们是如何工作的?

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

Kon*_*lph 7

=优先于,1.所以第一个声明是声明和初始化i:

int i = 1;
Run Code Online (Sandbox Code Playgroud)

...后面跟着很多逗号分隔的表达式,什么都不做.

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

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

错误:数字常量之前的预期unqualified-id


1无论使用何种运算符,C++中的优先规则都适用.=并且,在OP的代码中没有引用operator=operator,.然而,他们是运营商就C++而言(标准的§2.13),以及令牌的优先级=,不依赖于它们的用法-恰巧, 总是比优先级较低=的语义无关.

  • 我认为在(无效)第一行的上下文中=具有比逗号运算符更高的优先级是误导性的.那个逗号不是那里的运算符. (8认同)
  • 等号也不是运算符. (5认同)
  • @KonradRudolph我认为他们说的是(a)初始化,而不是赋值(b)如果正确使用`{1,2,3,4,5,6}`那么**不会**运营商,`.现在,初始化点只有一半,因为要求赋值运算符是可访问的,即使它实际上已被省略. (3认同)
  • @ RichardJ.RossIII他的意思是_that_不是运营商,他是对的. (2认同)
  • @KonradRudolph我没有投票,但是有些混淆可能来自于你提到第一个变体非法非法,因为事后的想法.另外,要说第一个语句中的逗号分隔表达式"什么都不做"并不完全正确,因为它们使整个语句非法. (2认同)

cni*_*tar 6

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

所以,直截了当地说,不同之处在于第一个不是C而第二个不是.

  • @ RichardJ.RossIII由于代码无法编译,因此无法讨论结果. (3认同)
  • @ RichardJ.RossIII我添加的一切都是"第二只是......".其余的是噪音.我的回答的主要部分指出第一行是非法语法.我觉得我之间没有添加任何必要的东西.此外,downvoting应该用来标记不正确或无用的答案,而不是"我们需要惩罚这种行为". (2认同)

Ric*_*III 6

您遇到了逗号运算符(,)的有趣边缘情况.

基本上,它接受前一个语句的结果并丢弃它,将其替换为下一个语句.

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

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

在第二个中,所有第一个值都被丢弃,并且在项链(5)中给出最终结果.

  • 好吧,逗号不像那里的运算符,而是分隔符:) (4认同)
  • 你正在讨论OP中第一行代码的结果,而它甚至都没有编译. (2认同)
  • @ RichardJ.RossIII也没有改变罗马是意大利首都的事实.相同的相关性(+ jrok的评论) (2认同)