-1

我觉得这样的表达式应该是无效的,但我能够编译它并得到答案 5。最后我觉得即使它的答案应该是 4 而不是 5。

int main(void)
{
  int i=1;

  // how is the next line evaluated ie in what sequence??

  i=2+2*i++;
  printf("%d",i);
  return 0;
}

我得到的输出是 5。我不明白它应该如何给出值。

4

1 回答 1

4

这是未定义的行为,因为i在序列点之间多次修改。例如,这个编译器给出 4 作为答案,因为它把增量放在赋值之后。如果增量在分配之前,另一个合理的答案是 6。但是,正如您所发现的,编译器可以随意给出答案,包括 5。

有关序列点和未定义行为的更多信息,请参见此处

于 2013-08-09T20:13:52.607 回答