【问题标题】:Explain the difference:解释区别:
【发布时间】:2013-02-10 23:02:55
【问题描述】:
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 

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

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

【问题讨论】:

  • 很确定这属于未定义的行为
  • @Kippie 第二个使用逗号运算符。很多次。
  • 第一个是编译器错误
  • Abhinav 我很好奇,哪个编译器接受了你的第一个例子?
  • @juanchopanza 第一个确实是编译器错误。我的坏..

标签: c++ c operators


【解决方案1】:

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

int i = 1;

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

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

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

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


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

【讨论】:

  • 我认为在(无效)第一行的上下文中说 = 比逗号运算符具有更高的优先级是一种误导。那个逗号不是那里的运算符。
  • 等号也不是运算符。
  • @RichardJ.RossIII 他的意思是一个人不是操作员,他是对的。
  • @KonradRudolph 我认为他们是在说 (a) 是初始化,而不是赋值 (b) 如果正确使用了 {1,2,3,4,5,6},那不会是 @987654336 @。现在,初始化点只有一半,因为赋值运算符必须是可访问的,即使它实际上被省略了。
  • @KonradRudolph 我没有投反对票,但是您提到第一个变体几乎是事后才认为是非法的这一事实可能会引起一些混乱。另外,说第一个语句中的逗号分隔表达式“什么都不做”也不完全正确,因为它们会使整个语句非法。
【解决方案2】:

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

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

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

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

在第二个中,所有第一个值都被丢弃,并且在项目链 (5) 中为您提供 final 结果。

【讨论】:

  • 您正在讨论 OP 中第一行代码的结果,而它甚至没有编译。
  • @jrok 当然不是。我正在回答 OP 中关于他的期望的问题。仅仅因为他的特定代码行没有编译,并没有改变= 运算符比, 运算符具有更高优先级的事实。
  • 嗯,逗号在那里不像运算符,而是分隔符:)
  • @RichardJ.RossIII 也不会改变罗马是意大利首都的事实。相同的相关性(+ jrok 的评论)
  • @jrok 那么按照这种逻辑,您也应该对 Konrad 的回答投反对票。他比我落后 30 秒,并且有同样的逻辑缺陷。
【解决方案3】:

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

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

【讨论】:

  • 问题不在于是否是有效代码。这是关于它得到的结果。
  • @RichardJ.RossIII 由于代码无法编译,所以没有结果可讨论。
  • @RichardJ.RossIII 答案必须是“你使用什么编译器?”
  • @KonradRudolph 正确。因此,我删除了反对票。最初的反对意见是因为第一次修订显然是 FGITW 帖子。
  • @RichardJ.RossIII 我添加的所有内容都是“第二个只是......”。剩下的就是噪音。我的回答的主要部分指出第一行是非法语法。我觉得我在两者之间没有添加任何必要的东西。此外,投反对票应该用作标记错误或无用答案的一种方式,而不是“我们需要惩罚这种行为”。
猜你喜欢
  • 1970-01-01
  • 2013-07-15
  • 2017-07-23
  • 1970-01-01
  • 2017-03-09
  • 2011-03-26
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多