Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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 是否使用零乘未初始化变量?_C_Undefined Behavior - Fatal编程技术网

C 是否使用零乘未初始化变量?

C 是否使用零乘未初始化变量?,c,undefined-behavior,C,Undefined Behavior,以下代码中是否有UB #include <stdio.h> int main(void) { int x; printf("%d", 0*x); return 0; } #包括 内部主(空) { int x; printf(“%d”,0*x); 返回0; } 这里,变量x未初始化,而是与0相乘,结果传递给printf。从数学上讲,传递给printf的结果应该是0,但我猜在c语言中,这会调用UB。如果变量没有乘以0,那么它显然是UB,但我不确定在这种特殊情

以下代码中是否有UB

#include <stdio.h>

int main(void)
{
    int x;
    printf("%d", 0*x);
    return 0;
}
#包括
内部主(空)
{
int x;
printf(“%d”,0*x);
返回0;
}
这里,变量
x
未初始化,而是与
0
相乘,结果传递给
printf
。从数学上讲,传递给printf的结果应该是
0
,但我猜在c语言中,这会调用UB。如果变量没有乘以
0
,那么它显然是UB,但我不确定在这种特殊情况下它是UB

是的,是UB

一致性编译器可能不会进行任何优化,并在
x
中运行陷阱表示法
一些实现可能会为特殊值保留一些位,包括陷阱表示。

是的,它是UB

一致性编译器可能不会进行任何优化,并在
x
中运行陷阱表示法

一些实现可能会为特殊值保留一些位,包括陷阱表示。

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

从:

未初始化变量,第6.7.9节:

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

不确定的定义,第3.19.2节:

不确定值

未指定的值或陷阱表示法

圈闭表示的定义,第3.19.4节:

陷阱表示法

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


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

从:

未初始化变量,第6.7.9节:

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

不确定的定义,第3.19.2节:

不确定值

未指定的值或陷阱表示法

圈闭表示的定义,第3.19.4节:

陷阱表示法

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


我不认为这是UB简单地说,
x
可以被赋予任何垃圾值,
0*x
将是0。为什么对这个答案投反对票?@EdHeal:一些实现可能会为陷阱值保留一些
int
。@EdHeal,不仅仅是陷阱表示,由于UB,某些编译器也可能会遇到不好的优化。这不是因为UB是陷阱表示,而是因为变量具有自动存储,并且从未占用其地址。陷阱表示在现实世界的计算机中几乎是不相关的。如果这个变量有它的地址,并且系统不支持陷阱表示,那么它将仅仅是未指定的行为。我不认为它是UB。-简单地说,
x
可以被赋予任何垃圾值,
0*x
将是0。为什么对这个答案投反对票?@EdHeal:一些实现可能会为陷阱值保留一些
int
。@EdHeal,不仅仅是陷阱表示,由于UB,某些编译器也可能会遇到不好的优化。这不是因为UB是陷阱表示,而是因为变量具有自动存储,并且从未占用其地址。陷阱表示在现实世界的计算机中几乎是不相关的。如果这个变量的地址被占用,并且系统不支持陷阱表示,那么它将仅仅是未指定的行为。UB不是“坏事情发生了”。UB是“允许编译器做任何它想做的事情”。使用未初始化值是编译器执行任何操作的权限,包括返回0。在乘法之前,您可能会点击UB。@SouravGhosh这应该是一个更好的副本@LưuVĩnhPhúc当然,只是添加了它。:)更好的复制:。UB不是“坏事发生”。UB是“允许编译器做任何它想做的事情”。使用未初始化值是编译器执行任何操作的权限,包括返回0。在乘法之前,您可能会点击UB。@SouravGhosh这应该是一个更好的副本@LưuVĩnhPhúc当然,只是添加了它。:)更好的复制:。int的陷阱表示形式是什么?不,这不是(必要的)这是UB的原因。在现实世界的计算机中,不存在陷阱表示,因此任何关于它们的讨论都与现实世界无关。int的陷阱表示是什么?不,这不一定是为什么。在现实世界的计算机中不存在陷阱表示,因此任何关于它们的讨论都与现实世界无关。