C语言是一门结构化语言,包括三大主要结构:顺序结构,分支结构(if,swtich),和循环结构(for,do while , while).那么今天我们就来学习分支结构和循环结构
一.if语句
什么是if语句呢,我们来看看他的用法:
# include <stdio.h>
int main()
{
int a = 0;
scanf("%d" , &a);
if(a)//判断真假
{
printf("hello");//a为真运行
}
return 0;
}
那么这就是一个简单的if的用法,当a为真的时候,则运行printf("hello")这个语句,未假则不会运行.
这里有一个知识点呢:如果if后面跟一条语句的话,这个{}(大括号可以省略哦),多条语句就不可以省略了。可以写成这样
if(a)
printf("hello");
if....else呢,也是同样的道理
# include <stdio.h>
int main()
{
int a;
scanf("%d" , &a);
if(a)
printf("A");//为真打印A
else
printf("B");//为假打印B
return 0;
}
如果a 为真,则运行printf("A");,反之运行printf("B")
1.if...else嵌套
在if ...else 中嵌套if....else 构成多重判断
比如:判断一个数是奇数还是偶数,小于0就打印负数
# include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num <0)
printf("负数");
else
{
if(num %2 == 0)
{
printf("偶数");
}
else
{
printf("奇数");
}
}
return 0;
}
那么程序是怎么运行的呢,首先判断a是不是小于0,如果小于则打印负数,结束程序
如果大于0,则跳转到else 里面的if里面判断是不是被2整除,如果是,则打印偶数,相反则打印奇数
我们可不可以优化代码呢,在else 里面的if ....else 其实是一个语句,因为他要么是偶数,要么是奇数,只有两个结果,所以我们可以把它看成一个语句,就可以写成
# include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num <0)
printf("负数");
else if(num % 2 == 0)
printf("偶数");
else
printf("奇数");
return 0;
}
2.else 的分配问题
# include <stdio.h>
int main()
{
int a = 0;
int b = 1;
if (a > 1)
if (b == 1)
printf("11");
else
printf("22");
return 0;
}
你们这段代码会输出什么呢?答案是什么都不输出,可能会有同学认为输出22,其实并不是这样
因为else总是和他最近的一个if相匹配,这个else 是跟第二个if相匹配的.
所以当第一个if里的表达式为0的时候,程序就结束了什么都不打印.
二.关系操作符
注意:在C语言中 = 是赋值 , ==才是判断相等.
关系操作符通常返回0/1来表示真假
关系操作符的连用: a < b <c ;中, 是先比较a<b得到的返回值再跟c做比较
三.条件运算符(三目运算符)
条件运算符又称三目运算符:
基本理念和if..else相似: d1 ? d2 :d3;
如果表达式d1为真,则运行d2,相反运行d3;
# include <stdio.h>
int main()
{
//求两个值的最大值
int a ,b;
scanf("%d%d" , &a ,&b );
int max = a > b? a:b;
printf("%d" ,max);
return 0;
}
这就是三目操作符的用法了,相当于就是简化版的if...else,这里注意三目操作符的是:(冒号),不是;(分号)
四.逻辑操作符
&&(逻辑与) 表示并且的意思
||(逻辑或) 表示或者的意思
!(取反) 可以把假变真,真变假
# include <stdio.h>
int main()
{
int a = 0;
if(!a)//把假变真
{
printf("hello");
}
return 0;
}
这就是取反的用法
那么&& ||的用法呢,我举个例子:判断一年是不是闰年
# include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) // 能被4整除并且不能被100整除或者能被400整除的叫闰年
printf("yes");
else
printf("no");
return 0;
}
能被4整除并且不能被100整除或者能被400整除的叫闰年,我们刚好运用&&,||逻辑操作符来实现这个逻辑.
1.重要知识点短路:
1.在&&中 :表达式1 && 表达式2 只要一个为假,整个逻辑表达式就为假.全部为真整个逻辑表达式才为真
2. 在||中 : 表达式1||表达式2 只要一个为真,整个逻辑表达式就为真,
那什么叫短路呢?
在&&中,如果表达式1为假,就不会执行表达式2,因为只要一个为真就行了。如果表达式1为真,则也要执行表达式2.因为两个真才为真.
在||中, 如果表达式1为假,则会执行表达式2.如果表达式1为真,就不用执行表达式2.因为||有一个真就行了.
我们来看代码
int a = 3, b = 2, c = 0;
int i;
i = c++ && a++;
printf("%d %d %d", a, c ,i);
在这里面 由于 c++ 为假 所以不会执行a++,整个表达式也就为0;所以最后输出的结果是a=3,c=1,i=0
int a = 3, b = 2, c = 0;
int i;
i = c++ || a++;
printf("%d %d %d", a, c ,i);
在||中呢 , c++为假,就要运行a++了,因为||中有一个为真就行了,所以最后的结果就为 a=4,c=1,i=1
五.switch语句
在学完if语句,我们来看看switch语句
switch语句也是分支结构中的语句.用于处理多种情况.
switch(整形表达式)
{
case (整形常量表达式):
语句;
break;
case ((整形常量表达式))://每一个case 对于不同的情况
语句2:
break;
defacult: //不符合所以case的情况
语句3;
}
这就是switch的基本理念.
我们来看个例子:
# include <stdio.h>
int main()
{
//输入1~7,相对应的星期几
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1 :
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
default:
printf("输入有错误:请重新输入");
}
return 0;
}
1.每一个case 对应一种情况 ,遇到break才会停止
2.default是不满足所有case情况下,它和case没有前后循序,符合逻辑就行
我们也可以利用.每一个case 对应一种情况 ,遇到break才会停止 这个特性
如果我们要完成1~5为工作日,6~7打印休息日这个逻辑呢?
switch (num)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入有错误:请重新输入");
}
根据题目意思适当去掉break就行了.
六.循环结构语句
1.while语句
那么接下就学我们的循环结构里面的while 循环语句了.
while(表达式)
{
语句;
}
它的理念和if相似,当表达式为真
当表达式为真,则执行语句,然后再去判断表达式为真,为真继续执行语句,这样就构成了一个循环。
举例:打印1~10的整数
# include <stdio.h>
int main()
{
int i = 1;//变量初始化
while(i <= 10)//变量结束条件
{
printf("%d " , i);
i++;//循环变量的调整
}
return 0;
}
2.for语句
那么for语句是怎么样的呢
for(表达式1;表达式2;表达式3)
{
语句;
}
表达式1: 变量的初始化
表达是2;循环变量的结束条件
表达式3: 循环变量的调整
我们不难发现其实while和for循环中很相似的,就是把三个重要条件集中在一起了
那我们看看for语句来实现1~10的整数吧
for (int a = 1; a <= 10; a++)
{
printf("%d ", a);
}
这里的执行流程是这样的:
为了方便理解,我们把for()里面的表达式替换成for(1;2;3),后面的语句替换成4;
那么是怎么执行的呢:
先运行1,在运行2,如果条件符合,则运行语句4,不符合结束循环。运行完4,再运行3,再运行2,再次判断为真继续4 3 2 这样运行。直到运行3之后,再运行2 不符合条件,则结束循环
注意:变量的初始化只运行1次哦
那么在for语句中这三个条件是可以省略不写的[for( ; ; ; )],但是如果循环变量的条件不写的话,就会构成死循环.
3.do... while语句
do ...while 在我们C语言中,用的比较少,因为它会无条件执行一次,再去判断结果
# include <stdio.h>
int main()
{
int i = 0;
do
{
printf("hehe");
} while (i);
return 0;
}
就比如这个代码,先执行printf语句再判断while中的值是否为真。所以不管为真未假,它总是会打印一次
4.break 和 continue 的用法
1.当我们想要提前终止程序的时候,我们就可以使用break语句来提前终止循环
比如:打印1~10的数,当i等于5的时候,跳出循环
# include <stdio.h>
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d", i);
}
return 0;
}
2.那我们想跳过某一个数呢,比如说跳过5这个数呢?
for (int i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d", i);
}
那么我们就知道continue不中断程序的运行,是跳过continue后面的代码.
5.循环的嵌套
有时候循环的嵌套,能让我们更好的解决问题
这里举一个详细的例子:打印1~100的质数
for (int i = 1; i <= 100; i++)
{
int flag = 1;//标记,假设一开始是质数
for (int j = 2; j <= i - 1; j++)
{
if (i % j == 0)
{
flag = 0;//不是质数就把0赋给flag
break;
}
}
if (flag == 1)//判断
{
printf("%d ", i);
}
什么是质数呢,只能被1和自身整除叫质数.
那我们首先得创建1到100的数字,再创建除了1和自己本身的数字,如果两个整除相除那它就不是质数。我们就可以设个标记,如果不是质数就把标记归零,最后判断标记。最终就可以得出我们想要的效果!
此文章仅仅是帮助自己更深刻地学习C语言这门知识,如果有错误的话还请大家指点指点,同时也希望帮助到刚开始学习C语言的同学们,谢谢.此外我的Git里面有自己学习的思维导图以及平常写的代码。仓库 - 一个学不明白数据结构的大学生 (a-person-who-doesnt-understand) - Gitee.com