計劃:爲什麼這個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是從哪裏來的。有人可以解釋輸出嗎?
計劃:爲什麼這個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是從哪裏來的。有人可以解釋輸出嗎?
如果應用二進制AND
到3
和3
(這兩者都是嵌套printf
調用的返回值),你得到3
作爲結果。
注意,代碼實際上包含未定義的行爲,因爲嵌套調用的順序沒有定義。
你的意思是*未指定的行爲*而不是*未定義的行爲*? – ouah 2012-07-29 16:48:54
@ouah說實話,我懶得去查。 – 2012-07-29 16:50:17
我認爲這是沒有說明的。 「非特定行爲的一個例子就是函數參數的評估順序。」我非常確定操作符就像這方面的函數。 – 2012-07-29 17:30:11
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
。
爲什麼printf(「%d%d」,5,5)返回3? – 2012-07-29 16:42:46
@AshwinSingh因爲那是'printf'返回的內容。打印字符的數量。 – 2012-07-29 16:43:35
3是由兩個printf的返回值的Bitwise AND。
printf的返回打印的字符數。 你的情況,printf("%d %d",5,5)
已打印的三個字符是兩個5和一個空間,同樣printf("%d %d",7,7)
也打印2 7和一個空間。因此,這兩種的printf將返回3.
因此,3是3 & 3
的結果,你可以在這裏看到: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
問候。
這種類型的代碼是什麼給℃的壞名聲...... – 2012-07-29 16:42:08
要知道,'7 75 53'將是一個有效的成果,也爲'&'沒有sqeuence點(CF HTTP://計算器。 COM /問題/ 4176328 /未定義行爲和序列點)。 – kay 2012-07-29 17:54:52