C 是否使用零乘未初始化变量?
以下代码中是否有UBC 是否使用零乘未初始化变量?,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,但我不确定在这种特殊情
#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的陷阱表示是什么?不,这不一定是为什么。在现实世界的计算机中不存在陷阱表示,因此任何关于它们的讨论都与现实世界无关。