前言:
在我们生活中,无论做什么事,都是存在结构化的,分为顺序结构,选择结构,循环结构,要不是其中一种,要不就是多种有机组合。
顺序结构:从头做到尾,环环相扣。
选择结构:从头开始,遇到选择后就分支。
循环结构:没头没尾,从开始做就一直做下去。
而C语言就可以将这三种结构描述出来,所以我们称C语言是结构化的程序设计语言。
什么是语句?
C语言语句可以分为5种:
1.表达式语句。举例:2+3;
2.函数调用语句。举例:调用add函数,add();3.控制语句。本节讲解。
4.复合语句。
5.空语句。就是单单一个;
控制语句用于控制程序执行的流程,以实现程序的各种结构方式(C语言支持三种:顺序结构,选择结构,循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可以分为三类:
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
1.分支语句(选择结构)
1.1 if语句
语法结构:
//单分支
if(表达式)//表达式为真(C语言中,0为假,非0为真),执行下面的语句,为假不执行
语句;//这里的语句如果是一条可以不用{}括起来,多条的时候用{}括起来,一个{}是一个代码块,里面就是语句列表
//双分支
if(表达式) //表达式为真,执行语句1,表达式为假,执行语句2
语句1;
else
语句2;
//多分支
if(表达式1) //表达式1为真,执行语句1,为假,执行语句2
语句1;
else if(表达式2)//表达式1为假,就会进入此分支,判断表达式2是否为真,为真执行语句2,为假进入else,执行语句3
语句2;
else if(表达式*)//不断判断真假,对应是否执行,是否跳向下一组分支
语句*;
else
语句3;
代码演示:
#include <stdio.h> //分支语句 int main() { int age = 0; scanf("%d", &age); //输入 //单分支 /*if (age < 18) printf("未成年\n");*/ //双分支(只会执行其中一条) /*if (age < 18) { printf("未成年\n"); printf("不能吸烟\n"); } else { printf("成年\n"); }*/ //多分支(只会执行其中一条) if (age < 18) { printf("未成年\n"); } //else if (18 <= age < 30)//这()里面的表达式不是正确的,这里执行的是18 <= age这条,输入的值大于等于18就会执行 //{ // printf("成年\n"); //} //改正 else if (18 <= age && age < 30) { printf("青年\n"); } else if (30 <= age && age < 60) { printf("中年\n"); } else if (60 <= age && age < 90)//如果这里的数据是严丝合缝的,那么&&前面的语句是可以去掉的,如果不是就不可以去掉 { printf("老年\n"); } else { printf("老寿星\n"); } return 0; }
1.1.1 悬空else
在代码中排版很重要,要规范写代码。
{ }的使用可以使代码的可读性提高,建议使用。
代码演示:
#include <stdio.h> int main() { //这个代码什么都不会输出,条件判断的时候是假,不会进入 //int a = 0; //int b = 2; //if (a == 1) // if (b == 2) // printf("hehe\n"); //else//注:在没有{}的情况下,else跟离自己最近的if匹配(这里的else跟打印hehe的if匹配)。所以代码的排版很重要 // printf("haha\n"); //这样的排版才是合理的 /*int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hehe\n"); else printf("haha\n");*/ //或者 int a = 0; int b = 2; if (a == 1) { if (b == 2) printf("hehe\n"); } else//这个else与if (a == 1)进行匹配,因为上一个if是代码块中的 { printf("haha\n"); } return 0; }
1.1.2 if书写形式的对比
举例://代码1
这个代码实现进行条件判断,如果条件为真,就返回x,如果条件为假,继续往下执行,返回y。
if (condition) { return x; } retrun y;
//代码2
这个代码和代码1是一样的,但是这个使用了{ },可读性高。
if (condition) { return x; } else { retrun y; }
//代码3
int num = 0; if(num == 5) printf("hehe\n");
//代码4
int num = 0; if(5== num) printf("hehe\n");
代码3和代码4进行对比。代码3,f(num == 5)万一少一个等号就变成了赋值语句,编译器不报错,但是改变了代码的本意。对比代码4,if(5== num)万一少一个等号就会报错。这样可以避免失误。这个技巧用于常量与变量对比,表达式与常量不用这样写,少写一个等号就会提示出来。
代码2和代码4更好,逻辑更加清晰,可读性高。
1.1.3 练习
(1)判断一个数是否为奇数
#include <stdio.h> int main() { int n = 0; scanf("%d", &n); //判断 if (n % 2 == 1)//这里的前后换不换是一样的,因为这里的是表达式,如果丢一个=代码是编不过去的 printf("奇数\n"); return 0; }
(2) 输出1~100之间的奇数
#include <stdio.h> int main() { //法一: /*int i = 1; while (i < 100) { if (i % 2 == 1) printf("%d ", i); i++; }*/ //法二(这个代码是有规律的,所以这样可以,这个代码的效率比法一高) int i = 1; while (i < 100) { if (i % 2 == 1) printf("%d ", i); i+=2; } return 0; }
1.2 switch语句
switch语句也是一种分支语句,常常用于多分支情况。
语法:
switch(整形表达式)
{
case 整型常量表达式:
语句;
break;
default:
语句;
break;
}
1.2.1 switch语句重点内容注意点及代码举例
注:
case:case(),括号里面必须是整型常量表达式,语句后面可以写多个语句,用{}括起来就可以合法使用。case语句是没有顺序的要求,只要能正常处理问题就行,按照逻辑来讲先处理合法在处理不合法。
break:如果case语句没有加break,代码会一直往后走,直到跑完整个代码或者遇见break结束,加上break才会在打印完跳出循环。
default:如果代码在执行的时候没有跟任何一个case语句匹配,就会走default语句。default语句是处理非正常语句,可以放在任何可以合法放case语句的地方。
举例:
输入1~7其中一个数,输出对应的星期几
方法1:
#include <stdio.h> int main() { int day = 0; scanf("%d", &day); if (1 == day) printf("星期一\n"); else if (2 == day) printf("星期二\n"); else if (3 == day) printf("星期三\n"); else if (4 == day) printf("星期四\n"); else if (5 == day) printf("星期五\n"); else if (6 == day) printf("星期六\n"); else if(7 == day) printf("星期天\n"); return 0; }
方法2:
#include <stdio.h> int main() { int day = 0; scanf("%d", &day); switch (day)//注:()里面必须是整形表达式 { case 1://注:case后面必须是整型常量表达式 printf("星期一\n");//case语句后面可以写多个语句,用{}括起来就可以合法使用 break;//如果没有break,代码还会往后走,直到遇见break结束或者跑完整个代码,加上break才会在打印完跳出循环 case 2://case语句是没有顺序的要求,只要能正常处理问题就行,按照逻辑来讲先处理合法在处理不合法 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;//如果没有default语句,理论上这个break是可以省略的,但是如果将来另外的人接手这个代码, //给后面再加一个case语句遗漏了这个break,就会出现bug(职业素养问题) default://如果输入的数字都无法跟前面的case语句匹配,就会走这个语句,处理非正常语句 printf("输入错误\n"); break; } return 0; }
举例:
如果输入1~5输出工作日,6、7输出休息日
#include <stdio.h> 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; default: printf("输入错误\n"); break; } return 0; }
1.2.2 练习(读代码给出结果)
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1:m++; case 2:n++; case 3: switch (n) { case 1:n++; case 2: { m++; n++; break; } } case 4: m++; default: break; } printf("m = %d, n = %d", m, n); return 0; }
答案:m = 5,n = 3