C易錯知識點

2021-06-21 01:49:27 字數 2282 閱讀 6240

參考酷客網,對其進行了簡單整理

1

、下面的程式並不見得會輸出

hello-std-out

,你知道為什麼嗎?

#include

#include

intmain() 

return 0;

} 參***

stdout

和stderr

是不是同裝置描述符。

stdout

是塊裝置,

stderr

則不是。對於塊裝置,只有當下面幾種情況下才會被輸入,

1)遇到回車,

2)緩衝區滿,3)

flush

被呼叫。而

stderr

則不會。

2

、下面,我們再來看乙個交叉編譯的事情,下面的兩個檔案可以編譯通過嗎?如果可以通過,結果是什麼?

file1.c

int arr[80];

file2.c

externint *arr;

intmain() 

參***:該程式可以編譯通過,但執行時會出錯。為什麼呢?原因是,在另乙個檔案中用

extern int *arr

來外部宣告乙個陣列並不能得到實際的期望值,因為他們的型別並不匹配。所以導致指標實際並沒有指向那個陣列。注意:乙個指向陣列的指標,並不等於乙個陣列。修改:

extern int arr

。(參考:

iso c

語言6.5.4.2 節)

3

、請說出下面的程式輸出是多少?並解釋為什麼?(注意,該程式並不會輸出

「b is 20″)

#include

intmain() 

return 0;

} 參***:該程式在編譯時,可能會出現一條

warning: unreachable code at beginning ofswitch statement

。我們以為進入

switch

後,變數

b會被初始化,其實並不然,因為

switch-case

語句會把變數

b的初始化直接就跳過了。所以,程式會輸出乙個隨機的記憶體值。

4

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

#include

intmain() 

參***:如果你覺得輸出分別是,10,

4,11,那麼你就錯了,錯在了第三個,第乙個是

10沒有什麼問題,第二個是

4,也沒有什麼問題,因為是

32位機上乙個

int有

4個位元組。但是第三個為什麼輸出的不是

11呢?居然還是

10?原因是,

sizeof

不是乙個函式,是乙個操作符,其求

i++的型別的

size

,這是一件可以在程式執行前(編譯時)完全的事情,所以,

sizeof(i++)

直接就被

4給取代了,在執行時也就不會有了

i++這個表示式。

5.請問下面的程式輸出是什麼?(絕對不是

10)

#include

#defineprintint(expr) printf("%s : %dn",#expr,(expr))

intmain() 

參***:本題輸出的是

100。為什麼呢?問題就出在

y = y/*p;

上了,我們本來想的是

y / (*p) 

,然而,我們沒有加入空格和括號,結果

y/*p

中的/*

被解釋成了注釋的開始。於是,這也是整個惡夢的開始。

6.

請問下面的程式輸出什麼?(假設:輸入

hello, world)

#include

intmain() 

參***:本例的輸出是

「hello, wo」

,scanf

中的」%[^r]「

是從中作梗的東西。意思是遇到字元

r就結束了。

C 易錯知識點歸納

物件導向開發的四大特性 三字元組 內建型別所佔記憶體大小 單位 位元組 typedef 為乙個已知型別取新名字 列舉 派生資料型別,只有賦值運算子沒有定義算術運算 變數命名 字母 下劃線開頭,可以有數字,不能有標點符號。大小寫敏感。變數宣告 未開闢空間。extern實現,若在其後賦初始值便為定義。變...

Java 易錯知識點

1 以下程式執行的結果是 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 classx classy publicclasszextendsx publicstaticvoidmain string args zyxx zyxy yxyz xyz...

jsp易錯知識點

1.http請求包括 方法 uri 協議 版本,請求頭,請求正文 http應答包括 協議 狀態 描述,應答頭,應答正文 2.jsp常用三種指令 page指令 page 定義網頁依賴屬性 taglib指令 taglib 引入標籤庫 include指令 include 包含其他檔案 3.九大內建物件 4...