目录
C语言中语句分类
分支语句(选择结构)
一、if……else 语句
?二、switch语句
?总结
C语言中语句分类
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
?C语言中的语句都是以 分号(;) 结束的。
??? int a = 10; ?? ?int b = 20; ?? ?int c = 0; ??? int c = a + b; //表达式语句
分号前面什么都不写就是一条空语句。
使用C语言提供的函数或调用自定义函数,都是函数调用语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
分支语句(选择结构)
前面已经了解了C语言中的分支语句:
- if……else 语句
- switch????? 语句
再详细的阐述一下分支语句
一、if……else 语句
1、语法结构
if(表达式)
??????? 语句;
表达式为真,则执行语句,表达式为假,则不执行语句(什么也不输出)。
if(表达式)
??????? 语句1;
else
??????? 语句2;
表达式为真,则执行语句1,表达式为假,则执行语句2。
只执行其中的一条语句。
if(表达式1)
??????? 语句1;
else if(表达式2)
??????? 语句2;
else
??????? 语句3;
- 表达式1为真,则执行语句1。
- 表达式1为假,表达式2为真,则执行语句2。
- 表达式1和表达式2都为假,则执行语句3。
三条语句只会执行其中的一条语句。
C语言中:0表示假,非0表示真
?2、代码演示:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
return 0;
}
表达式为真:
表达式为假:
?
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
表达式为真:
表达式为假:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else if (age >= 18 && age < 30)
printf("青年\n");
else if (age >= 30 && age < 50)
printf("壮年\n");
else if (age >= 50 && age < 90)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
?运行结果:
?多分支简化后的代码:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("少年\n");
else if (age < 30)
printf("青年\n");
else if (age < 50)
printf("壮年\n");
else if (age < 90)
printf("老年\n");
else
printf("老寿星\n");
return 0;
}
第一种写法可读性更好一些。
?3.、悬空else
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
运行结果:
从运行结果可以看到,程序执行后什么都没有打印。
代码分析:
因为 int a = 0,所以表达式1(a==1)为假,程序不会执行 if( b == 2) 语句。但是else 是与 if( b == 2)匹配的。只有表达式1(a==1)为真时才会执行? if( b == 2) 语句,所以程序执行后什么也不输出。
else的匹配:else是和它离的最近的 if 匹配的。
补充:C语言中:
- = 是赋值运算符
- ==是等号运算符,判断值是否相等。
加上{}可以使这段代码更加清晰:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
?4、 if 语句书写形式对比
if(表达式)?? 表达式可以是常量也可以是变量
int age = 0; ?? ?scanf("%d", &age); ?? ?if (age) ?? ?{
?? ?}
如果条件成立(表达式为真),要执行多条语句,应该使用代码块(使用{ }括起来)
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以谈恋爱\n");
}
else
{
printf("未成年\n");
}
return 0;
}
运行结果:
这段代码中 else 后面也可以不加大括号,建议不管 if 后面有几条语句都加上大括号,加上不会出错,不加有时候写代码容易出错。(看个人习惯)。
看下面的代码:
#include<stdio.h>
int main()
{
int a=0;
scanf("%d", &a);
//代码1
if (a) {
printf("hehe\n");
}
printf("haha\n");
//代码2
if (a)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
return 0;
}
代码1与代码2执行结果相同,a为0打印haha,a为非0打印hehe。
但是我们可以发现,代码2的可读性比代码1的更好一些。
?5、易错点
?? if(表达式)????????表达式为:判断是否满足条件,容易写成数学中的形式。
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
//第一种:
if (age >= 18 && age < 40)
{
printf("1:呵呵\n");
}
//第二种:
if (18 <= age < 40)
{
printf("2:哈哈\n");
}
return 0;
}
表达式为真:
看到这可能有人就会认为这两段代码都是正确。但真的都是正确的吗?
再看一下表达式为假:
第二种写法语法上没有错误,但是逻辑上不满足要求。
18 <= age < 40 :先计算 18<=15(此时输入的age为15),结果为0(假);再计算0<40,结果为1(真),所以才会打印 2:哈哈。
?? if(表达式)????????表达式为:判断常量与变量值是否相等,容易将两个等号,写成一个等号。
#include<stdio.h>
int main()
{
//代码1
int num = 10;
if (num == 5)
{
printf("hehe\n");
}
//代码2
int num = 10;
if (5 == num)
{
printf("hehe\n");
}
return 0;
}
有时候写条件判断时容易写成下面这种:
#include<stdio.h>
int main()
{
//代码1
int num = 10;
if (num = 5)
{
printf("hehe\n");
}
return 0;
}
写成这样语法是正确的,但是所表达的含义就不同了。
代码分析:if (num = 5) 将5赋给num,所以表达式永远为真,打印 hehe。
这种写法不容易找到错在哪。
?
但是如果写成下面这种:
#include<stdio.h>
int main()
{
//代码2
int num = 10;
if (5 = num)
{
printf("hehe\n");
}
return 0;
}
代码执行结果:
?代码2这种如果漏写了一个 = 编译器就会报错,很容易知道错在哪里。
写if(表达式),如果表达式是判断常量与变量值是否相等,建议写成 if(常量==变量)这种形式。??? 例 :if(5==num)
?6、 了解了 if....else 语句,做一道题感受一下分支语句
判断一个数是奇数还是偶数。
#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;
}
代码分析:
% 取模运算符。是计算两个整数相除后的余数。
一个整数除2,余数为0则是偶数,余数为1则是奇数。
运行结果:
?
?二、switch语句
switch语句也是一种分支语句。 常常用于多分支的情况。
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
写成 if...else if ...else if 的形式太复杂,那就得有不一样的语法形式。
switch(整型表达式)
{
??????? 语句项;
}
case 整型常量表达式:
??????? 语句;
注:case 与整型常量表达式之间要有空格。
?????? case 后面必须跟整型常量表达式,可以是整数,也可以是字符。
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
switch中执行case语句:
- switch(表达式),表达式是几,switch就是几开始执行。
- 如果case语句后面没有break,则程序会一直执行,直到遇到break 或执行完case语句才会跳出switch语句。
(1)case后面跟整数:
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
运行结果:
?
有时候我们的需求变了:
- 输入1-5,输出的是“weekday”
- 输入6-7,输出“weekend”
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
运行结果:
?
- 如果表达的值与所有的case后面的整型常量表达式的值都不匹配,结果就是所有的语句都被跳过。 程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。
- 如果不想忽略不匹配所有标签的表达式的值,可以在switch语句列表中增加一条default子句, 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置。
- default子句虽然可以写在switch语句中任何位置,但一般是将它写在所有case语句的最后。
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default :
printf("输入错误,请输入1~7的数字\n");
}
return 0;
}
运行结果:
?
?写一个简单的计算器
(2)case后面跟字符:
#include<stdio.h>
int main()
{
int num1=0, num2=0,sum=0;
char ch;
printf("请输入要计算的两个整数与运算符(+、-、*、/),输入时不要加空格\n");
scanf("%d%c%d", &num1, &ch, &num2);
switch (ch)
{
case '+':sum = num1 + num2;
printf("%d+%d=%d\n", num1, num2, sum);
break;
case '-':sum = num1 - num2;
printf("%d-%d=%d\n", num1, num2, sum);
break;
case '*':sum = num1 * num2;
printf("%d*%d=%d\n", num1, num2, sum);
break;
case '/':sum = num1 / num2;
printf("%d/%d=%d\n", num1, num2, sum);
break;
default:printf("输入错误,请按要求重新输入\n");
break;
}
return 0;
}
运行结果:
?总结
再识C语言(一)主要详细的阐述了C语言中的选择结构(分支语句)。
再识C语言这个系列会继续学习C语言,将会更进一步的阐述C语言的知识。
|