Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么下面的代码将O/P生成为3而不是6?_C - Fatal编程技术网

C 为什么下面的代码将O/P生成为3而不是6?

C 为什么下面的代码将O/P生成为3而不是6?,c,C,为什么x的值在以下代码中不增加 #include <stdio.h> int main(){ int x = 3, i = 0; do { x = x++; i++; } while (i != 3); printf("%d\n", x); } #包括 int main(){ int x=3,i=0; 做{ x=x++; i++; }而(i!=3); printf(“%d\n”,x); } 在x=x++中,您说的是增加x和分

为什么
x
的值在以下代码中不增加

#include <stdio.h>

int main(){

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

   printf("%d\n", x);
}
#包括
int main(){
int x=3,i=0;
做{
x=x++;
i++;
}而(i!=3);
printf(“%d\n”,x);
}

x=x++
中,您说的是增加
x
和分配
x
一个值。C标准没有定义如果您“同时”做这两件事会发生什么。为此,“同时”意味着您的代码没有安排其中一件事先于另一件事发生

如果将增量和赋值放在单独的语句中,C标准会说其中一个出现在另一个之前,然后行为就被完全定义了。从技术上讲,两个这样的语句之间有一个序列点。序列点是分隔效果的屏障。在单个语句
x=x++
中,没有序列点

(C中有更多关于序列点和序列的内容,但细节超出了本问题的范围。)

在最简单的C实现中,编译器可能会处理
x=x++就好像它是
x=x;x++或好像它在这里
int Temporary=x;x++;x=临时。第一个将
x
设置为3,然后设置为4。第二个将
x
设置为4,然后设置为3。然而,C标准给了实现很大的自由度。在一些C实现中,整数类型可能由多个部分组成——一台小型计算机可能无法同时处理32位整数,因此它可能必须以多个16位步骤,甚至多个8位步骤进行算术运算。C标准说,由于您没有安排分配和增量以特定的顺序发生,因此,不仅允许实现以任意顺序进行分配和增量,甚至还允许混合步骤。它可以执行赋值的一个字节、增量的一个字节、赋值的第二个字节、增量的第二个字节、增量的第三个字节、赋值的第三个字节,依此类推。总的来说,你可能会得到一个荒谬的答案,那就是零件操作的混乱


因此,C标准并没有说,如果您不安排命令的操作,那么其中一个操作发生在另一个之前。上面说,如果您不安排订购操作,我们根本不保证会发生什么。你可能会弄得一团糟。

@Fredrarson:至少这是2018年第一次问这个问题@Fredrarson是的,事实证明很多人并不知道所有的事情,还有一些事情很多人不知道,因为他们很困惑和/或缺乏教育。谷歌搜索没有帮助,因为不同的编程语言对这些概念的处理方式不同,甚至在搜索中添加“c”也不会将搜索结果限制在c上。@DanielH:true。我们需要一次又一次地告诉每一个人。@DanielH这不是一个坏问题,因为代码不好(事实上是这样),或者因为OP没有进行认真的数量研究(事实上不是这样),或者因为它已经被问了这么多次了(事实上是这样)。这很糟糕,因为它毫无意义。这是毫无意义的,因为其中混乱的代码很容易被清晰易懂的代码替换。这就是为什么它不好。那么正确的句子是什么,我应该说它们都是在相同的2个序列点之间执行的,因此顺序没有定义?或者我应该在同一个表达式或语句中说吗?C已经切换到一个新的排序模型,该模型基于sequenced before和sequenced after关系(类似于C++中使用的关系)。因此,从学究的角度来说,用序列点的温度来描述情况是不正确的。这个概念在C语言中仍然存在(顺序点基本上是集中在某个特定点之前排序和之后排序的组合),但它不再足够准确。@AnT:你能把它组合成简单的句子,让新手理解,并把它编成一个答案,然后投票表决吗?堆栈溢出不擅长于此。新模型可能具有更强大的描述能力和精确性,但如何将其传授给仍在学习此类基本问题的人呢?而且,如果你能教它,当有人已经输入了一个被投票通过的过于简单的答案后,你如何得到一个被接受的答案?除此之外,我们还必须防止人们将2011年后(C标准)的问题标记为2011年前的问题的副本。如果你愿意,你可以扩展我的答案,因为我不了解新模型。@mdatsev:我认为我重写了它以符合当前的标准,同时仍然试图保持这些概念适合学生。如果愿意,您可以将我的编辑还原到以前的版本。