2017-05-10 38 views
0

在下面的代碼中是否有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。

Ideone link

+0

UB的值不爲「不測」。 UB是「編譯器可以做任何想做的事情」。使用未初始化的值是編譯器執行任何操作的權限 - 包括返回0. – aragaer

+1

您可能會遇到UB _before_乘法。 –

+1

@SouravGhosh這應該是一個更好的重複[是一個^ a或一個未定義的行爲,如果一個未初始化?](http://stackoverflow.com/q/25074180/995714) –

回答

3

是的,它是UB。

符合標準的編譯器可能不會進行任何優化並運行到x中的陷阱表示中。某些實現可能會爲特殊值保留一些位,包括陷阱表示。

+0

我不認爲這是UB。 - 只需'x'可以給出任何垃圾值,'0 * x'將爲0. –

+0

爲什麼選擇此答案的投票? – Destructor

+0

@EdHeal:一些實現可能爲陷阱值保留一些'int'位。 – pmg

1

這是未定義的行爲,因爲這可能會導致陷阱表示。

C standard

Uniitialized變量,部分6.7.9:

如果具有自動存儲持續時間的對象沒有被明確初始化,它的值是不確定的

不確定,第3.19.2的定義:

不確定的值

任一未指定的值或陷阱表示

陷阱的定義代表性,第3.19.4節:

陷阱表示

的對象表示的是不必表示對象 類型

+0

int的陷阱表示是什麼? –

+0

不,這不是(必然)爲什麼這是UB。 [見此](http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c/40674888#40674888)。在現實世界的計算機中,不存在陷阱表示,所以關於它們的任何討論都與真實世界無關。 – Lundin