《C Primer Plus(第6版)中文版》 第7章 C控制語句:分支和跳轉
對標題和序號有稍加修改。
7.1 if語句
if語句稱為分支語句(branching statement)或選擇語句(selection statement)。格式:
if (expression)
statement
- expression是關係表示式,為真就執行statement,否則跳過statement。
- statement可以是簡單語句或複合語句。
示例程式:
#include<stdio.h>
int main(void)
{
int a,b;
printf("Please enter two integers:\n" );
scanf("%d %d",&a,&b);
if (a>b)
printf("a is greater than b.\n");
if (a<b)
printf("a is less than b.\n");
if (a==b)
printf("a equals b.\n");
return 0;
}
輸出結果:
Please enter two integers:
5 6
a is less than b.
7.2 if else語句
通用形式:
if (expression)
statement1
else
statement2
expression為真執行statement1,否則執行statement2。示例:
7.2.1 多重選擇 else if
通用形式:
if (expression1)
statement1
else if (expression2)
statement2
else
statement3
如果expression1為真執行statement1,如果expression2為真執行statement2,否則執行statement3。C99要求編譯器至少支援127層巢狀。
7.2.2 if與else匹配
else永遠與最近的if匹配,除非最近的if被{}
,就與最近的有{}
if匹配。
7.2.3 求素數程式
#include<stdio.h>
#include<stdbool.h>
int main(void)
{
int num,i; /*分別儲存待輸入的數以及可能的約數*/
bool isPrime;/*標記變數*/
printf("Please enter an integer(q to quit):\n");
while (scanf("%d",&num)!=0)
{
for (i=2,isPrime=true; (i*i)<=num; i++)
if (num%i==0)
isPrime=false;
if (isPrime)
printf("%d is a prime.\n",num);
else
printf("%d is not a prime.\n",num);
printf("Now enter the next number(q to quit):\n");
}
printf("Done!\n");
return 0;
}
輸出結果:
Please enter an integer(q to quit):
5
5 is a prime.
Now enter the next number(q to quit):
9
9 is not a prime.
Now enter the next number(q to quit):
q
Done!
7.3 getchar()和putchar()
getchar()
無引數,返回輸入佇列中下一個字元。putchar()
列印其引數。
示例程式:
#include<stdio.h>
int main(void)
{
char ch;
while ((ch=getchar())!='#')
putchar(ch);
putchar('\n');
return 0;
}
輸出結果:
adwa125&#
adwa125&
7.3.1 ctype.h的字元函式
ctype.h中的函式接收一個字元為引數。
字元測試函式
函式名 | 如果是下列引數,返回值為真 |
---|---|
isalnum() | 字母或數字 |
isalpha() | 字母 |
isblank() | 標準的空白字元或任何本地化指定為空白的字元 |
iscntrl() | 控制字元,如Ctrl+B |
isdigit() | 數字 |
isgraph() | 除空格之外的任意可列印字元 |
islower() | 小寫字母 |
isprint() | 可列印字元 |
ispunct() | 標點符號(除空格或字母數字以外的任何可列印字元) |
isspace() | 空白字元(空格、換行符、換頁符、回車符、垂直製表符、水平製表符或其他本地化字元) |
isupper() | 大寫字母 |
isxdigit() | 十六進位制數字 |
字元對映函式
此類函式不會修改原始引數。
函式名 | 行為 |
---|---|
tolower() | 如果引數是大寫字元,該函式返回小寫字元;否則,返回原始引數 |
toupper() | 如果引數是小寫字元,該函式返回大寫字元;否則,返回原始引數 |
7.4 邏輯運算子
邏輯運算子兩側表示式均為真,整個表示式才為真。其求值順序都是從左往右,一旦左側表示式求值會讓整個表示式求值無效便停止求值。
邏輯運算子 | 含義 | iso646.h備選拼寫 |
---|---|---|
&& | 與 | and |
|| | 或 | or |
! | 非 | not |
7.5 條件運算子 ?:
條件表示式(conditional expression)用?:
運算子和運算物件組成,?:
是三元運算子。形式:expression1 ? expression2 : expression3
。如果expression1
為真,整個表示式值與expression2
的值相同,否則與expression3
的值相同。
7.6 continue和break
7.6.1 continue語句
3中迴圈都可以使用continue語句。執行到該語句時會跳過本次迭代的剩餘部分,並開始新的迭代。
continue只會影響包含它的迴圈。
while迴圈中continue語句的下一個行為是對錶達式求值,for迴圈中下一個行為是更新變數再對錶達式求值,do while迴圈中對出口條件求值後再進入新的迭代。
7.6.2 break語句
執行break語句後,程式會終止包含它的迴圈並繼續執行之後的語句。break只會影響包含它的迴圈。for迴圈中執行完break語句會跳過更新部分。
7.7 switch語句
通用形式:
switch(expression)
{
case lable1:statement1;break;
case lable2:statement2;break;
...
default:statementN;break;//可選標籤
}
- expression和lable部分必須是整數值。
- 根據expression值跳轉到相應的lable語句。
case
標籤不能用變數。- 沒有與expression值匹配的標籤就執行
default
的語句,沒有default
就執行switch後的語句。 - break語句跳出switch。
7.7.1 多重標籤
示例程式:
#include<stdio.h>
int main(void)
{
switch (getchar())
{
case 'a':
case 'A':printf("a or A\n");break;
case 'b':
case 'B':printf("b or B\n");break;
default:break;
}
return 0;
}
輸出結果:
B
b or B