gpt4 book ai didi

c - (为什么)正在使用未初始化的变量未定义行为?

转载 作者:太空狗 更新时间:2023-10-29 16:15:45 28 4
gpt4 key购买 nike

如果我有:

unsigned int x;
x -= x;

很明显 x 应该在这个表达式之后为零,但是我到处看,他们说这段代码的行为是未定义的,不仅仅是 x 的值(直到减法之前)。

两个问题:

  • 这段代码的行为确实是未定义的吗?
    (例如,代码可能会在兼容系统上崩溃[或更糟]?)

  • 如果是这样,为什么 C 说行为 是未定义的,而 x 非常清楚 这里应该为零吗?

    即不在此处定义行为有什么优势

显然,编译器可以简单地使用它认为“方便”的任何垃圾值在变量中,并且它会按预期工作......这种方法有什么问题?

最佳答案

是的,这种行为是未定义的,但其原因与大多数人所知道的不同。

首先,使用单位化值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,则访问它是 UB。无符号类型很少有陷阱表示,因此您在这方面会相对安全。

使行为未定义的原因是您的变量的一个附加属性,即它“可以用 register 声明”,即它的地址永远不会被占用。这些变量被特殊对待,因为有些架构具有真正的 CPU 寄存器,这些寄存器具有一种“未初始化”的额外状态,并且不对应于类型域中的值。

编辑:标准的相关短语是 6.3.2.1p2:

If the lvalue designates an object of automatic storage duration thatcould have been declared with the register storage class (never hadits address taken), and that object is uninitialized (not declaredwith an initializer and no assignment to it has been performed priorto use), the behavior is undefined.

为了更清楚地说明,以下代码在所有情况下都是合法的:

unsigned char a, b;
memcpy(&a, &b, 1);
a -= a;
  • 这里取的是ab的地址,所以它们的值就是不确定。
  • 因为 unsigned char 从来没有陷阱表示该不确定值只是未指定,unsigned char 的任何值都可以发生。
  • 最后a必须保持值0

Edit2 ab 具有未指定的值:

3.19.3 unspecified value
valid value of the relevant type where this International Standard imposes no requirements on which valueis chosen in any instance

Edit3:其中一些内容将在 C23 中阐明,其中术语“不确定值”将替换为术语“不确定表示”,术语“陷阱表示”将替换为“非-值表示”。另请注意,所有这些在 C 和 C++ 之间都是不同的,它们具有不同的对象模型。

关于c - (为什么)正在使用未初始化的变量未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962457/

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