分支和循环语句
一.什么是语句
C语言语句可以分为以下五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
控制语句用于控制程序执行流程,以实现程序各种结构方式,它们由特定的语句定义符组成,C语言又九种控制语句。
控制语句可以分为以下三类:
1.条件判断语句:也叫分支语句:if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
二.分支语句(选择结构)
2.1 if语句
语法结构:
if(表达式)
{
语句;
}
else if(表达式)
{
语句;
}
else if(表达式)
{
语句;
}
else
{
语句;
}
简单形式的if语句可以让程序去选择执行一条语句,或者跳过这条语句。C中还提供了if else 的形式,可以在两条语句之间做选择。if语句的语法如上图所示,值得注意的是,if后小括号中的是表达式,也是if语句的判断条件,假如括号内的条件为真,则执行if语句下代码块(大括号中的内容)中的代码,如果条件为假,则跳过if语句后的代码快,执行下一个语句。
值得注意的是,在C语言中,0为假,非0为真。例如在下面的代码,因为if语句后小括号中是1,非0,所以条件为真,执行if后代码块中语句的内容,打印出来魏浅真漂亮这几个字。假如if(0),因为0为假,那么就会执行else后的代码块中语句的内容,打印出来魏浅超漂亮这几个字。
#include <stdio.h>
int main()
{
if(1)
{
printf("魏浅真漂亮");
}
else
{
printf("魏浅超漂亮");
}
return 0;
}
在C语言中,一个大括号中为一个代码块,而if紧跟的代码块中是在if后表达式为真的条件下,所有要执行的语句,假如不加大括号,那么if仅仅会执行紧跟的一条语句。例如在下面的语句当中,第一个if后只会打印出魏浅真漂亮,而不会打印魏浅超可爱,因为在无大括号的情况况下紧紧会执行if后的第一条语句。而在有大括号的情况下,两条语句都会被执行。所以第二个if后会打印出,魏浅真漂亮和魏浅真可爱。
#include <stdio.h>
int main()
{
if(1)
printf("魏浅真漂亮\n");
printf("魏浅超可爱\n");
if(1)
{
printf("魏浅真漂亮\n");
printf("魏浅超可爱\n");
}
return 0;
}
2.1.1 悬空else
在if else语句中,if会和最近的else相匹配,与格式没有什么关系。如下图所示,该代码输出的结果是打印hehe,而不是haha,因为最近的if会和最近的else相匹配,也就是if(1 == a )这个语句在这个代码中是无作用的,if(2 == b)和下面的else,组成了一个if else的结构,所以会打印hehe,而不是打印haha。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(1 == a)
if(2 == b)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
2.1.2 getchar()和putchar ()
getchar()函数不带任何的参数,它从输入队列中返回下一个字符。例如下面的语句读取下一个字符输入,并把该字符的值赋给变量ch。
putchar()函数打印它的参数。例如,下面的语句把之前赋给ch的值作为字符打印出来:
由于getchar()和putchar()函数只处理字符,getchar()是输入字符的函数,putchar()是输出字符的函数,所以在处理字符的时候,它们比更通用的scanf()和printf()函数更快,更简洁。而且getchar()和putchar()不需要转换说明,因为它们只处理字符。
getchar()工作原理实际上是,输入设备——内存缓冲区——getchar()这样一个顺序。getchar()每次会从内存缓冲区中读取一个字符,当键盘输入得字符都存到缓冲区内,一旦输入回车,getchar就进入缓冲区去读取字符,一次只返回一个字符作为getchar函数得值,如果有循环或者足够多的gerchar()语句,就会依次读出缓冲区中所有的字符直到’\n’,当输入一系列字符被依次读出来,是因为循环的作用getchar在内存缓冲区中反复读取,而不是getchar一次能读取多个字符,getchar一次只能读取一个字符的。
getchar一个很重要的作用是用来清楚scanf输入后,内存中的缓存。在利用scanf输入后,最后在键盘上按的回车键,会被内存中呈现为’\n’的形式,而这个’\n’是无法赋值给整型或者浮点数的,所以就会在缓冲区留下一个垃圾字符。在下一次scanf输入时,scanf会从内存中直接拿走这个’\n’,或者也可能拿走中间键盘上敲的的空格键,使输入出现意想不到的情况,所以就不要用getchar清理内存中无用的缓存。假如有多个无用字符为缓存,可用while语句去清理多余的缓存,该语句的含义为当getchar从内存中得到的字符不为回车时(回车是键盘上最后一个被输入给内存的字符),循环继续进行,输出空语句。当缓存中有多个无用字符时,可以用这样的形式来清理缓存,保证下一次scanf正常输入。
ch = getchar();
该语句和下面语句的效果相同:
scanf("%c",&ch);
putchar(ch);
该语句与下面的语句效果相同:
printf("%c",ch);
while((getchar())!='\n')
{
;
}
getchar还有一个重要作用,就是在多组输入的时候,可以利用while循环语句来判断是否还要继续输入,(ch=(getchar())!=EOF)的语句含义是判读获取的字符是否为空,假如不为空则继续输入,为空则结束输入,而在VS编译器中,用ctrl+z的形式来告诉编译器要结束多组输出了。注意不等号!=的运算优先级要高于赋值运算符=,所以要给ch=getchar()添加小括号来保证优先运算。