C primer plus 学习笔记_第七章 C控制语句:分支和跳转

第7章 C控制语句:分支和跳转

关键字:if、else、switch、continue、break、case、default、goto
运算符:&&、||、?:
函数:getchar()、putchar()、ctype.h系列
如何使用if和if else语句,如何嵌套它们
在更复杂的测试表达式中用逻辑运算符组合关系表达式
C的条件运算符
switch语句
break、continue和goto语句
使用C的字符I/O函数:getchar()和putchar()
ctype.h头文件提供的字符分析函数系列
————————————————————————————————————————————————————————————

7.1 if语句

// colddays.c -- 找出0℃以下的天数占总天数的百分比
#include <stdio.h>
int main(void)
{
const int FREEZING = 0;
float temperature;
int cold_days = 0;
int all_days = 0;
printf("Enter the list of daily low temperatures.\n");
printf("Use Celsius, and enter q to quit.\n");
while (scanf("%f", &temperature) == 1)
{
all_days++;
if (temperature < FREEZING)
cold_days++;
}
if (all_days != 0)
printf("%d days total: %.1f%% were below freezing.\n",
all_days, 100.0 * (float) cold_days / all_days);
if (all_days == 0)
printf("No data entered!\n");
return 0;
}

if语句被称为分支语句(branching statement)选择语句(selection statement),因为它相当于一个交叉点,程序要在两条分支中选择一条执行。

if语句的通用形式如下:

if ( expression )
statement

如果对expression求值为真(非0),则执行statement;否则,跳过statement。与while循环一样,statement可以是一条简单语句或复合语句。if语句的结构和while语句很相似,它们的主要区别是:如果满足条件可执行的话,if语句只能测试和执行一次,而while语句可以测试和执行多次。
————————————————————————————————————————————————————————————

7.2 if else语句

if else语句的通用形式是:

if ( expression )
statement1
else
statement2

如果expression为真(非0),则执行statement1;如果expression为假或0,则执行else后面的statement2。

如果要在if和else之间执行多条语句,必须用花括号把这些语句括起来成为一个块。

if语句用于选择是否执行一个行为,而if else语句用于在两个行为之间选择。
if语句和if else语句

7.2.1 另一个示例:介绍getchar()和putchar()

getchar()函数不带任何参数,它从输入队列中返回下一个字符。例如,下面的语句读取下一个字符输入,并把该字符的值赋给变量ch:

ch = getchar();

该语句与下面的语句效果相同:

scanf("%c", &ch);

putchar()函数打印它的参数。例如,下面的语句把之前赋给ch的值作为字符打印出来:

putchar(ch);

该语句与下面的语句效果相同:

printf("%c", ch);

由于这些函数只处理字符,所以它们比更通用的scanf()和printf()函数更快、更简洁。

接下来,我们编写一个程序来说明这两个函数是如何工作的。该程序把一行输入重新打印出来,但是每个非空格都被替换成原字符在ASCII序列中的下一个字符,空格不变。这一过程可描述为“如果字符是空白,原样打印;否则,打印原字符在ASCII序列中的下一个字符”。

// cypher1.c -- 更改输入,空格不变
#include <stdio.h>
#define SPACE ' ' // SPACE表示单引号-空格-单引号
int main(void)
{
char ch;
ch = getchar(); // 读取一个字符
while (ch != '\n') // 当一行未结束时
{
if (ch == SPACE) // 留下空格
putchar(ch); // 该字符不变
else
putchar(ch + 1); // 改变其他字符
ch = getchar(); // 获取下一个字符
}
putchar(ch); // 打印换行符
return 0;
}

7.2.2 ctype.h系列的字符函数

C 有一系列专门处理字符的函数,ctype.h头文件包含了这些函数的原型。这些函数接受一个字符作为参数,如果该字符属于某特殊的类别,就返回一个非零值(真);否则,返回0(假)。例如,如果isalpha()函数的参数是一个字母,则返回一个非零值。

// cypher2.c -- 替换输入的字母,非字母字符保持不变
#include <stdio.h>
#include <ctype.h> // 包含isalpha()的函数原型
int main(void)
{
char ch;
while ((ch = getchar()) != '\n')
{
if (isalpha(ch)) // 如果是一个字符,
putchar(ch + 1); // 显示该字符的下一个字符
else // 否则,
putchar(ch); // 原样显示
}
putchar(ch); // 显示换行符
return 0;
}

字符测试函数
字符映射函数
注意,字符映射函数不会修改原始的参数,这些函数只会返回已修改的值。也就是说,下面的语句不改变ch的值:

tolower(ch); // 不影响ch的值

这样做才会改变ch的值:

ch = tolower(ch); // 把ch转换成小写字母

7.2.3 多重选择else if

