为什么x
的值在以下代码中没有增加?
#include <stdio.h>
int main(){
int x = 3, i = 0;
do {
x = x++;
i++;
} while (i != 3);
printf("%d\n", x);
}
答案 0 :(得分:3)
在x = x++
中,您要同时增加x
并为x
分配值。如果你“同时”同时做这两件事,C标准没有定义会发生什么。为此,“同时”意味着你的代码没有安排其中一个在另一个之前发生。
如果将增量和赋值放在单独的语句中,C标准会说其中一个出现在另一个之前,然后完全定义了行为。从技术上讲,两个这样的语句之间有一个序列点。序列点是分隔效果的障碍。在单个语句x = x++
中,没有序列点。
(C中的序列点和排序更多,但详细信息超出了本问题的范围。)
在最简单的C实现中,编译器可能会将x = x++;
视为x = x; x++;
,或者将其视为int Temporary = x; x++; x = Temporary;
。第一个将x
设置为3然后设置为4.第二个将x
设置为4然后设置为3.但是,C标准为实现提供了很大的自由度。在某些C实现中,整数类型可能由部分组成 - 一台小型计算机可能无法同时处理32位整数,因此它可能必须在多个16位步骤中进行算术运算,甚至多个8-位步。 C标准说,既然你没有安排分配和增量按特定顺序发生,那么,不仅允许实现以任何顺序执行它们,甚至允许混合步骤。它可以执行赋值的一个字节,增量的一个字节,赋值的第二个字节,增量的第二个字节,增量的第三个字节,赋值的第三个字节,依此类推。一般来说,你可以得到一个荒谬的答案,这是对部件操作的混杂。
所以C标准没有说明,如果你没有安排订购操作,那么任何一个都在另一个之前发生。它说,如果您不安排订购操作,我们不保证会发生什么。你可能会陷入一团糟。