C语言三大结构,分别是顺序结构、选择结构(分支结构)和循环结构
C语言顺序结构:让程序按照从头到尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。
C语言选择结构:也称分支结构,就是让程序“拐弯”,有选择性地执行代码;换句话说,可以跳过没用的代码,只执行有用的代码。
C语言循环结构:就是让程序“杀个回马枪”,不断地重复执行同一段代码。
if else语句
if和else是两个新的关键字,if意为“如果”,else意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。总结起来,if else的结构为
if (判断条件) { 语句块1 } else { 语句块2 }
语句块(Statement Block),就是由{}包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{}。
由于if else语句可以根据不同的情况执行不同的代码,所以也叫分支结构或选择结构。
只使用if语句
有的时候,我们需要在满足某种条件时进行一些操作,而不满足条件时就不进行任何操作,这个时候我们可以只使用 if 语句。也就是说,if else 不必同时出现。
单独使用 if 语句的形式为:
if (判断条件) {语句块}
如果判断条件成立就执行语句块,否则直接跳过。
多个if else语句
if else 语句也可以多个同时使用,构成多个分支,形式如下:
if (判断条件1) { 语句块1 } else if (判断条件2) { 语句块2 } else if (判断条件3) { 语句块3 } else if (判断条件m) { 语句块m } else { 语句块n }
从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。
一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。
if语句的嵌套
if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对。
if (判断条件1) { if (判断条件2) { 语句块1 } else { 语句块2 } } else { 语句块3 }
关系运算符
关系运算符在使用时,它的的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。注意,是判明大小关系,不是其他关系。
关系运算符 | 含义 | 数学上的表示 |
< | 小于 | < |
<= | 小于或等于 | ≤ |
> | 大于 | > |
>= | 大于或等于 | ≥ |
== | 等于 | = |
!= | 不等于 | ≠ |
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。
在C语言中,有的运算符有两个操作数,例如 10+20,10和20都是操作数,+ 是运算符。我们将这样的运算符称为双目运算符。同理,将有一个操作数的运算符称为单目运算符,将有三个操作数的运算符称为三目运算符。
运算结果1为“真”,表示条件成立,运算结果为0为“假”,表示条件不成立。
逻辑运算符
运算符 | 说明 | 结合性 | 举例 |
&& | 与运算,双目,对应数学中的“且” | 左结合 | 1&&0 |
|| | 或运算,双目,对应数学中的“或” | 左结合 | 1||0 |
! | 非运算,单目,对应数学中的“非” | 右结合 | !a |
逻辑运算的结果
在编程中,我们一般将零值称为“假”,将非零值称为“真”。逻辑运算的结果也只有“真”和“假”,“真”对应的值为 1,“假”对应的值为 0。
1. 与运算(&&)
参与运算的两个表达式都为真时,结果才为真,否则为假。
2. 或运算(||)
参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。
3. 非运算(!)
参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。
优先级
逻辑运算符和其它运算符优先级从低到高依次为:
赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)
&& 和 || 低于关系运算符,! 高于算术运算符。
switch case语句
C语言虽然没有限制if else能够处理的分支数量,但当分支过多时,用if else处理会不太方便,而且容易出现if else配对出错的情况。
switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分支的if else语句,基本格式如下:
switch (表达式) { case 整型数值1:语句1; case 整型数值2:语句2; ...; case 整型数值n:语句n; default: 语句n+1; }
执行过程:
1. 首先计算“表达式”的值,假设为 m。
2. 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3. 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case...一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4. 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。
break是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。
由于 default 是最后一个分支,匹配后不会再执行其他分支,所以也可以不添加break; 语句。
最后需要说明的两点是:
1. case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
2. default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。
条件运算符
条件运算符是C语言中唯一的一个三目运算符,语法格式为:
表达式1 ? 表达式2 : 表达式3
求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
1. 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。
2. 条件运算符 ? 和 : 是一对运算符,不能分开单独使用。
3. 条件运算符的结合方向是自右至左。
while循环
循环(Loop),就是重复地执行同一段代码,例如要计算 1+2+3+……+99+100 的值,就要重复进行99次加法运算。
while循环的一般形式为:
while (表达式) { 语句块 }
意思是,先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”...这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。
一般把“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。
1. 循环条件成立时的话,while 循环会一直执行下去,永不结束,成为“死循环”。
运行程序,会不停地执行语句块,直到用户强制关闭。
2. 循环条件不成立的话,while 循环就一次也不会执行。
运行程序,什么也不会输出。
do while循环
do-while循环的一般形式为:
do { 语句块 } while (表达式);
do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
for循环
C语言中还有 for 循环,它的使用更加灵活,完全可以取代while循环。
for 循环的一般形式为:
for(表达式1; 表达式2; 表达式3) { 语句块 }
它的运行过程为:
1. 先执行“表达式1”。
2. 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
3. 执行完循环体后再执行“表达式3”。
4. 重复执行步骤 2. 和 3.,直到“表达式2”的值为假,就结束循环。
上面的步骤中,2. 和 3. 是一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2. 和 3.。
“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。
for循环中的三个表达式
for 循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,都可以省略(但分号;
必须保留)。
所谓死循环,就是循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,一定要避免。
break关键字
当 break 关键字用于 while、for循环时,会终止循环而执行整个循环语句后面的代码。break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
continue语句
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
循环嵌套
嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,或者 for 里面有 while,while 里面有 if-else,这都是允许的。
在C语言中,代码是顺序、同步执行的,当前代码必须执行完毕后才能执行后面的代码。这就意味着,外层 for 每次循环时,都必须等待内层 for 循环完毕才能进行下次循环。虽然 i 是变量,但是对于内层 for 来说,每次循环时它的值都是固定的。
内层 for 每循环一次输出一个数据,而外层 for 每循环一次输出一行数据。