UB是否使用零倍增未初始化变量?

时间:2017-05-10 12:27:49

标签: c undefined-behavior

以下代码中是否有UB?

#include <stdio.h>

int main(void)
{
    int x;
    printf("%d", 0*x);
    return 0;
}

此处,变量x未初始化,但乘以0,结果传递给printf。在数学上,传递给printf的结果应该是0,但我想在c语言中这会调用UB。如果变量没有乘以0,那么它显然是UB,但我不确定在这种特殊情况下它是否为UB。

Ideone link

2 个答案:

答案 0 :(得分:3)

是的,这是UB。

符合标准的编译器可能不会进行任何优化并在public T Get<T>(T t) { if (t is TypeA) { TypeA a = (TypeA)t; //error } } 中遇到陷阱表示 某些实现可能会为特殊值保留一些位,包括陷阱表示。

答案 1 :(得分:1)

这是未定义的行为,因为这可能会导致陷阱表示。

来自C standard

未初始化的变量,第6.7.9节:

  

10 如果没有明确初始化具有自动存储持续时间的对象,则其值为 indeterminate

不确定的定义,第3.19.2节:

  

不确定价值

     

未指定的值或陷阱表示

陷阱表示的定义,第3.19.4节:

  

陷阱表示

     

不需要表示对象值的对象表示   型