C語言坑題

2021-09-24 19:38:48 字數 1896 閱讀 6542

下面的程式會輸出什麼?

#include int main()
參***:

該項程式輸出如下所示,012

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″)

#include int main()  

return 0;

}

參***:該程式在編譯時,可能會出現一條warning: unreachable code at beginning of switch statement。我們以為進入switch後,變數b會被初始化,其實並不然,因為switch-case語句會把變數b的初始化直接就跳過了。所以,程式會輸出乙個隨機的記憶體值。

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

#include int main()  

參***:如果你覺得輸出分別是,10,4,11,那麼你就錯了,錯在了第三個,第乙個是10沒有什麼問題,第二個是4,也沒有什麼問題,因為是32位機上乙個int有4個位元組。但是第三個為什麼輸出的不是11呢?居然還是10?原因是,sizeof不是乙個函式,是乙個操作符,其求i++的型別的size,這是一件可以在程式執行前(編譯時)完全的事情,所以,sizeof(i++)直接就被4給取代了,在執行時也就不會有了i++這個表示式。

下面的輸出是什麼?

#include int main()  

參***:本題並不簡單的是考字首++或反綴++,本題主要考的是&&和||的短路求值的問題。所為短路求值:對於(條件1 && 條件2),如果「條件1」是false,那「條件2」的表示式會被忽略了。對於(條件1 || 條件2),如果「條件1」為true,而「條件2」的表示式則被忽略了。所以,我相信你會知道本題的答案是什麼了。

下面的程式試圖使用「位操作」來完成「乘5」的操作,不過這個程式中有個bug,你知道是什麼嗎?

#include #define printint(expr) printf("%s : %d\n",#expr,(expr))

int fivetimes(int a)

int main()

參***:本題的問題在於函式fivetimes中的表示式「t = a<<2 + a;」,對於a<<2這個位操作,優先順序要比加法要低,所以這個表示式就成了「t = a << (2+a)」,於是我們就得不到我們想要的值。該程式修正如下: [c] int fivetimes(int a)

C語言刷題坑收集1

第一題 注意加黑字型的賓語 int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。每個元素都是指標的陣列 int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。指向有4個整型元素的陣列的指標 int func void 指標函式。無參函式,返回整型指標。函式的返回值...

C語言陣列的坑

定義 型別說明符 陣列名 常量表示式 複製 注意事項 常量表示式的值必須是正整數 陣列的起始元素下標為0 儲存方式同樣從低位址到高位址,並且所有陣列元素都儲存在乙個連續的記憶體單元中,陣列所占用的記憶體大小為陣列元素型別所占用的記憶體大小乘以陣列元素的個數。定義陣列型別 陣列名 n 複製 注意事項 ...

開發的坑 C語言開發100坑

c語言開發的 早關注我的鳥兒,有蟲吃 坑0 是如何變成可執行程式的?源 include int main 預編譯 gcc e hello.c o hello.i編譯 gcc s hello.i o hello.s彙編 gcc c hello.s o hello.o gcc hello.o o hel...