一、if语句
if语句的通用形式:
if(expression)
statement
1) if语句被称为分支语句或选择语句,相当于一个交叉点,程序要在两条分支中选择一条执行
2) 如果对expression求值为真(非0),则执行statement;否则,跳过statement
3) 如果满足条件可执行的话,if语句只能测试和执行一次,而while语句可以测试和执行多次
4) expression是关系表达式,即比较两个量的大小
二、if else语句
if else语句的通用格式:
if(expression)
statement
else
statement
1) 如果expression为真(非0),则执行statement;如果expression为假或0,则执行else后面的statement
2) 在if和else之间只允许有一条语句(简单语句或复合语句)
3) if语句用于选择是否执行一个行为,而if else语句用于在两个行为之间的选择
三、getchar()和putchar()
getchar()函数不带任何参数,它从输入队列中返回下一个字符。putchar()函数打印它的参数。
举例: ch = getchar(); //等同于scanf("%c",&ch);
putchar(ch); //等同于printf("%c",ch);
举例: 如果字符是空白,原样打印;否则,打印原字符在ASCII序列中的下一个字符
#include<stdio.h>
int main()
{
char ch;
ch = getchar();
while (ch != '\n')
{
if (ch == ' ')
putchar(ch);
else
putchar(ch + 1);
ch = getchar();
}
putchar(ch);
return 0;
}
四、ctype.h系列的字符函数
1) C有一系列专门处理字符的函数,ctype.h头文件包含了这些函数的原型
2) 这些函数接收一个字符作为参数,如果该字符属于某特殊类别,就返回一个非零值(真);否则返回0(假)
3) 例如isalpha()函数的参数是一个字母,则返回一个非零值
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch;
while((ch = getchar())!='\n')
{
if(isalpha(ch))
putchar(ch+1);
else
putchar(ch);
}
putchar(ch);
reutrn 0;
}
函数名 | 如果是下列参数时,返回值为真 |
---|---|
isalnum() | 字母数字(字母或数字) |
isalpha() | 字母 |
isblank() | 标准的空白字符(空格、水平制表符或换行符)或任何其他本地化指定为空白的字符 |
isdigit() | 数字 |
iscntrl() | 控制字符,如Ctrl+B |
isgraph() | 除空格之外的任意可打印字符 |
islower() | 小写字母 |
isprint() | 可打印字符 |
ispunct() | 标点符号(除空格或字母数字字符以外的任何可打印字符) |
isspace() | 空白字符(空格、换行符、换页符、回车符、垂直制表符、水平制表符或其他本地化定义的字符) |
isupper() | 大写字母 |
isxdigit() | 十六进制数字符 |
函数名 | 行为 |
---|---|
tolower() | 如果参数是大写字符,该函数返回小写字符;否则,返回原始参数 |
toupper() | 如果参数是小写字符,该函数返回大写字符;否则,返回原始参数 |
五、多重选择: else if
if...else if...else序列是嵌套if的一种形式,从一系列选项中选择一个执行
举例: 提供多种选择
if(score>=90)
printf("'A'\n");
else if(score>=75&&score<90)
printf("'B'\n");
else if(score>=605&&score<75)
printf("'C'\n");
else
printf("'D'\n");
注意: 如果没有花括号,else与离它最近的if匹配,除非最近的if被花括号括起来
举例: if(条件) if(条件)
语句 {
if(条件) 语句
语句 if(条件)
else 语句
语句 }
else与最近的if匹配 else
语句
else与内含if语句的第一个if语句匹配
六、嵌套if语句的简单示例
举例: 素数问题
#include<stdio.h>
#include<stdbool.h>
int main()
{
long num;
long x;
_Bool flag;
printf("请输入一个数: ");
while (scanf("%ld",&num)==1)
{
for (x = 2, flag = true; (x*x) <= num; x++)
{
if (num%x == 0)
{
if (x*x != num)
printf("%ld 的约数为: %ld和%ld\n", num, x, num / x);
else
printf("%ld 的约数为: %ld\n", num, x);
flag = false;
}
}
if (flag)
{
printf("%ld 是一个素数\n", num);
}
printf("请输入一个数: ");
}
printf("程序退出!\n");
return 0;
}
七、逻辑运算符
逻辑运算符 | 含义 |
---|---|
&& | 与(有假则为假,都真则为真) |
|| | 或(有真则为真,都假则为假) |
! | 非 |
注: 1) !运算符的优先级很高,比乘法运算符还高,与递增运算符的优先级相同,只比圆括号的优先级低
2) &&运算符的优先级比||运算符高,但是两者的优先级都比关系运算符低,比赋值运算符高
3) C保证逻辑表达式的求值顺序是从左往右,一旦发现某个元素让整个表达式无效,便立即停止求值
举例: if(number != 0 && 12/number == 2)
说明: 如果number的值是0,那么第一个子表达式为假,且不再对关系表达式求值(避免把0作为除数)
4) 逻辑运算符的运算对象通常是关系表达式
!运算符只需要一个运算对象,其他两个逻辑运算符都需要两个运算对象
八、条件运算符: ?:
条件表达式的通用形式如下:
expression1?expression2:expression3;
说明: 1) 如果expression1为真(非0),那么整个条件表达式的值与expression2的值相同
2) 如果expression1为假(0),那么整个条件表达式的值与expression3的值相同
3) 条件运算符需要3个运算对象,每个运算对象都是一个表达式
C提供条件表达式作为表达if else语句的一种便捷方式,该表达式使用?:条件运算符
举例: 求一个数的绝对值
x = (y<0)?-y:y; //如果y<0,那么x=-y;否则,x = y;
举例: 计算刷给定平方英尺的面积需要多少灌油漆
#include<stdio.h>
#define COVERAGE 350 //每罐油漆可刷的面积
int main()
{
int area;
int sum;
printf("请输入需要刷的面积: ");
while (scanf("%d", &area) == 1)
{
sum = area / COVERAGE;
sum += (area%COVERAGE == 0) ? 0 : 1;
printf("%d 平方英尺需要 %d 灌油漆\n", area, sum);
printf("请输入需要刷的面积: ");
}
printf("正确退出!\n");
return 0;
}
九、continue语句和break语句
1.continue语句
1) 三种循环都可以使用continue语句
2) 执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代
3) 如果continue语句在嵌套循环内,则只会影响包含该语句的内层循环
4) 对于while和do while循环,执行continue语句后的下一个行为是对循环的测试表达式求值
count = 0;
while(count<10)
{
ch = getchar();
if(ch == '\n')
continue;
putchar(ch);
count++;
}
说明: 循环读取10个字符,当ch是换行符时,跳过打印及计数行为,开始进行下一次循环测试
5) 对于for循环,执行continue后的下一个行为是对更新表达式求值,然后对循环测试表达式求值
for(count = 0;count<10;count++)
{
ch = getchar();
if(ch == '\n')
continue;
putchar(ch);
}
说明: 执行完continue后,首先递增count,然后将递增后的值和10作比较
2.break语句
1) 程序执行到循环中的break语句时,会终止包含它的循环,跳过测试更新部分,直接执行下一阶段
2) 如果break语句位于嵌套循环内,它只会影响包含它的当前循环
举例: 计算矩形面积,输入非数字使用break终止循环
float length, width;
printf("请输入矩形的长: ");
while (scanf("%f", &length) == 1)
{
printf("矩形的长为: %.2f\n", length);
printf("请输入矩形的宽: ");
if (scanf("%f", &width) != 1)
break;
printf("矩形的宽为: %.2f\n", width);
printf("矩形的面积为: %.2f\n", length*width);
printf("请输入矩形的长: ");
}
printf("正确退出!\n");
十、多重选择: switch和break
switch的构造如下:
switch(整型表达式)
{
case 常量1:
语句
case 常量2:
语句
default:
语句
}
说明: 1) 先对紧跟在关键字switch后圆括号中的表达式求值
2) 然后程序扫描标签,发现匹配值,然后程序跳转该语句
3) 如果没有匹配值:有default则跳转该行,无default则继续执行switch后面的语句
4) break语句让程序离开switch语句,跳转至switch语句的下一条语句
5) 如果没有break语句,程序就会从case1开始执行到switch语句末尾
6) switch在圆括号中的测试表达式的值应该是一个整数值(包括char类型)
7) case标签必须是整数类型(包括char类型)的常量或整型常量表达式,不能为变量
十一、goto语句(通常不需要)
goto语句有两部分:goto和标签名,标签的命名遵循变量命名规则
举例: goto _next;
_next:printf("Hello world!");