概述
C 语言是结构化的程序设计语言
C 语言支持 3 种结构:
-
顺序结构
-
选择结构
- if
- switch
-
循环结构
- while
- for
- do while
今天的主要学习内容为选择结构,也叫做分支语句。
if
if 语句的语法形式:
if (表达式)
语句
输入一个值,判断是否为奇数
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
执行结果
输入年龄,判断能否谈恋爱(18岁可以谈)?
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
else
printf("未成年\n");
printf("不可以谈恋爱\n");
return 0;
}
程序执行报错
这是因为if和else只能控制一条语句。如果包含多条语句,需要把代码放在{ }中。
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else
{
printf("未成年\n");
printf("不可以谈恋爱\n");
}
return 0;
}
执行结果
{ }括起来之后的叫代码块,程序块或者复合语句。
要求输入一个整数,判断输入的整数是0,还是正数或者负数。
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if(num >= 0)
printf("输入的数字是正数\n");
else
printf("输入的数字是负数\n");
return 0;
}
执行结果
请输入一个整数,如果是正数,在判断是奇数还是偶数,并输出;如果不是证书则输出不是正数。
int main()
{
int num = 0;
scanf("%d",&num);
if(num > 0)
{
if (num % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
}
else
{
printf("不是正数\n");
}
return 0;
}
执行结果
悬空 else 问题
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
执行结果
这里体现了代码编写规范的重要性。
关系操作符
| 操作符 | 解释 |
|---|---|
< | 小于运算符 |
>= | 大于等于运算符 |
<= | 小于等于运算符 |
== | 相等运算符 |
!= | 不相等运算符 |
关系表中返回 0或1,表示真假。
C 语言中,0表示假,非0表示真。
注意:
=为赋值符号,并不能作为判断。
多个关系操作符,不宜连用
int main()
{
int i = 8;
int j = 10;
int k = 9;
if (i < j < k)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
执行结果
判断顺序:
i跟j比较,发现小于,为真,此时返回True,也就是1;- 继续将
1跟k比较,结果为小于,所以会打印“hehe”。
所以,在实际项目中,不建议使用这一类写法。
正确写法
int main()
{
int i = 8;
int j = 10;
int k = 9;
if (i < j && j < k)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
执行结果
同理,
10 <= num <= 30这一类写法也比较坑,同样存在上述问题。
这里用到了逻辑操作符&&,下面继续学习。
逻辑操作符
| 逻辑操作符 | 解释 | ||
|---|---|---|---|
! | 逻辑取反运算符 | ||
&& | 与运算符,两侧表达式都为真,则为真,否则为假 | ||
| ` | ` | 或运算符,两侧至少有一个表达式为真,则为真,否则为假 |
逻辑取反运算符
int main()
{
int flag = 0;
if(!flag)
printf("hehe\n");
return 0;
}
执行结果
逻辑与运算符,两边都是真,即为真。
int main()
{
int month = 0;
scanf("%d",&month);
//3~5约是春季
if(month >= 3 && month <= 5)
printf("春季");
return 0;
}
执行结果
或运算符,两边只要有一个真,即为真。
int main()
{
int month = 0;
scanf("%d",&month);
//12、1、2月份是冬季
if(month == 12 || month == 1 || month == 2)
printf("冬季");
return 0;
}
执行结果
短路
C 语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,所以左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况为短路。
if(month >=3 && month <= 5)
Switch
switch语句是一种特殊形式的if...else结构,用于判断条件有多个结果的情况。
switch(expression){
case value1:statement
case value2:statement
default:statement
}
注意:
switch后的expression必须是整形表达式case后的值,必须是整形常量表达式;那么字符类型可不可以?答:可以,因为字符类型存储的是ASCII码,ASCII也是整形。default可以放在任意位置。
输入任意一个整数值,计算除3之后的余数。
int main()
{
int num = 0;
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("余数是 0");
case 1:
printf("余数是 1");
case 2:
printf("余数是 2");
}
return 0;
}
执行结果
发现执行结果与预期不符,这是因为switch语句会一直往下执行,并不会因为满足条件而退出;此时需要break语句协助
int main()
{
int num = 0;
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("余数是 0");
break;
case 1:
printf("余数是 1");
break;
case 2:
printf("余数是 2");
break;
}
return 0;
}
执行结果
case 后面需要有个空格,并且结尾是冒号,而不是分号。