《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;//可选标签
}
  • 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
上一篇:第三次作业-介绍一款原型设计工具


下一篇:uvm_primer笔记ch2