为什么以下代码将O / P作为3而不是6?

时间:2018-01-02 16:59:02

标签: c

为什么x的值在以下代码中没有增加?

#include <stdio.h>

int main(){

   int x = 3, i = 0;
   do {
       x = x++;
       i++;
   } while (i != 3);

   printf("%d\n", x);
}

1 个答案:

答案 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标准没有说明,如果你没有安排订购操作,那么任何一个都在另一个之前发生。它说,如果您不安排订购操作,我们不保证会发生什么。你可能会陷入一团糟。