Post-自减运算符

Post-Decrement operator

有人请告诉我 x 之后的值是多少(用 c 语言)

x=1;

x=x--&&++x;

我认为它应该是 0,因为 x&&++x 会给出 1 而 post 递减会使它变成 0。

但是当我在电脑上输入这个时,结果是 1。 为什么 post 递减在这里不起作用。

我是这样想的:

pre increment 的优先级高于 && 所以两个 x 都应该被视为 2(布尔值 true )所以 x&&++x 将给出 1 而 post-decrement 应该将它递减为 0.

这不是一个重复的问题,因为这不是关于 post-递减如何工作的未定义行为的情况。

x=x--&&++x;

这会导致 未定义的行为,因为 x 的值在两个序列点之间更改了不止一次。

表达式 x-- && ++x 定义明确,因为它由于 && 而具有内部序列点,但是当您将其分配给 x 时,它会导致未定义的行为。

因此,表达式表现出未定义的行为。

C99 §6.5: “2. Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored.”

虽然 (x--)&&(++x); 的结果定义明确,但由于 short circuit evaluation

你的作业结果 x = (x--)&&(++x); 不是

一个更简单的例子是:

x = x--;

正如 Paul 和 Art 在评论中指出的那样:

modifies the value of x twice within the same expression without a sequence point between the modifications.


编辑: 修复了我最初的错误答案,该答案指出分配的结果已定义。

尽管我的大学有考试,但我无法停止思考这个问题,我想我终于找到了解决办法。

首先,post 递减运算符将在 && 的左侧执行,它将 x 的值递减为 0,但 x-- 将为 1(x 的先前值)作为左侧side is 1 右侧将在这里执行 ++x 将值 1 赋给 x 并且 ++x 的值也将是 1 因此 && 运算符将 return 值 1.Now,尽管没有序列点pre-increment operator 和 assignment operator 之间都将值 1 赋值给 x 所以这完全定义了在执行整个代码后 x 的值将为 1.