6.1.1 程序注解
循環的判斷條件:status==1 ==:相等運算符。
scanf()返回成功讀入的項目的個數。如果未讀入整數,則返回0;
循環的標准格式:
get first value to be tested
while the test is successful
process value
get next value
6.1.2 C風格的讀循環
status=scanf("%ld",&num);while(status==1)可以用while(scanf("%ld",&num)==1)來代替。
C的語法特性可以允許你使用精簡版本
while getting and testing the value succeeds
process the value
while循環的一般形式:
while(expression)
statement
statement可以是一個帶有分號的簡單語句,也可以使花括號中的一個復合語句。
6.2.1 終止while循環
while循環是使用入口條件的有條件循環。語句部分的執行要依賴於判斷表達式中的條件。
當您構造一個while循環時,循環中必須包含能改變判斷表達式的值來使表達式的值最終變為假。
只有在計算判斷條件的值時才決定是終止循環還是繼續執行。
假定你想要跳過輸入直到第一個不為空格或數字的字符,可以使用這樣的循環:
while (scanf("%d",&sum)==1)
;
將空語句放在下一行,可以提醒用戶是有意放在那的。
關系運算符:<,<=,==,>=,>,!=。
在浮點數比較中只能使用<和>。原因在於捨入誤差可能造成兩個邏輯上應該相等的數不相等。
使用在math.h頭文件中聲明的fabs()函數可以方便地進行浮點數判斷,她返回一個浮點數的絕對值。
6.3.1 真值的問題
對C來說,一個真表達式的值為1,而一個假表達式的值為0。
更一般地,所有的非零值都被認為是真,只有0被認為是假。
例如while(goats!=)可以用while(goats)代替。
如果進行比較的雙方中有一個是常量,則可以把它放在比較表達式的左邊,這樣有助於發現錯誤。
例如5==canoes;
C99中添加了_Bool類型,一個Bool變量只可以具有值1或0。
6.3.2 關系運算符的優先級
關系運算符的優先級低於算術運算符但高於賦值運算符。
高優先的組:< <= > >=
低優先的組:== !=關系運算符從左到右結合。
第一個表達式進行初始化,它在for循環開始的時候執行一次。它不必初始化一個變量,也可以是某種類型的printf()語句。
第二個表達式是判斷條件,在每次執行循環之前都要對它就行求值。
第三個表達式進行改變,在每次循環結束時進行計算。
x*=3*y+12 等於 x=x*(3*y+12)
首先,它保證被它分開的表達式按從左到右的次序進行計算。
作為順序點的逗號保證左邊字表達的副作用在計算右邊的子表達式之前生效。
再次,逗號也可以用作分隔符,例如聲明語句中。
do
statement
while(expression);
do while循環本身是一個語句,因此它需要一個結束的分號。
該循環至少要被執行一次。而for或者while循環可以一次都不執行。
一個數組就是線性存儲的一系列相同類型的值。
出於執行速度的考慮,C並不檢查您是否使用了正確的下標。
如果字符數組包含了空字符\0,那麼字符數組的內容就構成了一個字符串。
用於標識數組元素的數字稱為下標、索引、或偏移量。
數組中的元素在內存中是順序存儲的。
C99允許您使用常量值指定數組大小,但是C90不允許。你可以使用#define指令創建一個指定數組大小的明顯常量,#define在C90C99情況下都可以使用。
Q1:假定value是一個int類型的值,以下的循環會產生什麼輸出?
for(value=36;value>0;value/=2)
printf("%3d",value);
A1:36 18 9 4 2 1
Q2:如果value是一個double類型的值而不是int類型的值,會有什麼問題?
A2:那麼value變得小於1時判斷條件仍會保持為真。循環會一直執行,直到由於浮點數下溢而產生0值。另為%3d說明符也是不正確的。