C Primer Plus学习笔记(六)- C 控制语句:分支和跳转
if 语句:
if 语句被称为分支语句(branching statement)或选择语句(selection statement)
if 语句的通用形式:
- if (expression)
- statement
如果 expression 为真,则执行 statement;否则,跳过 statement
与 while 循环一样,statement 可以是一条简单的语句也可以是复合语句
if 语句 和 while语句的区别:如果满足条件可执行的话,if 语句只能测试和执行一次,而 while 语句可以测试和执行多次
if else语句:
if else 语句的通用形式
- if (expression)
- statement1
- else
- statement2
如果 expression 为真(非 0),则执行 statement1;如果 expression 为假或 0,则执行 else 后面的 statement2
statement1 和 statement2 可以是一条简单语句或复合语句
如果要在 if 和 else 之间执行多条语句,必须用花括号把这些语句括起来成为一个块
如果没有花括号,else 与离它最近的 if 匹配,除非最近的 if 被花括号括起来
if 语句用于选择是否执行一个行为,而 if else 语句用于在两个行为之间选择
多重选择 else if:
else if 语句的通用形式
- if (expression1)
- statement1
- else if (expression2)
- satement2
- else if (expression3)
- statement3
- else
- statement4
如果 expression1 为真(非0),则执行 statement1;如果 expression2 为真(非0),则执行 statement2;如果 expression3 为真(非0),则执行 statement3;否则执行 statement4
关于 _Bool 类型:
如果在程序中包含了 stdbool.h 头文件,便可用 bool 代替 _Bool 类型,用 true 和 false 分别代替 1 和 0
如果系统不支持 _Bool 类型,可以把 isPrime 的类型改为 int,并用 1 和 0 分别替换程序中的 true 和 false
逻辑运算符:
逻辑运算符 | 含义 |
&& | 与 |
|| | 或 |
! | 非 |
假设 exp1 和 exp2 是两个简单的关系表达式:
- 当且仅当 exp1 和 exp2 都为真时,exp1 && exp2 才为真(所有条件为真才为真)
- 如果 exp1 或 exp2 为真,则 exp1 || exp2 为真(有一个条件为真就为真)
- 如果 exp1 为假,则 !exp1 为真;如果 exp1 为真,则 !exp1 为假(条件为假则为真,条件为真则为假)
备选拼写:iso646.h 头文件
如果在程序中包含该头文件,就可以用 and 代替 &&,or 代替 ||,not 代替 !
- if (ch != 'a' && ch != 'b')
- count++;
- 也可以写为
- if (ch != 'a' and ch != 'b')
- count++;
优先级
! 运算符的优先级很高,比乘法运算符还高,与递增运算符的优先级相同,只比圆括号的优先级低
&& 运算符的优先级比 || 运算符高,但是两者的优先级都比关系运算符低,比赋值运算符高
求值顺序
C 保证逻辑表达式的求值顺序是从左往右的
&& 和 || 运算符都是序列点,所以程序在从一个运算对象执行到下一个运算对象之前,所有的副作用都会生效
C 保证一旦发现某个元素让整个表达式无效,便立即停止求值
- while ((c = getchar()) != ' ' && c != '\n')
读取字符直至遇到第一个空格或换行符,第一个子表达式把读取的值赋给 c,后面的子表达式会用到 c 的值。如果没有求值循环的保证,编译器可能在给 c 赋值之前先对后面的表达式求值
- while (x++ < 10 && x+y < 20)
&& 是一个序列点,保证了在对 && 右侧的表达式求值之前,已经递增了 x
范围
如果要测试 score 是否在 90~100 的范围内,可以这样写:
- if (score >= 90 && score <= 100)
而不是这样写:
- if (90 <= score <= 100)
这样代码有语义错误
因为会先判断 (90 <= score),结果为 1(真)或 0(假)
条件运算符:?:
条件表达式的通用形式:
- expression1 ? expression2 : expression3
如果 expression1 为真(非 0),那么整个条件表达式的值与 expression2 的值相同;
如果 expression1 为假(0),那么整个条件表达式的值与 expression3 的值相同。
- max = (a > b) ? a : b;
如果 a 大于 b,那么将 max 设置为 a,否则,设置为 b
循环复制:continue 和 break
continue 语句
3 种循环都可以使用 continue 语句
执行到 continue 语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代
- #include <stdio.h>
- int main(void)
- {
- char ch;
- printf("Enter a char:\n");
- while (scanf("%c", &ch) == 1)
- {
- if (ch != 'X')
- {
- continue;
- printf("Error\n");
- }
- else
- printf("Right\n", ch);
- }
- return 0;
- }
运行结果
前两条输入 a 和 b 的时候,并没有打印 Error,因为 continue 跳过了打印 Error
continue 语句还可以用作占位符
例如,循环读取并丢弃输入的数据,直到读到行末尾
- while (getchar() != '\n')
- ;
当程序已经读取一行中的某些内容,要跳转到下一行开始处时,这种用法很方便
用 continue 语句:
- while (getchar() != '\n')
- continue;
这个使用 continue 语句,可读性更高
break 语句
程序执行到循环中的 break 语句时,会终止包含它的循环,并继续执行循环后的语句
如果 break 语句位于嵌套循环内,它只会影响包含它的当前循环
break 和 continue 的比较:
break:
- while ((ch = getchar()) != EOF)
- {
- if (ch == '\n')
- break; ——————————————
- printf("Hello World!\n"); |
- } |
- printf("Out While Loop\n"); ←-|
continue:
- ————————————————|
- ↓ |
- while ((ch = getchar()) != EOF) |
- { |
- if (ch == '\n') |
- continue; ——————————————
- printf("Hello World!\n");
- }
- printf("Out While Loop\n");
箭头是跳转到的地方
- #include <stdio.h>
- int main()
- {
- char ch;
- printf("Enter a char:\n");
- while (scanf("%c", &ch) == 1)
- {
- if (ch == 'X')
- break;
- }
- printf("Out While Loop\n");
- return 0;
- }
运行结果
当输入的为 X,会跳出 while 循环,继续执行 while 循环之后的语句
多重选择:switch 和 break
switch 语句的形式:
- switch (expression)
- {
- case label1 : statement1 // 使用 break 跳出 switch
- case label2 : statement2 // 使用 break 跳出 switch
- default : statement3
- }
可以有多个 case 标签,default 语句可选
程序根据 expression 的值跳转到相应的 case 标签处,执行 case 标签处的语句
然后,执行剩下的所有语句,除非执行到 break 语句进行重定向
expression 和 case 标签都必须是整数值(包括 char 类型),标签必须是常量或完全由常量组成的表达式
如果没有 case 标签与 expression 的值匹配,控制则跳转到 default 语句(如果有 default 语句的话)
否则执行 switch 语句后的语句
- #include <stdio.h>
- int main()
- {
- char ch;
- printf("Enter a char:\n");
- while((ch = getchar()) != '#')
- {
- if ('\n' == ch)
- continue;
- switch (ch)
- {
- case 'a':
- printf("This is a\n");
- break;
- case 'b':
- printf("This is b\n");
- break;
- case 'c':
- printf("This is c\n");
- break;
- default:
- printf("I don't konw this char\n");
- }
- printf("Test Over!\n");
- }
- return 0;
- }
运行结果
break 语句让程序离开 switch 语句,跳转到 switch 语句后面的下一条语句
如果没有 break 语句,就会从匹配标签开始执行到 switch 末尾
- #include <stdio.h>
- int main()
- {
- char ch;
- printf("Enter a char:\n");
- while((ch = getchar()) != '#')
- {
- if ('\n' == ch)
- continue;
- switch (ch)
- {
- case 'a':
- printf("This is a\n");
- case 'b':
- printf("This is b\n");
- case 'c':
- printf("This is c\n");
- default:
- printf("I don't konw this char\n");
- }
- printf("Test Over!\n");
- }
- return 0;
- }
运行结果
如果只希望处理某个带标签的语句,就必须在 switch 语句中使用 break 语句
C 语言的 case 一般都指定一个值,不能使用一个范围
switch 在圆括号中的测试表达式的值应该是一个整数值(包括 char 类型)
case 标签必须是整数类型(包括 char 类型)的常量或整型常量表达式(即,表达式中只包含整型常量),不能用变量作为 case 标签
switch 语句不能用 continue 语句
多重标签
可以在 switch 语句中使用多重 case 标签
- #include <stdio.h>
- int main()
- {
- char ch;
- printf("Enter a char:\n");
- while((ch = getchar()) != '#')
- {
- if ('\n' == ch)
- continue;
- switch (ch)
- {
- case 'a':
- case 'A':
- printf("This is a\n");
- break;
- case 'b':
- case 'B':
- printf("This is b\n");
- break;
- case 'c':
- case 'C':
- printf("This is c\n");
- break;
- default:
- printf("I don't konw this char\n");
- }
- printf("Test Over!\n");
- }
- return 0;
- }
运行结果
如果输入的是字母 a,switch 语句会定位到 case 标签为 a 的位置,由于该标签没有关联 break 语句,所以程序流会直接执行下一条语句(case 标签为 A 的语句)
switch 和 if else
何时选择 switch 和 if else?
如果是根据浮点类型的变量或表达式来选择,就无法使用 switch
如果根据变量在某范围内决定程序流的去向,使用 switch 就很麻烦,这种情况用 if 就很方便
goto 语句
goto 语句也是跳转语句
continue 和 break 都是 goto 的特殊形式
goto 语句由两部分构成:声明标签和标签语句
形式:
- goto label;
- label : statement
goto 语句使程序控制跳转到相应标签语句
冒号用于分隔标签和标签语句
标签名遵循变量命名规则
标签语句可以出现在 goto 的前面或后面
- #include <stdio.h>
- int main()
- {
- int num = 12;
- if (num > 13)
- goto a;
- goto b;
- a : printf("The num is bigger than 13\n");
- b : printf("The num is smaller than 13\n");
- return 0;
- }
运行结果
C Primer Plus学习笔记(六)- C 控制语句:分支和跳转的更多相关文章
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Java学习笔记之---流程控制语句
Java学习笔记之---流程控制语句 (一)循环语句 (1)if语句 if(布尔表达式){ //如果布尔表达式为true将执行的语句 } if(i%2!=0){ System.out.println( ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
随机推荐
- java的一些基本格式
书写方法的格式: 修饰符 返回值 方法名 方法体 public int/void addNumber(参数) { ...
- 逆向破解学习二之<TraceMe>
这次在破解TraceMe的时候,我有看过别人的视频.但是我并没有按照别人思路走,而是完全安全自己的思路试了一次.结果破解成功.新手学破解,如果有不对的地方,还请指出来. 004013A0 crackm ...
- makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F) 含义
makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含义 $(filter-out $(PHONY) $(wildcard $^),$^) 常 ...
- 被人遗忘的MAX_FILE_SIZE文件上传限制大小参数
在文件上传中,我们经常会要求显 示用户上传文件大小,超过上传限制的文件就会不允许用户上传.虽然我们可以用程序去判断上传文件是否超过限制,但是其实我们的PHP程序是无法判断用户本 地文件大小的.所以等到 ...
- 利用Swoole实现PHP+websocket直播,即使通讯代码,及linux下swoole安装基本配置
swoole安装基本配置 php安装swoole 1. 下载swoole安装 wget http://pecl.php.net/get/swoole-1.9.1.tgz tar -zxvf swool ...
- 智课雅思词汇---二十一、名词性后缀acity是什么意思
智课雅思词汇---二十一.名词性后缀acity是什么意思 一.总结 一句话总结:后缀:-acity [名词后缀] 构成抽象名词,表示性质.状态.情况.与形容词后缀-acious相对应 rapacity ...
- 51nod 1672 贪心/队列
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1672 1672 区间交 基准时间限制:1 秒 空间限制:131072 K ...
- BW ON HANA 业务模型关系与数据取数
在接到业务需求之后,我认为重要的是理清楚自己该做什么.来实现业务.由于不了解业务,还是走了很多弯路.本可以不用这么做,还是这么做了.自然你最傻瓜的按照用户的方式去实现是没有问题的. 会使后面的人难以维 ...
- 安装requests 库
这是我见过最恶心的安装了,嘛的,以为公司网络限制.我无法上网 使用 PIP INSTALL REQUESTS .本来就一句话的时 我一直安装不成功.https://www.lfd.uci.edu/~g ...
- [转载]Java开发在线打开编辑保存Word文件
Java调用logo是“P”图标的第三方插件,实现在线编辑保存Word文件(以jsp调用为例,支持SSM.SSH.SpringMVC等流行框架) 工具/原料 Eclipse或MyEclipse等j ...