1. 程式人生 > 其它 >《C Primer Plus(第6版)中文版》 第7章 C控制語句:分支和跳轉

《C Primer Plus(第6版)中文版》 第7章 C控制語句:分支和跳轉

技術標籤:C/C++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;breakcase lable2:statement2;break...
	default:statementN;break//可選標籤
}
  • expressionlable部分必須是整數值。
  • 根據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