1、if语句
if 语句允许程序通过测试表达式的值从两种选项中选择一种。
1.1 if语句的语法格式:
if(表达式) 语句
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0表示假,非0表示真。也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行
1.2 if语句的执行流程
1.3 if …else 语句
语法格式:
1.2 if语句的执行流程 image.png 1.3 if …else 语句 语法格式: if(
1.4 级联式if语句
编程时常常需要判断一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式”if语句常常时编写这类系列判定的最好方法。
例如:下面这个级联式if语句用来判定n是小于0、等于0、大于0
if(n<0) printf("%d小于0\n",n); else if(n==0) printf("%d等于0\n",n); else printf("%d大于0\n",n);
虽然第二个 if
语句式嵌套在第一个if
语句内部的。通常不会对他对进行缩进,而是把每个else
都与最初的 if
对齐:
if(n<0) printf("%d小于0\n",n); else if(n==0) printf("%d等于0\n",n); else printf("%d大于0\n",n);
级联式 if 语句独特的书写形式:
if(表达式) 语句 else if(表达式) 语句 else if(表达式) 语句 ... else 语句
1.5 “悬空else” 的问题
当 if 语句嵌套时,千万要当心著名的“悬空else”的问题。
思考下面这个例子:
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
程序运行结果是什么呢?
很多人认为 a = 0,不等于1,程序执行else子句,打印haha,但是你运行程序的时候,输出结果:什么都没有打印。
这就是悬空else
的问题,如果有多个 if
与 else
的时候,else
总是跟最近的未配对的 if
匹配。
如果代码改成下面这样更容易理解了
#include <stdio.h> int main() { int a = 0; int b = 2; if (a == 1) { if (b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
或者如果我们希望else
确定和第一个if
匹配,可以把代码改成这样。
#include <stdio.h> int main() { int a = 0; int b = 2; if (a == 1) { if (b == 2) printf("hehe\n"); } else { printf("haha\n"); } return 0; }
只要带上适当的大括号,代码的逻辑就会更加清晰,所以大家以后子啊写代码的时候要注意括号的使用,让代码的可读性更高。
注:if 和 else 语句默认都只控制一条语句,想要控制多条语句需要加上{},构成复合语句
2、switch语句
除了 if
语句外,C语言还提供了 switch
语句来实现分支结构
switch
语句是一种特殊形式的 if...else
结构,用于判断条件有多个结果的情况。它把多重的 else if
改成更易用、可读性更好的形式。
switch
的语法格式:
switch(表达式) { case 常量表达式: 语句 case 常量表达式: 语句 ... case 常量表达式: 语句 default :语句 }
switch 的组成部分:
控制表达式:switch 后面必须跟着圆括号括起来的整形表达式。C语言把字符当成整数来处理,因此在 switch 语句中可以对字符进行判定。但是,这不适用于浮点数和字符串。
分支标号:每个分支的开头都有一个标号,格式如下:
case 常量表达式:
常量表达式很像普通的表达式,只是不能包含变量和函数调用。因此,5是常量表达式,5 + 10 也是常量表达式,但 n + 10 不是常量表达式(除非n是表示常量的宏)。分支标号中常量表达式的值必须是整数(字符也可以)
语句:每个分支标号的后边可以任意数量的语句,并且不需要用花括号把这些语句括起来。每组语句的最后一条通常是break 语句。
C语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。
default 的作用:
switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。
3、while循环
循环是重复执行其他语句(循环体)的一种语句。
3.1 while语句的格式
while(表达式) 语句
3.2 while语句的执行流程
首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
3.3 while语句的实践
练习:在屏幕上打印1~10的值
代码:
3.3 while语句的实践 练习:在屏幕上打印1~10的值 代码: #incl
运行结果:
4、for循环
4.1 for语句的格式
for(声明或者表达式1;表达式2;表达式3) 语句
表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整
4.2 for语句的执行流程
首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行训话语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环
4.3 for语句的实践
练习:在屏幕上打印1~10的值
代码:
#include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
运行结果:
4.4 for语句和while语句的对比
5、do…while循环
5.1 do…while语句的格式
do { 语句 }while(表达式);
while
和 for
这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而do...while
循环则是先直接进入循环体,执行循环鱼护,然后在执行 while
后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
5.2 do…while语句的执行流程
在do...while
循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,在判断表达式的结果是!=0,则继续循环,执行循环;判断表达式的结果==0,则循环结束。
所以在do...while
语句中循环体是至少执行一次的,这是do...while
循环比较特殊的地方。
5.3 do…while语句的实践
练习:在屏幕上打印1~10的值
代码:
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); i++; } while (i<=10); return 0; }
运行结果:
6、break和continue
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环。
break
的作用是用于永久的终止循环,只要break
被执行,直接就会跳出循环,继续往后执行。continue
的作用是跳出本次循环continue
后边的代码
7、goto语句
C语言提供了一种非常特别的语法,就是goto
语句和跳转标号,goto
语句可以实现在同一个函数内跳转到设置好的标号处。
标号只是放置在语句开始处的标识符:
标识符: 语句
goto语句格式
goto 标识符;
例如:
#include<stdio.h> int main() { printf("hehe\n"); goto next; printf("haha\n"); next: printf("跳过haha的打印\n"); return 0; }
运行结果:
goto
语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以能不用尽量不去使用;但是goto
语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用goto
就非常的方便了。
for(...) { for(...) { for(...) { if(1) goto next; } } } next: //...
本来for
循环也使用break
跳出,但是break
只能跳出一次循环,这里就要用3个break
才可以跳出循环,所以这种情况使用goto
语句就更快捷。
8. C语言必刷题
- 打印1~100之间的奇数
- 9*9乘法表