现实生活中我们经常有多种选择。在程序中也可以用else if扩展if else结构模拟这种情况。

// electric.c -- 计算电费
#include <stdio.h>
#define RATE1 0.13230 // 首次使用 360 kwh 的费率
#define RATE2 0.15040 // 接着再使用 108 kwh 的费率
#define RATE3 0.30025 // 接着再使用 252 kwh 的费率
#define RATE4 0.34025 // 使用超过 720kwh 的费率
#define BREAK1 360.0 // 费率的第1个分界点
#define BREAK2 468.0 // 费率的第2个分界点
#define BREAK3 720.0 // 费率的第3个分界点
#define BASE1 (RATE1 * BREAK1)
// 使用360kwh的费用
#define BASE2 (BASE1 + (RATE2 * (BREAK2 - BREAK1)))
// 使用468kwh的费用
#define BASE3 (BASE1 + BASE2 + (RATE3 *(BREAK3 - BREAK2)))
// 使用720kwh的费用
int main(void)
{
double kwh; // 使用的千瓦时
double bill; // 电费
printf("Please enter the kwh used.\n");
scanf("%lf", &kwh); // %lf对应double类型
if (kwh <= BREAK1)
bill = RATE1 * kwh;
else if (kwh <= BREAK2) // 360~468 kwh
bill = BASE1 + (RATE2 * (kwh - BREAK1));
else if (kwh <= BREAK3) // 468~720 kwh
bill = BASE2 + (RATE3 * (kwh - BREAK2));
else // 超过 720 kwh
bill = BASE3 + (RATE4 * (kwh - BREAK3));
printf("The charge for %.1f kwh is $%1.2f.\n", kwh, bill);
return 0;
}

实际上,else if 是已学过的 if else 语句的变式,即由一个if else中的else部分包含又一个if。

7.2.4 else与if配对

规则是,如果没有花括号,else与离它最近的if匹配,除非最近的if被花括号括起来。
 if else匹配的规则

7.2.5 多层嵌套的if语句

if…else序列是嵌套if的一种形式,从一系列选项中选择一个执行。有时,选择一个特定选项后又引出其他选择,这种情况可以使用另一种嵌套 if。

从技术角度看,if else语句作为一条单独的语句,不必使用花括号。外层if也是一条单独的语句,也不必使用花括号。但是,当语句太长时,使用花括号能提高代码的可读性,而且还可防止今后在if循环中添加其他语句时忘记加花括号。

// divisors.c -- 使用嵌套if语句显示一个数的约数
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
unsigned long num; // 待测试的数
unsigned long div; // 可能的约数
bool isPrime; // 素数标记
printf("Please enter an integer for analysis; ");
printf("Enter q to quit.\n");
while (scanf("%lu", &num) == 1)
{
for (div = 2, isPrime = true; (div * div) <= num; div++)
{
if (num % div == 0)
{
if ((div * div) != num)
printf("%lu is divisible by %lu and %lu.\n",
num, div, num / div);
else
printf("%lu is divisible by %lu.\n",
num, div);
isPrime = false; // 该数不是素数
}
}
if (isPrime)
printf("%lu is prime.\n", num);
printf("Please enter another integer for analysis; ");
printf("Enter q to quit.\n");
}
printf("Bye.\n");
return 0;
}

小结:用if语句进行选择
关键字:if、else

一般注解:
下面各形式中,statement可以是一条简单语句或复合语句。表达式为真,说明其值是非零值。
形式1:

if (expression)
statement

如果expression为真,则执行statement部分。

形式2:

if (expression)
statement1
else
statement2

如果expression为真,执行statement1部分;否则,执行statement2部分。

形式3:

if (expression1)
statement1
else if (expression2)
statement2
else
statement3

如果expression1为真,执行statement1部分;如果expression2为真,执行
statement2部分;否则,执行statement3部分。
————————————————————————————————————————————————————————————

7.3 逻辑运算符

// chcount.c -- 使用逻辑与运算符
#include <stdio.h>
#define PERIOD '.'
int main(void)
{
char ch;
int charcount = 0;
while ((ch = getchar()) != PERIOD)
{
if (ch != '"' && ch != '\'')
charcount++;
}
printf("There are %d non-quote characters.\n", charcount);
return 0;
}

逻辑运算符的优先级比关系运算符低,所以不必在子表达式两侧加圆括号。

C有3种逻辑运算符。
3种逻辑运算符
假设exp1和exp2是两个简单的关系表达式(如car > rat或debt ==1000),那么:
当且仅当exp1和exp2都为真时,exp1 && exp2才为真;
如果exp1或exp2为真,则exp1 || exp2为真;
如果exp1为假,则!exp1为真;如果exp1为真,则!exp1为假。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值