个人主页~
C语言零基础纯干货教学(上)
C语言入门
三、分支和循环1、if语句(1)if(2)else(3)分支中包含多条语句(4)嵌套if(5)else 悬空原则 2、关系操作符3、条件操作符4、逻辑操作符(1)逻辑取反运算符:!(2)逻辑与运算符:&&(3)逻辑或运算符:||(4)简单例题:判断闰年(5)逻辑运算符的特点:短路 5、switch语句6、while循环(1)基本概念(2)执行流程(3)例子 7、for循环(1)基本概念(2)执行流程(3)例子 8、do-while循环(1)基本概念(2)执行流程(3)例子 9、break和continue语句(1)break(2)continue 10、goto语句
三、分支和循环
1、if语句
(1)if
if(a) b;
括号内表达式a如果为真,则执行b语句,如果为假,则不执行
C语言中0表示假,非0表示真
(2)else
if(a) b;else c;
a如果为真,则执行b语句,如果为假,则执行c语句
else是除了if以外所有情况的集合
举个简单的例子来理解
#include <stdio.h>int main(){int num = 0;scanf("%d", &num);if (num % 2 == 1)printf("%d 是奇数\n", num);elseprintf("%d 是偶数\n", num);return 0;}
(3)分支中包含多条语句
多条语句可以用花括号括起来
if(a){ b; c; d;}
(4)嵌套if
else 与 if 可以嵌套使用构成else if
if(a) b;else if(c) d;else e;
如果满足a的话执行b,满足c的话执行d,都不满足执行e
(5)else 悬空原则
else总会与它最近的if相匹配
if(a) if(c) d;else e;
当满足a和c时,执行d
满足a不满足c时执行e
不满足a时不执行
这就是else的悬空原则:最近的 if 和 else相匹配
这里if©与else连用,共同嵌套在if(a)语句当中
2、关系操作符
符号 | 名称 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
<= | 小于等于 |
>= | 大于等于 |
!= | 不等于 |
这里其实比较值得注意的只有 == 和 !=
跟我们平常用的不同,= 在C语言中是赋值的意思,==才是判断相等的意思
!= 是不相等的意思,记住即可
多个运算符不宜连用
a < b < c;
关系运算符是从左往右计算,这就会导致a<b如果为真返回值为非0,为假则返回0,若a=2,b=1,c=1,按照数学方法以上表达式是错的,但按照c语言的结构来说,先比较a和b,a<b为假,返回0,此时只要c>0此表达式整个就返回真
所以我们采用以下写法
a < b && b < c;
&&是与的意思,需要两个条件同时成立整个表达式才返回真
3、条件操作符
条件操作符也叫三目操作符,同时接收三个操作数,形式如下:
a ? b : c;
先判断表达式a是否为真,如果为真执行b,如果为假执行c
例子:
比较两个数的大小:
int main(){ int a = 1; int b = 2; int max = a < b ? b : a; return 0;}
意思是如果a<b那么最大值就是b否则就是a
4、逻辑操作符
(1)逻辑取反运算符:!
逻辑取反就是在逻辑上取反
可以把真的变成假的假的变成真的
int a = 0;//a为假if(!a)//!a为真{ b;}
这样就可以执行b
(2)逻辑与运算符:&&
我们在之前提到的关系操作符里提到,左右两个操作数都要成立
(3)逻辑或运算符:||
int a = 0;if(a = 0 || a = 1 || a = 2){ b;}
这里变量a只有取到0或1或2时才执行b,否则不执行
(4)简单例题:判断闰年
相信所有接触过C语言的同学在老师上课或者自学的过程中都会遇到这个问题,这个题目可以帮助我们快速的掌握我们上述的内容
第一种方法,if+else:
int main(){ int year = 0; scanf("%d", &year); if(year%4==0 && year%100!=0) printf("是闰年\n"); else if(year%400==0) printf("是闰年\n"); return 0;}
第二种方法:逻辑操作符法
int main(){ int year = 0; scanf("%d", &year); if((year%4==0 && year%100!=0) || (year%400==0)) printf("是闰年\n"); return 0;}
这两种方法本质上是一样的,都是通过两个接口(year%4==0 && year%100!=0)和(year%400 == 0)区别就是符号区别以及算法区别
(5)逻辑运算符的特点:短路
a > 1 && a < 5;
在逻辑与运算符中,短路是指如果条件没有满足左边的式子,那么右边的式子就不会进行判断,如上式,若a值为0,那么右边a<5的条件就不会再去判断了
a = 1 || a = 2 || a = 3;
在逻辑或运算符中,短路是指如果条件满足左边的式子,那么右边的式子就不会再进行判断了
5、switch语句
除了if语句,switch语句也可以实现分支结构
switch语句像是开关,打开某个开关对应某一盏灯
#include <stdio.h>int main(){int max = 0;scanf("%d", &max);switch (max)//括号内必须是整形表达式{case 1://case后的值必须是整形常量表达式printf("one\n");break;case 2:printf("two\n");break;case 3:printf("three\n");break;//如果case不是最后一个项,那么都要加break,如果不加case,下面的语句都会进行default://default就是除了以上几个例子以外所有情况的集合,switch语句中可以没有default//并且default和case没有顺序的要求,default也可以放在前面,但我们通常把default放在最后printf("other nums\n");}return 0;}
case后是式max可能得结果,如果max为1则打印one,如果max是列举三个数以外的数,则打印other nums
部分case后不加break的例子:
int main(){int max = 0;scanf("%d", &max);switch (max){case 1:printf("one\n");case 2:printf("two\n");case 3:printf("three\n");break;default:printf("other nums\n");}return 0;}
6、while循环
(1)基本概念
C语言提供了三种循环语句,while是其中一种
while(a){ b;}
while的括号里也是一个条件判断,如果a为真,则执行b,执行完b再判断a,若a还为真(b的执行可能会影响a)继续执行b
(2)执行流程
首先执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断是否进行下一次判断
(3)例子
打印1~10
int i = 0;while(i <= 10){ printf("%d ",i); i++;}
7、for循环
for循环是三种循环里用的最多的
(1)基本概念
for(a;b;c){ d;}
a,b,c是三个表达式,d是执行语句,a用于循环变量的初始化,b用于循环结束的条件判断,c用于循环变量的调整
(2)执行流程
首先执行a初始化循环变量,然后执行b的判断部分,如果为真则执行d,如果为假则退出循环
为真执行d后,执行c调整循环变量然后执行b的判断部分,重复以上步骤若干次,直到循环变量被调整到b的判断部分为假退出循环
(3)例子
打印1~·10
#include <stdio.h>int main(){int i = 1;for (i = 1; i <= 10; i++){printf("%d ",i);}return 0;}
8、do-while循环
(1)基本概念
它是三种循环中使用频率最小的一个,但它在某些时候比其他两种更加适合解决问题
do{ b;}while(a);
这种循环的特点就是先执行b再判断a
(2)执行流程
在do-while循环中先执行b,执行完后再去判断a,如果a为真则继续循环,若为假则退出
它至少会执行一次b
(3)例子
打印1~10的值
#include <stdio.h>int main(){int i = 1;do{printf("%d ", i++);//后置++先赋值后加加} while (i <= 10);return 0;}
9、break和continue语句
break:它的作用是跳出当前的循环,就是在一个大括号中的循环
continue:它的作用是跳过当前循环的后边所有代码,但不跳出循环,循环继续执行
(1)break
int main(){int i = 1;while (i <= 10){if (i == 5)break;printf("%d ", i++);}return 0;}
我们可以看到在i等于5时break跳出了该次循环,也就是while循环被打破,不再继续printf了
在for循环以及do-while循环中我就不再赘述了,都是跳出当前break所在的循环
(2)continue
int main(){int i = 1;while (i <= 10){if (i == 5)continue;printf("%d ", i++);}return 0;}
可以看到我们的程序没有执行结束,而是一直闪烁光标,这就是因为在i再循环中等于5时,后续的printf被跳过了,并且最重要的是i++也被跳过了,这会导致i一直等于5,循环继续进行继续continue,导致死机的bug
do-while循环与while循环中的continue一致
这里我们再说一下for循环中的continue
int main(){int i = 1;for (i = 1; i <= 10; i++){if (i == 5)continue;printf("%d ", i);}return 0;}
for循环和while循环的概念不同,for循环是等到大括号内的内容执行完毕后再进行第三个表达式i++,所以continue只能跳过当i=5时的printf,其他照常打印
10、goto语句
我们知道,在火影忍者这部动漫中有一名角色叫做波风水门,他将千手扉间的飞雷神之术传承并发扬了,这里,飞雷神之术就是一种goto语句,波风水门扔出一枚飞雷神苦无扎到了地上,他想使用飞雷神之术传送到这枚苦无的位置,那就goto苦无,当然飞雷神的距离是有限的,只能传送到同一个函数的某个位置
int main(){printf("火影\n");goto next;printf("海贼\n");next:printf("鬼灭\n");return 0;}
goto语句最好不要乱用,一般一个函数最多用一个就好了,用多了容易扰乱函数执行流程
next不是必须要写next的,也可以写其他的,比如prev,那么goto后就要跟prev
并且像next一样的标签不用非得写在goto next的后边,也可以写在goto next的前边,这里我们不赘述了,用到的地方比较少
下篇再见~