首先c语言是一种结构化的程序设计语言,支持三种结构:
顺序结构:
选择结构:if switch
循环结构:for while do.while
1. if语句
1.1 if
if语句的语法形式如下:
if (表达式)
语句
表达式成立(为真),则语句执行。
表达式不成立(为假),则语句不执行。
在c语言中0为假,非0为真。
例如:输入一个整数,判断是否为偶数。
#include<stdio.h>
int main()
{
int num = 0:
scanf("%d",&num);
if(num % 2 == 0)//注意if语句后面不加分号,加了分号判断执行完还会执行printf
printf("%d 是偶数\n",num);
return 0;
}
1.2 else
一个数不是奇数就是偶数,偶数判断出来了,那么如何判断奇数呢?
这里就要用到if…esle….语句了。
if (表达式)
语句1
else
语句2
举例:
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if(num % 2 == 0)
printf("%d是偶数\n" ,num);
else
printf("%d是奇数\n",num);
return 0;
}
1.3 分支中包含多条语句
一个if只能控制一个语句,如果想控制多条语句,那就要加上{}。if后面使用{}控制多条语句叫做程序块或者复合语句。
例如:
#include<stdio.h>
int main()
{
int age == 0
scanf("%d\n",&age);
if(age >=18)
{
printf("成年了\n");
printf("可以考驾照了\n");
}
return 0;
}
else也一样
#include<stdio.h>
int main()
{
int age = 0
scanf("%d",&age);
if(age >=18)
{
printf("成年了\n");
printf("可以考驾照了\n");
}
else
{
printf("未成年\n");
printf("不可以考驾照\n");
}
return 0;
}
1.4 嵌套if
在if…else…语句中,else可以与另一个if语句连用,构成多重判断。
比如输入整数判断是0 正数 负数。
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a == 0)
printf("%d 为0",a);
else if (a > 0)
printf("%d 为正数",a);
else
printf("%d 为负数",a);
return 0;
}
蓝色的if相当于嵌套在else语句中,形成嵌套结构。
1.5 悬空else问题
如果有多个if和else,else总和最接近的if匹配。
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe");
else
printf("haha");
return 0;
}
上面的代码排版,让人会误以为else和第一个if匹配。实际上else是和第二个if匹配的。所以第二个if…else… 是嵌套在第一个if中的。如果第一个if不成立。那么第二个if也就不会执行。
将代码改成下面的代码就会更容易理解。
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{ if(b == 2)
printf("hehe");
else
printf("haha");
}
return 0;
}
如果真想让else和第一个if匹配,可以将代码改成这样:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe");
}
else
{
printf("haha");
}
return 0;
}
大括号会使代码的逻辑更加清晰,增强代码的可读性。
2. 关系操作符
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 等于运算符
!= 不等于运算符
注意: (1)相等运算符==
与赋值运算符=
是两个不一样的运算符。
(2)多个操作符不宜连用
关系表达式中通常返回0或1表示真假。真为1,假为0
3. 条件操作符
条件操作符也叫三目操作符,需要接受三个操作数,形式:
1 exp1 ? exp2 ; exp3
计算逻辑:如果exp1
为真,exp2
计算,计算结果是整个表达式的结果;如果exp1
为假,则exp3
计算,计算结果为整个表达式的结果。
比如:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d",&a);
if(a > 5)
b = 3;
else
b = -3;
printf("b等于%d\n",b);
return 0;
}
改造后
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d",a);
b = a>5?3:-3;
printf("%d\n",b);
return 0;
}
4. 逻辑操作符:&&,||,!
逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式,主要有以下三个运算符。
·!
取反运算符
·&&
与运算符
·||
或运算符
a 逻辑与(若二者均不为0,结果为1)全真则真,一假则假
a | b | a&&b |
---|---|---|
非0 | 非0 | 1 |
非0 | 0 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
b 逻辑或(只要有一方结果)一真则真
a | b | allb |
---|---|---|
非0 | 非0 | 1 |
非0 | 0 | 1 |
0 | 非0 | 1 |
0 | 0 | 0 |
演示:显示所输入的月份所处的季节
#include<stdio.h>
int main()
{
int month;
printf("请输入月份:");
scanf("%d", &month);
if (month >= 3 && month <= 5)//逻辑与运算符:“且”的判断
printf("%d月是春季。\n", month);
else if(month >= 6 && month <= 8 )
printf("%d月是夏季。\n", month);
else if(month >= 9 && month <= 11)
printf("%d月是秋季。\n", month);
else if (month == 1 || month == 2 || month == 12)//逻辑或运算符:“或”的判断
printf("%d月是春季。\n", month);
else
printf("%d月不存在!!\n",month);
return 0;
}
4.5 短路求值
c语言的一个逻辑特点就是先对左侧的表达式求值,再对右边的表达式求值。
如果左边的表达式满足所需要的条件,就不会对右边的表达式进行求值。这种情况被称为短路。
比如前面的:
if (month >= 3 && month<=5)
当左边的month >=3不成立即表达式结果为0的话,不判断month<=5,整个表达式的结果也为0。
所以,对于 && 操作符来说,左边结果为0的话,右边就不再执行。
那么对于 || 操作符,左边的结果为1,右边的不在执行。
像这种仅仅知道左操作数的结果就能知道整个表达式的结果,不用对右边的操作数进行运算就叫做短路求值
5. switch语句
switch 语句相当于一种特殊的 if…else… 语句。 if…else… 语句将程序流程分为两支,而 switch语句会将程序分为多支。用于判断条件有多个结果的情况。
switch (expression){
case value1 : statement
case value2 : statement
default :statement
}
上面代码中,根据expression的值,执行相应的case分支。如果case无对应的值就执行default分支。
注意:(1)switch语句括号内的控制表达式必须是整数类型。
(2)case后的值必须为常量,不可以为变量。
5.1 if语句和switch语句的对比
显示所输入的整数除以3的余数(if语句)
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
if (n % 3 == 0)
printf("整除,余数为0\n");
else if (n % 3 == 1)
printf("余数是1\n");
else
printf("余数是2");
return 0;
}
显示所输入的整数除以3的余数(if语句)
#include<stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:");
scanf("%d",&n);
switch (n % 3) {
case 0 : printf("整除,余数为0"); break;
case 1 : printf("余数为1"); break;
case 2 : printf("余数为2"); break;
}
return 0;
}
如果 n%3 的值为1,则程序会转向 “case 1 :”
像case 1 : 这样表示程序跳转的标识称为标签
注意: 1和:之间有没有空格都可以。但是case和1之间必须有空格,不可写成case1
5.2switch语句中的break
前面的语句如果去掉break会发生什么呢?
#include<stdio.h>
int main()
{
int n = 0;
printf("请输入一个整数:");
scanf("%d",&n);
switch (n % 3) {
case 0 : printf("整除,余数为0");
case 1 : printf("余数为1\n");
case 2 : printf("余数为2\n");
}
return 0;
}
我i们会发现7除以3的余数为1,结果发现多了个2,这是为什么呢?
因为当程序执行到break语句时,switch语句执行结束。
break“打破”“脱离”之意。执行break语句之后程序才会跳出switch语句。
break也不是每个case都有,这就需要根据实际情况来看了。
例如:
#include<stdio.h>
int main()
{
int a = 0;
printf("整数:");
scanf("%d",&a);
switch (a) {
case 1:printf("A"); printf("B"); break;
case 2:printf("C");
case 5:printf("D"); break;
case 6:
case 7:printf("E"); break;
default:printf("F"); break;
}
return 0;
}
输入整数:1 回车
运行结果
A
B
输入整数:2 回车
运行结果
C
D
输入整数:3 回车
运行结果
F
输入整数:5 回车
运行结果
D
输入整数:6 回车
运行结果
E
当控制表达式的判断结果与任何一个case都不一致的时候,程序就会跳转到’‘default :’'继续执行。