【问题标题】:Increment operators and "undefined behaviour"增量运算符和“未定义的行为”
【发布时间】:2016-12-21 21:45:41
【问题描述】:

正如comp.lang.c FAQ 中提到的,C 标准规定:

在前一个序列点和下一个序列点之间,一个对象应该有它的 表达式的评估最多修改一次存储的值。 此外,应仅访问先验值以确定 要存储的值。

但是,这个(now deleted) article 表示a = ++b + ++c; 是未定义的。有人可以解释为什么这是未定义的行为吗?

【问题讨论】:

  • 我认为甘斯尔先生在这种情况下是错误的。
  • 一种使其成为 UB 的方法:#define b a
  • 这看起来像是文章中的错误。
  • 请注意,a = ++b+++c; 确实是不正确的,而是违反约束而不是未定义的行为。
  • 我不知道为什么那会是未定义的。很明显++b 的值为b + 1。像a = ++b + ++b 这样的东西是另一回事。

标签: c language-lawyer


【解决方案1】:

如果表达式 a = ++b + ++c; 中涉及的对象(abc)是不同的,则该表达式是明确定义的。

也许,作者的意思是两次使用相同的变量,例如a = ++b + ++b;。我只能推测。但是给定的表达式没有不确定性。

【讨论】:

  • int b = INT_MAX, c = INT_MAX; int a = ++b + ++c;?
  • @alk 会拉伸它,不是吗?
  • @alk - Ganssle 显然(错误地)认为表达式未定义,因为专门使用了 ++ 运算符。
  • 故事的寓意:不要相信关于 C 的随机互联网页面。相信标准草案,并且(大部分)赞成 stackoverflow 答案
  • 如果主题众所周知,@M.M SO 是可靠的。晦涩的,即使是高度赞成的,也可能是错误的,必须从多个来源进行验证。
猜你喜欢
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多