C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的。
我们可以使⽤ if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。
一,if语句
1.if
if语句语法:
1 if (表达式)
2 语句y
表达式为真,则执行;反之,不执行。
在C语言中,0表示假,非0表示真。
例如:输入整数,判断是否为奇数。
2.else
在上面例子中,如果判断偶数又如何?这就需要if...else...语句,如下:
3.分支中包含多条语句
默认if和else是控制一条语句的。例:
我们发现输入未成年年龄与成年年龄,都会打印“可以谈恋爱了”。
原因:if是控制一条语句的。如何做到控制两条语句?把代码用{ }括起来就可以了。
4.嵌套if
在if...else...语句中,else可以和另一个if连用,构成多重判断。
例:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。
5.悬空else问题
如果有多个 if 和 else ,则else 总是跟最接近的 if 匹配。所以说我们在使用if和else时,记得要用{ }括起来。
二,关系操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个。
• > ⼤于运算符• < ⼩于运算符• >= ⼤于等于运算符• <= ⼩于等于运算符• == 相等运算符• != 不相等运算符
注:a.关系表达式通常返回 0 或 1 ,表⽰真假。
b.相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。(我们可以将变量写在等号的右边)
c.多个关系运算符不宜连用
三,条件操作符
条件操作符也叫三⽬操作符,是接受三个操作数的,形式如下:
1 exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
例:比较大小
执行结果:
四,逻辑操作符
1.逻辑操作符分类
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有三个运算符,分别是:“&&”,“||”,“!”。
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
2.短路
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
a.例如:判断是否为春季
1 if(month >= 3 && month <= 5)
表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的
结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏
b.例如:判断是否为冬季
1 if(month == 12 || month==1 || month == 2)
如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
简单总结:不再对右操作数进⾏计算的运算称为短路求值。
五,switch语句
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
注:
• switch 后的 expression 必须是整型表达式• case 后的值,必须是整形常量表达式
1.switch语句中的break
switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
2.switch语句中的default
switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候就要在 switch 语句中加⼊default 语句。例如:
1 switch (expression) {2 case value1: statement3 case value2: statement4 default: statement5 }
3.switch语句中的case和default的顺序问题
在 switch 语句中 case 语句和 。default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。但我们通常是把 default ⼦句放在最后处理的。
六,while循环
1.语法形式
while 语句的语法结构和 if 语句⾮常相似。C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。
2.执行流程
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语
句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
3.代码演示
在屏幕上打印1~10的值
#include <stdio.h>int main(){int i = 1;while(i<=10){printf("%d ", i);i = i+1;}return 0;}
七,for循环
1.语法形式
for 循环是三种循环中使⽤最多的, for 循环的语法形式如下:
1 for(表达式1; 表达式2; 表达式3)2 语句;// 如果循环体想 包含更多的语句,可以加上⼤括号表达式1 ⽤于循环变量的初始化表达式2 ⽤于循环结束条件的判断表达式3 ⽤于循环变量的调整
2.执行流程
a.首先执⾏表达式1 初始化循环变量
b.接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继续。整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。
3.代码演示
在屏幕上打印1~10的值 :
1 #include <stdio.h>23 int main()4 {5 int i = 0;6 for(i=1; i<=10; i++)7 {8 printf("%d ", i);9 }1011 return 0;12 }
八,do-while循环
1.语法形式
do while 循环是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
2.执行流程
在 do while 循环中先执⾏“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。
3.代码演示
在屏幕上打印1~10的值
#include <stdio.h>int main(){int i = 1;do{printf("%d ", i);i = i + 1;}while(i<=10);return 0;}
九,break和continue语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中提供了 break 和 continue 两个关键字,就是应该到循环中的。
• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。• continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
1.while循环中的break和continue
a.break举例
#include <stdio.h>int main(){int i = 1;while(i<=10){if(i == 5)break; // 当 i 等于 5 后,就执⾏ break ,循环就终⽌了printf("%d ", i);i = i+1;}return 0;}
执⾏的结果:
1 2 3 4
b.continue举例
#include <stdio.h>int main(){int i = 1;while(i<=10){if(i == 5)continue;// 当 i 等于 5 后,就执⾏ continue ,直接跳过 continue 的代码,去循环的判断的地⽅// 因为这⾥跳过了 i = i+1 ,所以 i ⼀直为 5 ,程序陷⼊和死循环printf("%d ", i);i = i+1;}return 0;}
所以说,continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。
2.for循环中的break和continue
a.break举例
#include <stdio.h>int main(){int i = 1;for(i=1; i<=10; i++){if(i == 5)break;printf("%d ", i);}return 0;}
运行结果:
1 2 3 4
break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以使⽤ break 来完成。
b.continue举例
#include <stdio.h>int main(){int i = 1;for(i=1; i<=10; i++){if(i == 5)continue; // 这⾥ continue 跳过了后边的打印,来到了 i++ 的调整部分printf("%d ", i);}return 0;}
运行结果:
1 2 3 4 6 7 8 9 10
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调
整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤
continue 来实现。
3.do while循环中的break和continue
do.while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样,⼤家下来可以
⾃⾏测试并体会。
#include <stdio.h>int main(){int i = 1;do{if(i == 5)continue;printf("%d ", i);i = i + 1;}while(i<=10);return 0;}
十,goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数
内跳转到设置好的标号处。
例如:
#include <stdio.h>int main(){printf("hehe\n");goto next:printf("haha\n");next:printf("跳过了haha的打印\n");return 0;}
goto 语句在多层循环的代码中,如果想快速跳出,使⽤ goto 就⾮常的⽅便了。
for(...){for(...){for(...){if(disaster)goto error;}}
本来 for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套
就得使⽤3个 break 才能跳出循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。