语句
C语言包含5种语句:1. 表达式语句 2.函数调用语句 3.控制语句 4. 复合语句 5. 空句
本文介绍控制语句。
控制语句大体分为三类。
1.条件判断语句也叫分支语句:i语句、switch语句:
2.循环执行语句:do whie语句、while语句、for语句:
3.转向语句:break语句、goto语句、continue语句、return语句。
分支语句(选择判断语句)
if型
判断语句中最基础的类型,逻辑简单。语法结构如下。
单分支
if ()//括号内写判断的内容
{
//大括号括出代码块,都在if语句判断通过后执行
}
多分支
if()
{
}
else if()
{
}
else
{
}//对应位置填入信息与单分支相同
在if判断信息中不能出现连等式(例:19 < a < 40)在C语言中该语法形式不正确,要判断连等式要写为(例:19 < a && a < 40),将连等式分成两个等式进行比较,如要进行且/或的比较时应写为(例:或:19 < a && a < 21 || 10 < a && a < 12)也可以一直用&&将比较式断开进行比较。
if语句可以进行多重嵌套
if()
{
}
else
{
if()
{
}
else
{
if()
{
}
else
{
}
}
}
如上述代码所示,这种嵌套非常繁琐,下列是简化语句
if()
{
}
else if()
{
}
else if()
{
}
else if()
{
}
else if()
{
}
两者表达效果相同,但下面的一种要简便很多。
在C语言中不是通过缩进来控制else所对应的if,else直接对应的是离它最近的没有else对应的if。
if()
if()
{
printf();
}
else
{
printf();
}
例如这一段代码中else对应的是第二个if而不是第一个if,所以在编写代码时一定要注意自己的语言风格,让编写出来的代码能被所有人看懂。
switch型
语法结构如下
int main(){
int day = 0;
scanf("%d",&day);
switch (day)//括号中是要判断的函数
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
这之中不同的case相当于提供了入口,输入1就进入case1,以此类推。注意:如果一段case内的代码执行完后不加break,那么就会接着向下运行,而不是直接跳出这段。由此可以推断出,我们可以让多个case执行同一个结果
int main(){
int day = 0;
scanf("%d",&day);
switch (day)//括号中是要判断的函数
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("周末\n");
break;
}
return 0;
}
上面这一段就是多组case都执行一段程序。
关键字default
用法:一般与switch连用,用于当缺少输入信息时程序的入口,一般放在程序末尾。例子如下。
int main(){
int day = 0;
scanf("%d",&day);
switch (day)//括号中是要判断的函数
{
case 1:
printf("");
break;
case 2:
printf("");
break;
default
printf("");
break;
}
return 0;
}
循环语句
while循环语句
运行逻辑如下。
expr (evaluate expressions):"表达式求值"。
stmt :预处理语句。
关键字:break和continue
break:跳出循环语句,即使循环条件没有达到结束的条件,也可以强制退出循环。注意:break是永久退出当前循环。例如:
int a = 0;
int main()
{
while(i < 10)
{
if(5 == i)
break;
i ++;
printf("%d\n",i);
}
return 0;
}
continue用于跳过循环中的某次迭代,即使循环条件没有达到结束的条件,也可以跳过当前迭代,继续执行下一次迭代。注意:跳过当前迭代,是跳过后续代码,直接进行下一次的判断。例如:
int a = 0;
int main()
{
while(i < 10)
{
if(5 == i)
continue;
i ++;
printf("%d\n",i);
}
return 0;
}
关键字:getchar和putchar
getchar:从外部获取(输入)一个字符。注意:获取字符不是从键盘上直接获取,而是从缓存区获取。
putchar:向外部输出一个字符。
语法如下
int ch = getchar();
putchar(ch);
获取的值是输入字符的ASCII码值所以用int定义ch。输出也是由ASCII码值转化为对应字符再输出。
注意:getchar一次只能读取一个字符,如果想要读取多个字符可以通过循环来实现,类比于scanf,同时,如果遇到空格或EOF后会停止读取。
int main()
{
char password [20];
printf("请输入:");
scanf ("%s ",password);
printf("请确认(Y/N):");
int ch = getchar();
if ('Y' == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
如果直接执行上述程序会在输入后直接显示确认失败,原因是scanf不会读取‘\n’也就是回车,所以在读取完回车之前的数值后会将‘\n’留在缓存区中,这时候我们就要先清空缓存区再进行输入。解决方案如下。
int main()
{
char password [20];
printf("请输入:");
scanf ("%s ",password);
getchar();//处理缓存区中剩下来的'\n'
printf("请确认(Y/N):");
int ch = getchar();
if ('Y' == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
但这段代码还是有潜在的错误,之前我们提到了scanf不会读取回车和空格,这一段只是解决了回车的问题,但空格还没有解决。解决方案也很简单,用一个while循环即可,例子如下。
int main()
{
char password [20];
printf("请输入:");
scanf ("%s ",password);
while((getchar()) != '\n');//让getchar一直读取缓存区中的信息,直到将回车也清除
;//空语句,只是为了符合语法
printf("请确认(Y/N):");
int ch = getchar();
if ('Y' == ch)
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
for循环语句
运行方式如图。
语法结构:for(表达式1;表达式2;表达式3)用分号隔开。
表达式1:初始换部分(初始化函数)
表达式2:判断部分(进行循环的条件)
表达式3:调整部分(对函数的操作)
continue: 在for循环中会跳过continue后面的代码,直接取循环的调整部分。
break:与在while中用法一致,都是直接终止循环。
注意:不要在循环内部写对循环变量的修改,这样可能会使得循环变成死循环。
for循环中三个部分都可以省略,但要自己理清思路,再决定是否省略,初学阶段不建议省略,因为省略后大概率变为死循环。例:
正常代码:
int main(){
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3 ;j++)
{
printf("hehe\n");
}
}
return 0;
}
会输出9个hehe。
省略后:
int main(){
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3 ;j++)
{
printf("hehe\n");
}
}
return 0;
}
原因:未省略时,每次i循环结束进入j循环都会将j重新赋值为0,所以一共进行3*3=9次循环。
省略后,第一次i循环结束后进入j循环便将j最终变为了3,第二次进入后直接满足不循环的条件,所以一共进行1*3+2*0=3次循环。