【问题标题】:Sequence points in a language with left to right evaluation order?从左到右评估顺序的语言中的序列点?
【发布时间】:2011-06-09 20:10:13
【问题描述】:

当评估顺序指定为“从左到右”并且语言是(伪)类 C 语言时,以下示例中的序列点是什么?

int x = 1;
int z = x-- + x; // z = 1 + 0 or z = 1 + 1?
my_func(x++); // x incremented before or after my_func execution?
my_func(x++ + --x); // combining those above

【问题讨论】:

  • C 中的“序列点”有一个精确的定义。您的“(伪)类 C”语言是否以相同的方式定义序列点?
  • 这些是我练习的摘录,文本准确地说明了我写的内容:“具有动态范围、浅绑定和从左到右的表达式评估的类 C 语言”。仅此而已...

标签: side-effects sequence-points


【解决方案1】:

序列点是语言标准定义的序列点。我即将给出的答案适用于 C,但另一种“类 C”语言可能很好地定义了不同的序列点,因此对这些问题有不同的答案。

int z = x-- + x; // z = 1 + 0 or z = 1 + 1?

由于+在C中不是序列点,所以上述语句的结果是未定义的。

my_func(x++); // x incremented before or after my_func execution?

xmy_func 运行之前递增,但 my_funcx 的旧值作为参数调用。

my_func(x++ + --x); // combining those above

未定义的原因与第一个相同。

【讨论】:

  • 如果 z = ++x + y++ 会怎样?这个语句不应该是未定义的,对吧?
  • @Gremo:是的,已经定义好了。 xy 都将加一,z 将是 x 的新值和 y 的旧值之和。不过,这与序列点无关。
  • 如果 x = 1; y = 2; z = 2 + 2;然后 y = 3。也许我误解了序列点是什么?
  • @Gremo:是的,z 将是 4,xy 将分别是 2 和 3。序列点是在它之前的所有内容都在其之后的任何内容之前执行的点。例如,如果+ 是一个序列点并且您执行了f(x) + g(x),您就会知道首先执行f(x),然后执行g(x)。然而事实并非如此,所以你不知道哪个会先被执行。所以当你做++x + (x+1)这样的事情时,你不知道++x是在x+1之前还是之后执行的,所以结果是未定义的。
  • 如果 my_func 有一个引用会发生什么,即它的签名是 myfunc(int& x)?那么是否保证获得对更新后的 x 的引用?还是它得到旧版本,但旧版本稍后更新?或者它只是得到一个旧版本的副本,它的寿命不超过函数范围?
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 2018-07-05
  • 1970-01-01
  • 2015-07-04
  • 2019-10-26
  • 2022-01-13
  • 1970-01-01
  • 2018-11-07
相关资源
最近更新 更多