2015-08-22 205 views
0

在以下兩個代碼中,我無法理解問題。 第一個碼是:顯示兩個幾乎相同的代碼的不同輸出

#include <stdio.h> 
main() { 

    int num1, num2; 

    scanf("%d%d", &num1, &num2); 

    printf("I LOVE MY INDIA\n"); //here is '\n' after the statement 
    printf("%d", num1/num2); 

    return 0; 
} 

這裏,如果輸入是num1=2num2=0然後在gcc編譯的輸出是:

我愛我INDIA
浮點異常(核心轉儲)

但對於第二個代碼:

#include <stdio.h> 
main() { 

    int num1, num2; 

    scanf("%d%d", &num1, &num2); 

    printf("I LOVE MY INDIA"); //here is no '\n' 
    printf("%d", num1/num2); 

    return 0; 
} 

對於相同的輸入,因爲這之前表示:

浮點異常(核心轉儲)

在這兩個碼之間僅存在一個差。在第一個\n之後有I LOVE MY INDIA,第二個代碼中沒有\n。 請解釋爲什麼I LOVE MY INDIA沒有顯示在第二個代碼中。

回答

6

默認情況下,標準輸出(stdout)是行緩衝的。

在第一種情況下,在printf()換行符\n使輸出緩衝器到碰撞發生之前被刷新到輸出。所以,你必須看到打印聲明。

OTOH,在第二種情況下,缺少\n會導致緩衝區保存數據,並且下一個語句會導致異常和程序異常終止。所以,緩衝數據沒有機會被刷新到輸出終端。因此,您沒有輸出視覺輸出。

也就是說,零除會引起undefined behavior嚴格地說,不能依賴您的程序來產生任何預期的輸出。

相關問題