天天看點

看了這10道C語言謎題,你還敢說你精通C語言嗎

解了這10道C語言謎題,你還敢說你精通C語言嗎

1

2

3

4

5

6

7

8

9

10

本文展示了10個C語言的迷題以及答案,而且有相當的一些例子可能是我們日常工作可能會見得到的。通過這些迷題,希望你能更了解C語言。

如果你不看答案,不知道是否有把握回答各個謎題?讓我們來試試。

下面的程式并不見得會輸出"hello-std-out",你知道為什麼嗎?

參考答案

stdout和stderr是不同裝置描述符。stdout是塊裝置,stderr則不是。對于塊裝置,隻有當下面幾種情況下才會被輸入:遇到回車;緩沖區滿;flush被調用。而stderr則不會。

下面的程式看起來是正常的,使用了一個逗号表達式來做初始化。可惜這段程式是有問題的。你知道為什麼嗎?

這個程式會得到編譯出錯(文法出錯)。逗号表達式是沒錯,可是在初始化和變量聲明時,逗号并不是逗号表達式的意義。這點要區分,要修改上面這個程式,你需要加上括号:“int a = (1,2);”。

下面的程式會有什麼樣的輸出呢?

程式會輸出4321,你知道為什麼嗎?要知道為什麼,你需要知道printf的傳回值是什麼。printf傳回值是輸出的字元個數。

下面的程式會輸出什麼?

該項程式輸出:“0 12 1095237632”。

原因是:浮點數是4個位元組,12.5f轉成二進制是:01000001010010000000000000000000,十六進制是:0x41480000,十進制是:1095237632。是以,第二和第三個輸出相信大家也知道是為什麼了。

而對于第一個,為什麼會輸出0,我們需要了解一下float和double的記憶體布局,如下:

• float: 1位符号位(s)、8位指數(e),23位尾數(m,共32位)。

• double: 1位符号位(s)、11位指數(e),52位尾數(m,共64位)。

然後,我們還需要了解一下printf由于類型不比對,是以,會把float直接轉成double,注意,12.5的float和double的記憶體二進制完全不一樣。别忘了在x86晶片下使用是的反位元組序,高位位元組和低位字位要反過來。是以:

• float版:0x41480000 (在記憶體中是:00 00 48 41)。

• double版:0x4029000000000000 (在記憶體中是:00 00 00 00 00 00 29 40)。

而我們的%d要求是一個4位元組的int,對于double的記憶體布局,我們可以看到前四個位元組是00,是以輸出自然是0了。這個示例向我們說明printf并不是類型安全的,這就是為什麼C++要引如cout的原因了。

請說出下面的程式輸出是多少?并解釋為什麼?(注意,該程式并不會輸出"b is 20")

該程式在編譯時,報錯:“b”的初始化操作由“case”标簽跳過,“default”标簽跳過“b”的初始化操作

請問下面的程式會有什麼潛在的危險

本題很簡單了。這個程式的潛在問題是,如果使用者輸入了超過80個長度的字元,那麼就會有數組越界的問題了,你的程式很有可能會crash了。

請問下面的程式輸出什麼?

如果你覺得輸出分别是:10,4,11。那麼你就錯了。

錯在了第三個,第一個是10沒有什麼問題,第二個是4,也沒有什麼問題,因為是32位機上一個int有4個位元組。但是第三個為什麼輸出的不是11呢?居然還是10?原因是,sizeof不是一個函數,是一個操作符,其求i++的類型的size,這是一件可以在程式運作前(編譯時)完全的事情,是以,sizeof(i++)直接就被4給取代了,在運作時也就不會有了i++這個表達式。

請問下面的程式的輸出值是什麼?

如果你對于PrintInt這個宏有問題的話,可以去看一看資料。不過,本例的問題不在這裡,本例的輸出會是:1,8,64,1000。其實很簡單了,在C/C++中,以0開頭的數字都是八進制的。

下面的輸出是什麼?

本題并不簡單的是考字首++或反綴++,本題主要考的是&&和||的短路求值的問題。

所謂短路求值:對于(條件1 && 條件2),如果“條件1”是false,那“條件2”的表達式會被忽略了。對于(條件1 || 條件2),如果“條件1”為true,而“條件2”的表達式則被忽略了。

<code>是以,我相信你會知道本題的答案是什麼了。</code>

下面的C程式是合法的嗎?如果是,那麼輸出是什麼?

本例是合法的,輸出為:“Hello! how is this? super That is C !”

本例主要展示了一種另類的用法。下面的兩種用法是相同的:

“hello”[2]

2[“hello”]

如果你知道:a[i] 其實就是 *(a+i)也就是 *(i+a),是以如果寫成 i[a] 應該也不難了解了。

c