目录
1.语句的基本概念
1.1什么是语句
C语言中由一个分号 ; 隔开的就是一条语句。例如:
printf("hello world");
1+5;
1.2语句分类
(1)表达式语句由一个表达式构成的语句,表达式就是由运算符和操作数组成的式子。
a=5;
2+5;//
(2)函数调用语句,函数调用的时候也会在其后面加上分号,
scanf("%lf\n", &d);
printf("%c\n", a);
(3)控制语句可以控制程序的执行流程,从而实现程序的各种结构方式,包含顺序结构,选择结构,循环结构三种结构,C语言由九种控制语句。
(4)复合语句,使用{ }括起来的就是复合语句。
int mian()
{
int a = 10;
printf("%d", a);
return 0;
}
(5)空语句 ,仅仅只是一个分号,在C语言中是合理存在的。
;
2.C语言的基本结构
2.1基本结构分类
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以使⽤ if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。结构中的判断条件如果不为0的是真,如果为0就为假。
2.2顺序结构
代码从main函数进入程序,按照从上到下的顺序执行程序就是顺序结构。
int main()
{
printf("hehe");
int a = 10;
a = a + 8;
printf("%d", a);
return 0;
}
2.3选择结构
分支语句也叫做判断语句,在满足不同判断条件的情况下,进入不同的分支,执行不同的程序,选择结构就是分支语句构成的,
int main()
{
int a = 0;
scanf("%d", &a);
if (a)
{
printf("hello");
}
else
{
printf("Goodbye");
}
}
上面的程序就是选择结构,a不等于0的时候,括号中的为判断条件,判断条件为真,就执行if下方{ }中程序,a等于0的时候执行else中的程序。经过判断选择一条分支就是选择结构。
2.4循环结构
在经过判断语句判别真假后,进入循环不停的执行循环体中的程序,在经过循环体中的内容和判断条件的作用下,最终跳出循环的程序。当然由于判断条件的错误以及循环体内部数据处理的不当也有可能导致死循环,比如我的判断条件始终为1.
int main()
{
int i = 0;
while (i < 5)
{
i++;
printf("%d ", i);
}
}
上述是一个while()语句组成的循环,当判断条件i=5的时候,得到的结果为假就跳出了循环
3选择结构语句
3.1if语句
3.1.1单分支
单分支if语句形式如下:
if ( 表达式 )
语句
表达式成⽴(为真),则执行语句,表达式不成立(为假),则语句不执⾏。C语⾔中,0为假,非0表示真;表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则执行语句。
举例
输⼊一个整数,判断是否为奇数,代码如下
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
表达式是判断如果余数为1就为真,没有余数就为假。
if语句判断后可以执行多少条语句呢?
举例
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年了\n");
printf("可以去网吧了");
return 0;
}
两者对比看看,不管有没有成年都可以去网吧这是不对的,说明了if语句判断之后,仅仅执行了他后面的一条语句。要执行多条语句怎么办呢?
要执行多条语句的时候需要,怎应该使用代码块。
#include <stdio.h>
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
将两条语句使用{ }括起来,if为假均不执行, 这样就不会漏掉未成年也能去网吧的状况了。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年了\n");
printf("可以去网吧了");
}
return 0;
}
3.1.2双分支结构
双分支结构if语句形式如下:
if ( 表达式 )
语句1
else
语句2
表达式为真的时候执行的是语句1,表达式为假就执行语句2;
如果任意一个数,我们不仅要判断是奇数还要判断是否是偶数,如何判断?代码如下
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("奇数\n", num);
else
printf("偶数\n", num);
return 0;
}
练习
输⼊⼀个年龄,>= 18岁就输出:成年,否则就输出:未成年
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
3.1.3多分支结构
多分支结构形式语句如下:
if (表达式1)
语句1;
else if (表达式2)
语句2;
else if (表达式3)
语句3;
.
.
. //中间也可以有多条else if
.
else
语句3;
#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
{
printf("老年\n");
}
}
3.1.4 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;
}
运行结果如下
等价于下面的
#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;
}
程序的输出为甚么没有结果呢,else是依靠就近原则来找语句的;因此程序开始运行的时候,if(a==1)判断为假的时候程序会直接跳到return 0;处,程序直接结束,要想搞清楚if和那个else匹配建议加上{ },一眼就可以看出。
如果想要打印出haha,就要将else和if这样配对,配对成功了,才能出现你想要的结果啊。
#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;
}
3.2 switch语句
switch常用于多分支语句,在多分支语句的条件下switch更加有优势,因为他的判断需要执行的语句很少就是switch语句和case : 语句再加上一个break;语句。
形式如下
switch (整型表达式)
{
case 整型常量表达式:
语句;
case 整型常量表达式: // 1 1+1 5/5 字符类型也是可以,字符本质上也是整型
语句
default:
语句
}
上面代码中,根据整型表达式 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执行 default 分⽀。
注意
• switch 后的 表达式必须是整型表达式
• case 后的值,必须是整形常量表达式
3.2.1switch语句和if else语句的对比
输⼊⼀个1~7的数字,打印对应的星期几
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
使用switch语句来完成
#include <stdio.h>
int main()
{
int day = 0;
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;
}
使用if else语句来完成上述问题
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
if (day == 1)
printf("星期⼀\n");
else if (day == 2)
printf("星期⼆\n");
else if (day == 3)
printf("星期三\n");
else if (day == 4)
printf("星期四\n");
else if (day == 5)
printf("星期五\n");
else if (day == 6)
printf("星期六\n");
else if (day == 7)
printf("星期天\n");
else
printf("输入错误");
return 0;
}
相比之下switch仅仅只是执行两条语句就可以可以进入分支语句中,但是if else在输出星期四五之后的判断好多次才可以进入分支语句中。
3.2.2 switch语句中的break
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期1\n");
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6n");
break;
case 7:
printf("星期7\n");
break;
}
return 0;
}
当输入1的时候程序的结果如下
原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执行,有可能执行其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束所以在 switch 语句中 break 语句是非常重要的,能实现真正的分⽀效果。当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。因此可以将case看作是入口,break是出口。
3.2.3switch语句中的default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default 子句。