2017-08-27 34 views
-5

我現在正在學習C編程(我對它很陌生),我也在嘗試各種各樣的東西來理解事情的工作方式。所以,我很清楚下面的代碼是不正確的代碼;但我還是嘗試了一下,瞭解它將如何編譯:在C編程中,%d是否隨機生成數字?

#include <stdio.h> 
#include <stdlib.h> 

int { 
    printf("I think C will give me %d %d %d %d %d.", 20); 
    return 0; 
} 

而且我在命令行中得到這個:

 
I think C will give me 20 8 108 108 2. 
Process returned 0 (0x0) execution time : 0.234 s 
Press any key to continue. 

如果從號碼8,108,108和2 ?他們是如何產生的?

我只是想了解它是如何工作的。謝謝。

+1

這是未定義的行爲,這就是爲什麼。 –

+1

您只爲五個'%d'格式說明符中的第一個提供了參數,所以行爲未定義。 –

+3

行爲未定義。沒有人知道這些數字是如何「生成」的,因爲在實踐中它將取決於許多特定實施情況。換句話說,可以想出一個「真實生活」的答案,但它高度依賴於你的設置。我們從這裏看不到它。 – AnT

回答

1

因爲它是未定義的行爲。

沒有隨機參與,它只是printf()試圖找到每個"%d"的correspoing參數,並將它訪問內存不指向任何參數,所以它打印任何發現的情況。

但嚴格來說,這是未定義的行爲。如果存在比參數更多的格式說明符,則標準不會指定行爲。

所以通過一個單一的int變量,當函數需要5會導致不確定的行爲,並在實踐中這是不可能預測什麼事情發生。

+2

這就是[FGITW](https://meta.stackexchange.com/questions/9731/fastest-gun-in-the-west-problem)。不要這樣做。另外,我相信你知道這是許多事情的重複,因爲你正在回答標準的UB響應,所以投票結束。 – Ryan

+1

@Ryan謝謝你的鏈接,我應該從頭開始想到它,我再也不會這麼做了。 –

+1

@Iharob [編輯:是,在刪除評論]正確地說,這個答案本質上是正確的。尤其重要的是斷言不涉及隨機性。計算機是(理想)確定性機器。如果你知道前提條件,你可以絕對預測程序打印的數字。這就是爲什麼您需要通過隨機敲擊鍵盤來爲一些應用程序(如加密密鑰生成)手動生成隨機性的原因。使用沒有參數的printf強調*不是產生隨機數的一種方法。 –