2012-07-29 97 views
0

計劃:爲什麼這個C程序的輸出?

int main() 
    { 
    printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7)); 
    return 0; 
    } 

輸出:

5 57 73 

我是新來的C,我能猜出其中的5 57 7而來,但不知道其中3是從哪裏來的。有人可以解釋輸出嗎?

+0

這種類型的代碼是什麼給℃的壞名聲...... – 2012-07-29 16:42:08

+1

要知道,'7 75 53'將是一個有效的成果,也爲'&'沒有sqeuence點(CF HTTP://計算器。 COM /問題/ 4176328 /未定義行爲和序列點)。 – kay 2012-07-29 17:54:52

回答

7

如果應用二進制AND33(這兩者都是嵌套printf調用的返回值),你得到3作爲結果。

注意,代碼實際上包含未定義的行爲,因爲嵌套調用的順序沒有定義。

+2

你的意思是*未指定的行爲*而不是*未定義的行爲*? – ouah 2012-07-29 16:48:54

+0

@ouah說實話,我懶得去查。 – 2012-07-29 16:50:17

+1

我認爲這是沒有說明的。 「非特定行爲的一個例子就是函數參數的評估順序。」我非常確定操作符就像這方面的函數。 – 2012-07-29 17:30:11

6

printf該函數的返回值是發送的字符數,或負的值,如果有一個誤差。

printf("%d %d",5,5)回報3如果沒有錯誤

printf("%d %d",7,7)也返回3如果沒有錯誤

所以printf("%d %d",5,5) & printf("%d %d",7,7)3 & 3被評估爲3

+0

爲什麼printf(「%d%d」,5,5)返回3? – 2012-07-29 16:42:46

+1

@AshwinSingh因爲那是'printf'返回的內容。打印字符的數量。 – 2012-07-29 16:43:35

2

3是由兩個printf的返回值的Bitwise AND

printf的返回打印的字符數。 你的情況,printf("%d %d",5,5)已打印的三個字符是兩個5和一個空間,同樣printf("%d %d",7,7)也打印2 7和一個空間。因此,這兩種的printf將返回3.

因此,3是3 & 3

0

的結果,你可以在這裏看到:http://en.wikipedia.org/wiki/Printf_format_string,printf的返回打印的字符數,因此:

printf("%d",printf("%d %d",5,5)&printf("%d %d",7,7)); 

由的:

printf("%d %d",5,5) return 3 (5 space and 5) and print 5 5 

printf("%d %d",7,7) return 3 (7 space and 7) and print 7 7 

在這個階段,我們得到:5 57 7

而且3 & 3 = 3,最後你得到這樣的輸出:

5 57 73 

問候。

相關問題