有段事件沒有寫c程式了,有些地方有些生疏了。這兩天事情比較少,準備再系統的看一邊c的基礎知識。這裡再總結一下平時沒太注意的知識要點。1、c語言的語句塊在c語言中,任何允許出現語句的地方既可以是由;號結尾的一條語句,也可以是由{}括起來的若干條語句或宣告組成的語句塊(statement block),語句塊和上一章介紹的函式體的語法相同。注意語句塊的}後面不需要加;號。如果}後面加了;號,則這個;號本身又是一條新的語句了,在c語言中乙個單獨的;號表示一條空語句(null statement)。
6int main(
void)7
;//這裡相當於兩個空語句了
1011
int i=0;
1217
printf
("i=%d\n"
, i)
;//can't access j here
22return0;
23}
2、取模運算%
c99規定,如果a
和b
是整型,b
不等於0,則表示式(a/b)*b+a%b
的值總是等於a。
結合整數除法運算要truncate toward zero,可以得到乙個結論:%運算子的結果總是與被除數同號(想一想為什麼)。其它程式語言對取模運算的規定各不相同,也有規定結果和除數同號的,也有不做明確規定的。
寫乙個函式,引數是整型變數x,功能是列印x的個位和十位:
25void quwei(
int x)
26
3、float和double型別
7int main()8
問題發現:當x定義為double型別時,上面程式錯誤,x讀取的值有誤。但是編譯時需要加上-wall選項才能發現原來是型別不匹配。
如何讀取double型別變數?
4、結構體的初始化
5int main()6
;1314double x =
2.0;
15//初始化複數
16struct temp z1 =
; z1.img=3.0
17struct temp z2 =
; z2.img=0.0
18struct temp z3 =
; z3.img=0.0
1920
return0;
21}
注意:z1
必須是區域性變數才能用另乙個變數x
的值來初始化它的成員,如果是全域性變數就只能用常量表示式來初始化。這也是c99的新特性,c89只允許在{}中使用常量表示式來初始化,無論是初始化全域性變數還是區域性變數。
{}這種語法不能用於結構體的賦值,例如這樣是錯誤的:
20struct temp z1;
21 z1 =
;
以前我們初始化基本型別的變數所使用的initializer都是表示式,表示式當然也可以用來賦值,但現在這種由{}括起來的initializer並不是表示式,所以不能用來賦值。
有些時候結構體或陣列中只有某乙個或某幾個成員需要初始化,其它成員都用0初始化即可,用designated initializer語法可以針對每個成員做初始化(memberwise initialization),很方便。designated initializer是c99引入的新特性,用於初始化稀疏(sparse)結構體和稀疏陣列很方便。例如:
struct temp z1 =;
結構體變數之間使用賦值運算子是允許的,用乙個結構體變數初始化另乙個結構體變數也是允許的,例如:
struct complex_struct z1 =;struct complex_struct z2 = z1; z1 = z2;
同樣地,z2
必須是區域性變數才能用變數z1
的值來初始化。既然結構體變數之間可以相互賦值和初始化,也就可以當作函式的引數和返回值來傳遞。
struct temp add_complex(struct temp z1,
struct temp z2)
由.運算子組成的表示式能不能做左值取決於.運算子左邊的表示式能不能做左值。在上面的例子中,z
是乙個變數,可以做左值,因此表示式z.x
也可以做左值,但表示式add_complex(z, z).x
只能做右值而不能做左值,因為表示式add_complex(z, z)
不能做左值。
5、列舉
4int main()5
;7int red =1;
8printf
("%d\t%d\n"
,red, yellow);9
10return0;
11}
結構體的成員名和變數名不在同一命名空間中,但列舉的成員名卻和變數名在同一命名空間中,所以會出現命名衝突。以上**是不合法的:
本文參考《linux c程式設計 一站式學習》
C語言知識點總結
以下內容為本人對c語言中經常忘記但是又重要的知識點的總結。i,i 在使用i之前,先使i的值加 減 1 i i 在使用i之後,使i的值加 減 1 continue 結束本次迴圈語句 break 中止執行switch或迴圈語句 if語句常用的三種形式 while迴圈,for迴圈,do while迴圈都可...
C語言知識點小總結
定義和宣告的最大區別在於 定義建立了變數 物件 並為這個物件分配了記憶體。宣告 只是告訴編譯器這個變數名被提前預定了 register要求編譯器盡可能的將變數放在cpu內部暫存器中,而不會是通過記憶體定址訪問以提高效率。break可以跳出所有迴圈 do while while for 迴圈語句的主要...
C語言return知識點總結
return break和continue 這三個關鍵字有乙個共同點,那就是讀能讓後面的語句不執行,不同的地方就是挑的距離不一樣。return很強大,如果乙個函式中有程式設計客棧乙個return,並且執行了,那麼這個函式就完了。return 表示從被調函式返回到主調函式繼續執行,返回時可附帶乙個返回...