文章目录
一、前言
C语言是结构化的程序设计语言
1.顺序结构
2.选择结构
3.循环结构
生活中无非就是这三种结构:有的人照步就班,有的人面临选择,有的人循环往复
重点讲解选择语句和循环语句及拓展跳转语句
二、什么是语句
//1.C语言中由一个分号隔开的就是一条语句 int main() { printf("hehe\n"); return 0; }
三、分支语句
1.if
语法结构:(表达式):表达式为真则执行,否则不执行;之前有讲过在C语言中0表示假,非0表示真
if(表达式)
语句;
if (表达式)
语句1;
else
语句2;
if(表达式)
语句1;
else if(表达式)
语句2 ;
else
语句3;
看代码:
#include<stdio.h> int main() { int age=20; if(age>=18) printf("成年\n"); else printf("未成年\n"); printf("不能谈恋爱\n"); return 0; }
结果:
成年了还不能谈恋爱,那还得了
说明else没有权力管不能谈爱,这是一条独立的语句
//经过广大男同胞(额…现不包括未成年)的抗议,我们决定修正这条语句,看代码:
#include<stdio.h> int main() { int age = 20; if (age >= 18) printf("成年\n"); else { printf("未成年\n"); printf("不能谈恋爱\n"); } //对于if、else有多条语句时,必须使用{};当然一条语句也可以使用{},也可以不使用 }
结果:
1.
2.
看代码:
#include<stdio.h> int main() { int age = 60; if (age < 18) printf("少年\n"); else if (18 <= age < 26) printf("青年\n"); //结果:青年 //世道变了——60岁的青年(我国的老龄化问题解决了?) //代码逻辑: //if(60<18) - 为假,不执行 //else if(18<=60<26) - 18<=68为真返回1 //else if(1<26) - 1<26为真执行 // printf("青年\n"); return 0; }
//不信谣,不传谣 —— 20世纪90年代以来,中国的老龄化进程加快,我国短时间还不能解决老龄化问题…额…跑题了。
//看代码 - 多分支
#include<stdio.h> int main() { int age = 60; if (age < 18) printf("少年\n"); else if (age >= 18 && age <= 26) printf("青年\n"); else if (age >= 26 && age < 40) printf("中年\n"); else if (age >= 40 && age < 60) printf("壮年\n"); else if (age >= 60 && age <= 100) printf("老年\n"); else printf("老不死\n"); //这里使用了逻辑操作符&& //&&同真为真,其余为假 - 60<26为假,一边为假则为假 //||同假为假,其余为真 return 0; }
看代码 - 悬空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"); //理想中:第1个if和else对齐,它们俩是一对,if(0==1)为假,则执行else,打印haha //结果是不打印 - 就知道没这么简单 - 又是一个坑 //事实上if与else与对齐无关,而是else与最近的那个if匹配 //事实上编译器非常聪明 - 当你写else时它会与它最近的if对齐且匹配 - 注意在以后没有使用平台写代码时(例如:记事本),要注意代码的书写规范 return 0; }
在这里要重点强调代码的规范很重要,其次是代码风格;
有些同学写的代码
更有甚者
再牛x的编译器都救不了你
关于代码风格这里有一本书是值得去看的《高质量C/C++程序》
易淆点
一、
观察1、2代码:
1:
if (condition)
{
return x;
}
return y;
2:
if (condition)
{
return x;
}
else
{
return y;
}
#include<stdio.h> int test1() { if (1) { return 0; } return 1; } int test2() { if (0) { return 0; } else { return 1; } } int main() { test1(); test2(); //这两段代码本质上是一样的,但是书写形式不一样,所造成的代码风格也不一样 return 0; }
二、观察3、4代码:
3:
if (condition)
{
printf(“hehe\n”);
}
printf(“haha\n”);
4:
if (condition)
{
printf(“hehe\n”);
}
else
{
printf(“haha\n”);
}
#include<stdio.h> void test3() { if(1) { printf("hehe\n"); } printf("haha\n"); } void test4() { if(1) { printf("hehe\n"); } else { printf("haha\n"); } } int main() { test3();//hehe haha test4();//hehe //这就是代码书写形式所带来的差异 return 0; }
三、观察5、6代码:
5:
int num = 1;
if (num ==5)
{
printf (“hehe\n”);
}
6:
int num == 1;
if (5 == num)
{
printf (“hehe\n”);
}
先看一个错误代码:
#include<stdio.h> int main() { int num = 3; if (num = 5)//这里不想输出"hehe" - 因为少写了一个=;num被赋值5,为真 - 且编译器无报错现象 - 在以后写代码的过程中,这种代码错误是比较难发现的(输出的结果与预想不符 - 运行时错误) { printf("hehe\n"); } return 0; }
优化后:
#include<stdio.h> int main() { int num = 3; if (5 == num)//以后在写这样的表达式时,尽量把数字写在左边;因为如果少写1个=的情况 - 5=num - err:左操作数必须是左值(语法错误) { printf("hehe\n"); } return 0; }
5、6代码功能是一样的,但经过上面两个代码的分析,6代码更规范
小试牛刀
判断一个数是否为奇数
int main() { int num = 15; if (num % 2 == 1) { printf("奇数\n"); } return 0; }
2.switch
常常用于多分支的场景
switch (整型表达式)
{
语句项;
}
语句项:
case 整型常量表达式:
语句;
case 整型常量表达式:
语句;
… …
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
… …
如果使用if…else if…else if的形式太过复杂
看代码:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int day = 0; //从键盘上输入一个数放到day变量里 scanf("%d", &day); //将day这个值放到表达式中(只能是整型) - day这个值会匹配到下面的case标签并执行标签下的语句 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"); } //发现我们输入3 - 则包括星期三后面的内容也会被输出;输入4 - 则包括星期四后面的内容也会被输出;显然这不是我们想要的结果 return 0; }
改正后:
#define _CRT_SECURE_NO_WARNINGS #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; } //注意:1.switch(整型表达式) //2.case 整型常量表达式: //3.字符是可以做为表达式的,因为它有对应的ASCII码值 //4.case中的整形常量表达式不能相同于其它case中的值 return 0; }
思考break是switch语句中必须有的吗?
如果1-5为工作日;6-7为休息日
#define _CRT_SECURE_NO_WARNINGS #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; } //显然break是根据需要来加的 //在最后一条标签的break还需要加吗? - 不加也不会影响,但是编程好习惯,还是加上 - 防止后期如果还要增加新的case标签时与上一个标签重叠 return 0; }
default子句:
就拿工作日的代码来说,输入一个9或者排除1-7之间的数字 - 这样的数字(错误的数字)有很多 - 我们不可能一一列举出来 - 这时就可以使用default子句
#define _CRT_SECURE_NO_WARNINGS #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; } //注意:1.switch里面并没有规定case标签顺序、default顺序 ,只要符合逻辑 //2.default子句也只能有一个 return 0; }
小试牛刀
#include<stdio.h> nt main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n)//switch允许嵌套使用 { case 1: n++; case 2: m++; n++; break;//这一次break可能就让你与正确答案失之交臂的原因 - 在嵌套switch语句中使用break,break跳出的是自己所在的switch语句 } m++; break; default: break; } printf("m=%d,n=%d\n", m, n);//m=5,n=3 return 0; }