C语言是程序化的设计语言,这里的结构指的是顺序结构、、选择结构、循环结构。
我们可以使用if、switch实现分支结构,使用for、while、do while实现循环结构
if语句的语法形式如下
if(表达式)
语句
表达式成立(为真),则语句执行,表达式不成立(为假),则不执行。
另外,在C语言中,0表示假,非0表示真,也就是输出的结果为0,则语句不执行,表达式的结果不是0,则语句执行。
eg:输入一个整数,判断是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
如果一个数不是奇数,则为偶数。那么对于任意一个整数,要判断是奇数还是偶数该如何表示?
利用if...else...语句,语法形式如下:
if(表达式)
语句1
else
语句2
eg:输入一个整数,判断是奇数还是偶数
#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;
}
默认在if和else语句中都只控制一条语句
如果要控制多条语句,可以使用{}将代码括起来。
eg:
int main()
{
int age= 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年了\n");
printf("要上大学了\n");
}
else
{
printf("未成年\n");
printf("还未上大学\n");
}
return 0;
}
在 if else语句中,else可以与另一个if语句连用,构成多重判断。
语法形式如下:
if(表达式)
else if(表达式)
...
else
eg:输⼊⼀个⼈的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁以上打印"⽼寿星"
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else
{
if(age<=44)
{
printf("⻘年\n");
}
else
{
if(age<=59)
{
printf("中⽼年\n");
}
else
{
if(age<=90)
printf("⽼年\n");
else
printf("⽼寿星\n");
}
}
}
return 0;
}
如果有多个if和else,else总是跟最接近的if匹配。
适当带上大括号,代码的逻辑会更清晰,可以避免产生bug。
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称 为“关系运算符”(relational operator),主要有下⾯6个。
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 等于运算符
!= 不等于运算符
注意:=用于赋值,==用于判断是否相等
关系表达式通常返回0或1,表示真假。
c语言中,0表示假,非0表示真。比如,20>12返回1,12>20返回0。
关系表达式通常if或while结构中。
if(x==3)
printf("%d",x);
为了分支==和=混淆,通常将x==3写出3==x,此时如果==写成了=,编译器会报错。
另外,多个关系运算符不宜连用。
i<j<m
上面的示例并不如我们数学中的意义相同,它表达的是(i<j)<m,而i<j返回0,即0<m,此时编译器不会报错。正确的写法应该是:
i<j&&j<m
! :逻辑取反运算符(改变单个表达式的真假)。
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
短路:C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
例如:
if(month>=33&&month<=5)
表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的 结果是0的时候,及时不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短 路求值。
除了if语句外,C语言还提供了switch语句来实现分支操作。
switch(experssion){
case value1:statement
case value2:statement
default:statement
}
上面代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到相应的情况,就执行default分支。
另外,switch后的expression必须是整型表达式
case后的值,必须是整型常量表达式。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
运行结果如下:
这是为什么呢? 原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 2 中的语句。
所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。 当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
如果需求发⽣变化,变为:
1. 输⼊1-5,输出的是“⼯作⽇”;
2.输⼊6-7,输出“休息⽇”
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("⼯作⽇\n");
break;
case 6:
case 7:
printf("休息⽇\n");
break;
}
return 0;
}
我们发现应该根据实际的情况,来在代码中觉得是否使⽤ break ,或者在哪⾥使⽤ break ,才能正确完成实际的需求。
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实 际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。
for(表达式1;表达式2;表达式3)
语句;
表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
整个循环过程中,表达式1只被执行一次,剩下的就是表达式2,循环语句,表达式3在。
举一个例子:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执行。
continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。
下面用两个例子来解释:
#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;
}
#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;
}
for循环中break的作用和while中的相同
对于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;
}
在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。
在这里,可以对比一下while和for循环中continue的区别
作用几乎和while循环中的一模一样。
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数 内跳转到设置好的标号处。
#include<stdio.h>
int main()
{
printf("hello\n");
goto next;
printf("world\n");
next:
printf("hi\n");
return 0;
}
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出 使⽤ goto 就⾮常的⽅便了。