【C语言】C语言零基础纯干货教学(中)
小白的保姆级入门教程~
C语言入门
三、分支和循环
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);
else
printf("%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的前边,这里我们不赘述了,用到的地方比较少
下篇再见~
更多推荐
所有评论(0)