3.1 語句與程式塊
在表示式之後加上乙個分號(;),它們就變成了語句。
用一對花括號「」把一組宣告和語句括在一起就構成了程式塊,在語法上等價於單條語句。
3.2 if-else語句
每個else與最近的前乙個沒有else配對的if進行匹配。
if (n > 0)
if (a > b)
z = a;
else
z = b;
程式的縮排結構明確表明了設計意圖,但編譯器無法獲得這一資訊,它會將else部分與內層的if配對。
3.3 else-if語句
/* binsearch: find x in v[0] <= v[1] <= ... <= v[n-1] */
int binsearch(int x, int v, int n)
return -1; }
練習3-1 上面折半查詢的例子中,while迴圈語句內執行了兩次測試。重寫該函式,
使迴圈內部只執行一次測試。比較兩種版本函式的執行時間。 答:
while (low <= high)
if (x == v[mid])
return mid;
else
return -1;
3.4 switch語句
case的作用只是乙個標號,從某個分支中的**執行完後,程式將進入下一分支繼續執行。
跳出switch語句最常用的方法是使用break和return語句。
作為一種良好的程式設計風格,在switch語句最後的default分支後面也加上乙個break語句。
這樣做在邏輯上沒有必要,但當我們需要向該switch語句後新增其他分支時,這樣會降低犯
錯誤的可能性。
練習3-2 編寫乙個函式escape(s, t),將字串t複製到字串s中,並在複製過程中將換行符、
製表符等不可見字元分別轉換為\n、\t等相應可見的轉義字元。再編寫乙個相反功能的函式。 答:
#include
void escape(char s, char t)
}t[j] = '\0';
}void escape2(char s, char t)
else if (s[i+1] == 't')
else
default:
t[j] = s[i++];
break;}}
}main()
3.5 while迴圈與for迴圈
for (表示式1; 表示式2; 表示式3) 語句
等價於=>
表示式1;
while (表示式2)
逗號運算子「,」在for語句中經常用到。被逗號分隔的一對表示式將按照從左到右的順序進行求值,
分隔函式引數的逗號,分隔宣告中變數的逗號等不是逗號運算子,不保證從左至右順序求值。
/* reverse: reverse string s in place */
void reverse(char s)
練習3-3 編寫函式expand(s1, s2),將字串s1中類似於a-z一類的速記符號在字串s2中
擴充套件為等價的完整列表abc...xyz。該函式可以處理大小寫字母和數字,並可以處理a-b-c、
a-z0-9與-a-z等類似的情況。作為前導和尾隨的-字元原樣排印。 答:
#include
void expand(char s1, char s2)
else
}s2[j] = '\0';
}main()
3.6 do-while迴圈
/* itoa: convert n to characters in s */
void itoa(int n, char s)
while ((n /= 10) > 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s); }
這裡使用do-while語句會方便一些,因為即使n為0,也至少要把乙個字元放到陣列s中。
do-while中只有一條語句,(沒有必要)但扔用花括號括起來,因為可以避免將while誤認為
是另個while迴圈的開始。
練習3-4 在數的對二的補碼表示中,上面的itoa函式不能處理最大的負數-2的(字長-1)次方
的情況。解釋其原因,並修改函式使它在任何機器上執行時都能列印出正確的值。 答:
例如char字長為8位,則對二補碼範圍為-128~127。值為-128的char,n=-n;後值仍為-128。
128的二進位制原始碼為01111111,通過補碼的負數轉換規則得到10000000,即-128二進位製碼為80(可用prinf("%hhx);驗證)。
修改函式,不將n轉為正數,而是將每次取模運算的結果轉為正數。從而避開無法將最大負數轉為正數的問題。
#include
#define abs(x) ((x) < 0 ? -(x) : (x))
void itoa(int n, char s)
while ((n /= 10) != 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
//reverse(s);
}main()
練習3-5 編寫函式itob(n, s, b),將整數n轉換為以b為底的數,並將轉換結果以字元的形式
儲存到字串s中。例如,itob(n, s, 16)把整數n格式化為十六進製制整數儲存在s中。 答:
#include
#include "reverse.c"
#define abs(x) (x) < 0 ? -(x) : (x)
void itob(int n, char s, int b)
while ((n /= b) != 0);
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}main()
練習 3-6 修改itoa函式,使得該函式可以接收三個引數。第三個引數為最小字段寬度。
為了保證轉換後結果至少具有第三個引數指定的最小寬度,必要時在結果左邊填充一定的空格。 答:
...if (sign < 0)
s[i++] = '-';
while (i <= w-1) // fill space
s[i++] = ' ';
...
3.7 break和continue語句
3.8 goto語句與標號
C 語言程式設計 第三章
函式呼叫 呼叫函式前要宣告函式原型 型別識別符號 被呼叫函式名 含型別說明的形參表 呼叫形式 函式名 實參列表 函式的遞迴呼叫 函式直接或間接呼叫自身 函式的引數傳遞 1.在函式被呼叫時才分配形參的儲存單元 2.實參可以是常量 變數或表示式 3.實參型別必須與形參相符 如果不相符,編譯器會先進行型別...
C語言程式設計(第三章例題)
例3.1 把用華氏法表示的溫度 如64 f 轉換成用攝氏法表示的溫度。編寫 includeint main 執行結果 例3.2 計算存款利息。有1000元,想存一年。有三種方法可選 1 活期,年利率為r1。2 一年期定期,年利率為r2。3 存兩次半年定期存款,年利率為r3。請分別計算出一年後按三種方...
C語言第三章
main.c project1 created by sihan guo on 2019 06 13.include int main int argc,const char ar else 迴圈結構 當型 int icount 5 while icount 0 直到型迴圈結構 這個迴圈結構至少執行...