分支与循环基础知识与代码实现(上)
C语言是一门结构化的程序设计语言,这里结构包括三种
1.顺序结构 2.分支结构 3.循环结构。我们现实世界里的问题其实已经可以被电脑用这三种结构及其组合解决。其实在学完这章就可以成为半个程序员了,也可以获得一种新的视角看待我们的世界。
一.分支
1.if else语句
1.1 if()
if 语句表示如果满足条件便执行下面一句或者是代码块中的语句。
语法为:
if(条件){
语句;
}
如果条件为真即成立时,执行语句。条件为假时,跳过当前if语句
C语言中0表示为假,非0表示为真
举例:判断输入是否为奇数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
return 0;
}
1.当if语句只有一行语句是可以不需用加{ }
2.这里返回return 0;
是因为 main 函数的返回值类型是int。
3.这里num % 2 == 1代表此数被2相除余数和1做比较
4.%是一种取模运算符号,也就是获得余数
5. ==和=的区别是
== 是判断是否相等
= 是将右边的值赋给左边
例如
int a=0;
a=5;//将5赋给a
1.2 else
else一般和if连用,大致意思为如果if语句不执行就执行else
语法为:
if(){
语句;
}
else{
语句;
}
这里注意else后没有写条件,这是因为如果else执行的条件是if不执行。
举例:判断一个数是奇数还是偶数
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
当num % 2 == 1这个条件不成立时便执行else下的语句
1.3 if 控制多条语句
举例:
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
printf("未成年\n");
return 0;
}
会发现无论大于还是小于18都会执行未成年这条语句。
这是因为if只能控制它下面的一条语句,如果需要指定执行语句的话需要加上{ }
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18) {
printf("成年\n");
printf("20岁算成年\n");
}
return 0;
}
当加上{ } 时条件不满足便不会执行,不会出现无论怎么样都会执行后面一句。
1.4 if 的嵌套
在某些场景下只进行一次判断还远远不够,需要多次判断。
举例:
int main()
{
int num = 0;
scanf("%d", &num);
if (num > 0) //非负数
{
if (num % 2 == 0)
{
printf("偶数\n");
}
else
{
printf("奇数\n");
}
}
else
{
printf("负数\n");
}
return 0;
}
在判断num的正负性后,再嵌套在if里判断num的奇偶性。
1.5 if 和 else 的匹配问题
if 和 else 匹配有一条规则,else往往会和最近的一个if匹配。
举例:
int main() {
int a = 0;
int b = 1;
if(b==0)
if (a == 0) {
printf("一层\n");
}
else {
printf("二层\n");
}
return 0;
}
猜猜这条代码执行结果时什么?
我想可能“一层”的答案会比较多。
很简单嘛a等于0打印一层然后退出。
但其实结果为:
会发现结果是什么都不打印
让我们来理一下这个代码。
由于视觉效果看起来第一个if和else是一起的,但实际上只是if的嵌套,第二个if嵌套在第一个if里面,所以当判断b时不成立便不会执行后面的语句,直接return 0。
这是因为else往往会和最近的一个if匹配。
这也提醒我们这样的写法会让人有歧义,可读性不高。
其实在第一个if后加一个{ },这样代码就会变得很清楚。
2.switch语句
2.1 switch 语法
switch(整形表达式)
{
case value1:statement1
break;
case value2: statement2
break;
default: statement3
break;
}
switch通过整形表达式结果来判断进入哪个case语句,从而实现了分支。需要注意的是switch中的条件和value都是需要整形表达式的,case和value之间是有空格的。
2.2 switch 与 break
举例:
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;
}
当我们输入相应数字时会打印对应的星期,而不是全部打印,这是因为一旦打印对应的星期便会执行break,break是一个关键字作用是结束跳出循环到return 0。
当去除break时会出现怎样的情况呢?
由于输出是3,它会打印3及以下所有的分支,这种现象被称为break的穿透
2.3 switch中的default
人算不如天算,人不能穷尽算出所有的情况。
default的作用是所有的case都没有进入便执行default。
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;
default :
printf("输出错误\n");
break;
}
return 0;
}
值得一提的是default的位置是不规定的,不一定放在最后,但是似乎形成了规矩default一般放在最后。
完!
接下来可能还有两篇文章写操作符和循环,喜欢的话点点赞呗!