【问题标题】:C language order of precedence [duplicate]C语言优先顺序[重复]
【发布时间】:2016-12-26 06:49:27
【问题描述】:
a = 5;
c = (b =a+2) - (a=1);

在 kn king 的《c 编程现代方法》一书中写道,执行第二条语句的效果将导致 6 或 2,因为它是 c 的未定义行为,但在其他书籍(如 Dennis 的 c)中写道将从左到右执行。哪一个是正确的?

【问题讨论】:

  • 这是未定义的行为。
  • 什么是“C by Dennis”?如果您在谈论K&R,它并没有说明从左到右执行的任何内容。
  • 你确定金这么说吗?哪个版本和页码?
  • 无法保证结果是 6 或 2 — 它们是结果的可能值,但 0 和 256 以及任何其他数字也是如此。该代码表现出未定义的行为。搜索“鼻恶魔”。

标签: c expression undefined-behavior evaluation


【解决方案1】:

在上述情况下,

 c=(b=a+2) -(a=1);

a 的值正在被更改并被读取,中间没有序列点,所以它是undefined behavior

引用 C11,附件 §J.2,未定义的行为

标量对象的副作用相对于不同的副作用是无序的 在同一标量对象或使用同一标量的值的值计算上 对象。

也相关,来自第 §6.5 章

运算符和操作数的分组由语法指示。85) 除非另有说明 稍后,子表达式的副作用和值计算是无序的。86)

因此,不能保证首先评估哪个子表达式。

【讨论】:

  • 关闭,但评估不是(必然)同时进行的。
  • @KeithThompson 先生,这就是我把它放在 斜体 中的原因,你能建议另一种措辞吗?
  • 去掉“同时”这个词,就说没有序列点。
  • @KeithThompson 谢谢,现在好点了吗?
猜你喜欢
  • 2014-04-11
  • 1970-01-01
  • 2014-08-08
  • 2017-01-04
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2015-05-05
  • 2012-07-11
相关资源
最近更新 更多