C语言是结构化的程序设计语言,这无非也就包含了三种结构,分别是顺序结构、选择结构、循环结构。这三种结构从字面上来看都不难理解,
所谓顺序结构就是有先后之分,要先干什么,后干什么,比如我要写代码就要先打开电脑。
而选择结构就是有不同的选择,比如我今天可以选择努力学习写代码,也可以躺平摆烂睡大觉,这就是选择。
最后的循环结构可以用一些实际的例子来理解,这就好像学习一样,需要日复一日,不断重复。
在C语言中,代码是有顺序的,不需要着重讲解。而分支语句和循环语句是接下来要着重讲解的,他们分别对应着选择结构和循环结构。
在C语言中由一个分号隔开的就是一条语句。比如:
- printf("Hello,world\n");
-
- 1+2;
-
- ; //空语句
分支语句包括 if 语句和 switch 语句。
=========================================================================
语法结构
在C语言中 0 表示假,非零表示真。
if (表达式)
语句;
这个第一种写法中,表达式中的内容如果为真,则执行下面的语句。如果为假,则不执行。
if (表达式)
语句1;
else
语句2;
这种写法中相比第一种多了 else ,相当于是多了一条路可以走。如果 if 后的表达式为真,则执行语句1,如果为假,则执行语句2。
当然也可以实现多分支:
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
当表达式1为真,则执行语句1。如果表达式1为假,则继续向下看表达式2,如果表达式2为真,则执行语句2,否则就只能执行语句3。
---------------------------------------------------------------------------------------------------------------------------------
写法注意
- #include
-
- int main()
- {
- int age = 20;
-
- if (age >= 18)
- printf("成年\n");
- else
- printf("未成年\n");
- printf("不能谈恋爱\n");
-
- //成年
- //不能谈恋爱
-
- return 0;
- }
当这种写法运行时得到的结果是:
成年
不能谈恋爱
这和最开始设想的是不相符的。原因在于 if else 都指默认执行后面的一条语句,而这段代码中第二个打印被认为是独立的。实际是这样的
- #include
-
- int main()
- {
- int age = 20;
-
- if (age >= 18)
- printf("成年\n");
- else
- printf("未成年\n");
-
- printf("不能谈恋爱\n");
-
- return 0;
- }
如果想要打印两条,那么就需要加入大括号括起来,这样括起来的部分就会被整体执行了。
- #include
-
- int main()
- {
- int age = 20;
-
- if (age >= 18)
- {
- printf("成年\n");
- }
- else
- {
- printf("未成年\n");
- printf("不能谈恋爱\n");
- }
-
- //成年
-
- return 0;
- }
这样写出来的代码执行起来输出的就是最开始想要的那样了。
这是对于语句需要注意的地方,另外还有表达式中需要注意的。
- #include
-
- int main()
- {
- int age = 60;
-
- if (age < 29)
- printf("青年\n");
- else if (29 <= age < 30)
- printf("中青年\n");
-
- //中青年
-
- return 0;
- }
这时60岁得出的结果却是中青年,显然是不对的。原因在于 else if 表达式判断逻辑中,是先判断前部分 60 >= 29 ,得出结果为真,真就是1,然后判断后半段 1 < 30 得出结果为真,执行下面语句,最终输出为中青年。所以这种写法是不对的,要想表达原本的效果,应该使用操作符 && 来完成操作。
- #include
-
- int main()
- {
- int age = 60;
-
- if (age < 29)
- printf("青年\n");
- else if (age >= 29 && age < 39)
- printf("中青年\n");
- else if (age >= 39 && age < 49)
- printf("中年\n");
- else if (age >= 49 )
- printf("中老年");
-
- //中老年
-
- return 0;
- }
这里用到了操作符 && 后,表达的含义就是大于29且小于39...这样就可以如预想的那样执行了。同时也可以借助这段代码了解到,可以出现多个 else if 从而实现多分支的目的。
---------------------------------------------------------------------------------------------------------------------------------
if 与 else 匹配问题
- #include
-
- int main()
- {
- int a = 0;
- int b = 2;
-
- if (a == 1)
- if (b == 2)
- printf("hello\n");
- else
- printf("world\n");
-
- return 0;
- }
这段代码最终输出的结果是什么呢?答案是什么都没有。
else 只与距离最近的 if 匹配,也就是说这段代码的逻辑应该是这样的
- #include
-
- int main()
- {
- int a = 0;
- int b = 2;
-
- if (a == 1)
- if (b == 2)
- printf("hello\n");
- else
- printf("world\n");
-
- return 0;
- }
这也从侧面反映了,代码的书写是需要规范的。甚至可以更清晰一些,给上大括号。
- #include
-
- int main()
- {
- int a = 0;
- int b = 2;
-
- if (a == 1)
- {
- if (b == 2)
- {
- printf("hello\n");
- }
- else
- {
- printf("world\n");
- }
- }
-
- return 0;
- }
=========================================================================
当想要实现多分支时,一直重复使用 else if 太过于繁琐了,这时就可以使用 switch 语句。
---------------------------------------------------------------------------------------------------------------------------------
语法结构
switch (整形表达式)
{
语句项;
}
而语句项中都是一些 case 语句
case 整形常量表达式:
语句;
---------------------------------------------------------------------------------------------------------------------------------
break
在 switch 语句中,case 就代表了入口,而 break 就代表了出口。
- #include
-
- int main()
- {
- int day = 0;
-
- scanf("%d", &day);
-
- switch (day)
- {
- case 1:
- printf("星期一\n");
- case 2:
- printf("星期二\n");
- case 3:
- printf("星期三\n");
- case 4:
- printf("星期四\n");
- case 5:
- printf("星期五\n");
- case 6:
- printf("星期六\n");
- case 7:
- printf("星期日\n");
- }
- return 0;
- }
这时当输入1,得到的输出结果会是
星期一
星期二
星期三
星期四
星期五
星期六
星期日
当输入2,得到
星期二
星期三
星期四
星期五
星期六
星期日
这样达不到选择分支的目的。所以要在每个 case 语句项最后加上 break 跳出去,是相当于出口的作用,这样就可以达成目标了。
- #include
-
- 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;
- }
这样就不会将后面 case 语句项一起顺序执行出来了。
case 语句项后面需不需要加 break 不是必须要求的,是根据需求决定的。例如下段代码:
- #include
-
- 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 语句项中加入了 break 反而达不到想要的效果。
--------------------------------------------------------------------------------------------------------------------------------
default
依旧以上段代码为例,只有1-7的入口,但如果输入其他数,程序就不会反应,default 就可以解决。
- default:
- printf("输入错误");
- break;