有明确答案的未定义表达式?

Undefined expression with a definite answer?

我正在尝试理解面试问题的答案。

呈现如下代码:

int x = 5;

int y = x++ * ++x;

What is the value of y?

答案显示为多项选择答案列表,其中之一是 35

在我的机器上写入和 运行 这段代码导致 y 等于 35.
因此我希望将这个问题的答案标记为 35.

但是,这个表达式不是由于 x++ 而未定义吗,即效果的一面(x 的实际增量)可能随时发生,具体取决于编译器选择编译代码的方式。

因此,我不会认为您可以肯定地说答案是35,因为不同的编译器可能会产生差异结果。

另一个可能的多项选择答案是 30,我认为这也是可行的,即如果 post 增量副作用发生在序列点的最末端。

我没有答案,所以很难确定最好的答案。

这只是一个糟糕的问题还是答案更明显?

未定义行为意味着 未定义,有时它可能是 预期 行为,并不意味着它是 已定义.

也许他们希望您回答预期的行为是什么,none 因为它是未定义的行为。

你是正确的,这是未定义的。然而...

通常这些问题旨在让您思考,即使没有标准定义,提问者也可能想看看您是否:

  1. 大多数时候都知道会发生什么 "in the real world"。 (我并不是说这很好,但我是说你会发现代码库中的结构如此糟糕,甚至更糟,你可能会被要求接管和维护。)
  2. 了解运算符优先级和运算顺序。

你是对的;标准对此代码可能做什么没有强加任何要求。

如果这是一个多项选择题,需要你选择一个特定的定义答案,那么——写这个问题的人对 C 的理解不如你。当您决定是否接受那里的报价时,请记住这一点。 :-)