在下面的代碼中是否有UB?是否使用零倍乘未初始化變量的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。
在下面的代碼中是否有UB?是否使用零倍乘未初始化變量的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。
是的,它是UB。
符合標準的編譯器可能不會進行任何優化並運行到x
中的陷阱表示中。某些實現可能會爲特殊值保留一些位,包括陷阱表示。
我不認爲這是UB。 - 只需'x'可以給出任何垃圾值,'0 * x'將爲0. –
爲什麼選擇此答案的投票? – Destructor
@EdHeal:一些實現可能爲陷阱值保留一些'int'位。 – pmg
這是未定義的行爲,因爲這可能會導致陷阱表示。
Uniitialized變量,部分6.7.9:
如果具有自動存儲持續時間的對象沒有被明確初始化,它的值是不確定的。
不確定,第3.19.2的定義:
不確定的值
任一未指定的值或陷阱表示
陷阱的定義代表性,第3.19.4節:
陷阱表示
的對象表示的是不必表示對象 類型
int的陷阱表示是什麼? –
不,這不是(必然)爲什麼這是UB。 [見此](http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c/40674888#40674888)。在現實世界的計算機中,不存在陷阱表示,所以關於它們的任何討論都與真實世界無關。 – Lundin
UB的值不爲「不測」。 UB是「編譯器可以做任何想做的事情」。使用未初始化的值是編譯器執行任何操作的權限 - 包括返回0. – aragaer
您可能會遇到UB _before_乘法。 –
@SouravGhosh這應該是一個更好的重複[是一個^ a或一個未定義的行爲,如果一個未初始化?](http://stackoverflow.com/q/25074180/995714) –