gpt4 book ai didi

c - 为什么以下代码产生的 O/P 为 3 而不是 6?

转载 作者:行者123 更新时间:2023-11-30 21:17:03 26 4
gpt4 key购买 nike

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

#include <stdio.h>

int main(){

int x = 3, i = 0;
do {
x = x++;
i++;
} while (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 标准并没有规定,如果您不安排操作的顺序,则其中一个操作会先于另一个操作发生。它表示,如果您不安排订购操作,我们不保证会发生什么。你可能会弄得一团糟。

关于c - 为什么以下代码产生的 O/P 为 3 而不是 6?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48064923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com