判断与循环
if语句
if(条件成立)
{
//do something
}
else
{
//do something
}
级联if
if(条件成立)
{
//do something
}
else if(条件成立)
{
//do something
}
else
{
//do something
}
嵌套if
if(条件成立)
{
if(条件成立)
{
//do something
}
else
{
//do something
}
}
else
{
//do something
}
if中的条件是否成立就需要对数据作比较。
比较就是关于两个数据是否相等、谁大谁小的结论,这需要用到关系运算:对两个数据之间的关系的计算。
C语言提供了六个关系运算符:
- “==” 相等
- “!=” 不相等
- “>” 大于
- “>=” 大于或等于
- “<” 小于
- “<=” 小于或等于
注意其中有两个字符的运算符:==、>=和<=的两个字符必须紧紧连在一起,中间不能插入空格。
关系运算的结果是一个逻辑值,逻辑值只有两种可能的值:true(真,表示成立)或false(假,表示不成立)。当两个值的关系符合关系运算符的预期时,关系运算的结果为true,否则为false。
例
printf("%d\n",1==2);//0
printf("%d\n",1>2);//0
printf("%d\n",1<=2); //1
【注】:所有的关系运算符的优先级比算术运算的低,但比赋值运算的高
【注】:判断是否相等的==和!=的优先级比其他的低,而连续的关系运算是从左到右的
while循环
while(循环条件)
{
//do something
//循环体内一定要有改变条件的机会
}
循环之前去判断条件是否成立,成立进入循环,不成立则继续向后执行,所以有可能循环一次也没有被执行。
do-while循环
do
{
//do something
//循环体内一定要有改变条件的机会
}while(循环条件);
在进入循环的时候不进行检查,执行完一轮循环体之后在进行检查循环条件是否满足,如果满足则进行下一轮的循环,如果不满足则结束循环。
for循环
for(初始动作;条件;每轮的动作)
{
//do something
}
for循环像一个计数循环,设定一个计数器并初始化,然后在计数器到达某值之前,重复执行循环体,每次执行一轮循环体就会对计数器进行调整,例+1或-1
- for中的每一个表达式都是可以省略的
- for(;条件;) == while(条件)
三种循环使用时的选择
- 如果有固定的次数,选for
- 如果必须执行一次,选do-while
- 其他情况用while
进一步的判断和循环
bool类型
头文件是#include <stdbool.h>
bool只有true和false。
逻辑运算
- 逻辑运算是对逻辑量的运算,结果只有0和1
- 逻辑量是关系运算或逻辑运算的结果
运算符 | 描述 | 示例 | 结果 | 巧记 |
---|---|---|---|---|
! | 逻辑非 | !a | 如果a是true,结果就是false,如果a是false,结果就是ture | |
&& | 逻辑非 | a&&b | 如果a和b都是true,结果就是true,否则为false | 全真为真,否则为假 |
|| | 逻辑或 | a||b | 如果a和b有一个true,结果就是true,两个都是false,结果为false | 有真则真,全假为假 |
- 优先级:! > && > ||
- 对于&&,左边结果是false时就不做右边了
- 对于||,左边是true时就不做右边了
例如:
表达[4,6] x>4 && x<6
c是否是大写字母 c>='A' && c<='Z'
0到99意外的数 a<0 || a>99
!a < 20 根据优先级先算!a,如果a的值是多少,结果只有0或1,任何值都成立
优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () | 从左到右 |
2 | ! + - ++ – | 从右到左(单目+ -) |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | < <= > >= | 从左到右 |
6 | == != | 从左到右 |
7 | && | 从左到右 |
8 | || | 从左到右 |
9 | = += -= *= /= %= | 从右到左 |
条件运算符
a = (a > 5) ? a-2 : a+1;
==>等价于
if(a>5)
a = a - 2;
else
a = a + 1;
- 条件运算符的优先级高于赋值运算符,但低于其他运算符,是自右向左结合的
switch-case
switch(常量表达式)
{
case 常量:
语句
...
break;
case 常量:
语句
...
break;
default:
语句
...
}
- 控制表达式的只能是整数
- break表示直接跳出switch内部
FAQ
Q:为什么强调if和else后面要用{}
强调语句的执行
Q:/* */会被替换为什么?
在把代码翻译成汇编代码前,还有一个步骤叫预处理。在预处理当中会把注释代码删掉。
一条语句前的注释 替换成等长的空格;
一条语句中的注释 替换成一个空格;
一条语句后的注释 直接删除
Q:为什么说for循环很怪?
因为for循环不符合人类的语言逻辑,并不易于理解,因此就造成了第一次接触语言的人难以理解for循环所表达的意思。而现代程序设计理念更强调与人类语言的逻辑统一性而非编译逻辑。因此在新兴的python语言中去除了C中的for循环逻辑。C 的整体设计过于面向机器指令,C 风格的 for 语句,在面对应用开发时,细节过多,抽象不足,部分场景下易出错,易导致开发成本上升,易导致可读性差。对于精心设计的、带有抽象设计的 for 语句(包括 foreach 等),可以满足几乎所有 C 语言 for 语句的功能,并且有更好的体验、更好的可读性、更少的出错机会,甚至促使我们写出更好的性能。
Q:分段函数可以用switch-case吗?划算吗?
分段函数可以用switch-case,但不划算,因为switch需要整数型表达式,且case需要常数。
内容来自中国大学MOOC,个人学习笔记总结。整理不易,欢迎支持,下期见!