目录
5.4 switch语句中的case和default的顺序问题
C语言是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们日常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。
我们可以用if、switch来实现分支,用while、for、do while实现循环。
1.if语句
1.1if语法形式
if(表达式)
语句;
当表达式为真,则语句执行;当表达式为假,则语句不执行
在C语言中,0为假,非0为真。
例子:输入一个整数,判断是否为奇数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("奇数\n");
return 0;
}
1.2else
如果一个数不是奇数,那就是偶数。如果任意一个整数我们要判断是奇数还是偶数,该怎么表示呢?这时我们就需要用到if...else语句了。
语法形式
if(表达式)
语句1;
else
语句2;
例子:输入一个整数,判断是否为奇数,如果是奇数就打印奇数,否则打印偶数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
printf("奇数\n");
else
printf("偶数\n");
return 0;
}
练习:输入一个年龄,>=18岁就输出成年,否则就输出未成年。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
1.3分支中包含多条语句
默认情况下,if和else只控制一条语句,如果要控制多条语句,应该用大括号括起来,这样就可以控制多条语句了。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("可以饮酒\n");
}
else
{
printf("未成年\n");
printf("不可以饮酒\n");
}
return 0;
}
1.4嵌套if
在if...else语句中,else可与另一个if语句连用,构成多重判断。
例子:要求输入一个整数,判断输入的整数是0,还是正数,负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("这个数是0\n");
else
{
if (num > 0)
printf("这个数是正数\n");
else
printf("这个数是负数\n");
}
return 0;
}
也可以简写成以下代码
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("这个数是0\n");
else if (num > 0)
printf("这个数是正数\n");
else
printf("这个数是负数\n");
return 0;
}
再例如:输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数,则输出非正数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num < 0)
printf("非正数\n");
else if (num % 2 == 1)
printf("奇数\n");
else
printf("偶数\n");
return 0;
}
练习:输入一个人的年龄,如果年龄在18岁以下,输出少年;如果年龄在18~44,输出青年;如果在45~59,输出中老年;如果在60~89,输出老年;如果在90以上,输出老寿星。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num < 18)
printf("少年\n");
else if (num <= 44)
printf("青年\n");
else if (num <= 59)
printf("中老年\n");
else if (num <= 89)
printf("老年\n");
else
printf("老年\n");
return 0;
}
1.5悬空else问题
如果有多个if和else,可记住这样一条规则,else总是跟最近的匹配。
我们可以看以下例子
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
以上代码没有输出任何内容,else与第二个if匹配,在代码中第一个if条件没有实现,故下面的代码没有机会执行,所以没有输入任何内容。
我们可以通过以下修改实现代码运行
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
}
else
printf("haha\n");
return 0;
}
将else与第一个if匹配,将第二个if作为第一个if的条件就可以实现输出haha
2.关系操作符
C语言中用于比较的表达式,称为关系表达式,里面使用的运算符就称为关系操作符,主要有以下6个
<
>=
<=
==:相等运算符
!=:不相等运算符
关系表达式通常返回0/1,表真假
关系表达式常用于if/while结构
注:多个关系运算符不宜连用
i<j<k
这是合法表达式,不会报错,但通常达不到想要的结果,即不保证j的值在i和k之间。
因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。
(i<j)<k
上面式子中,返回0/1,所以最终是0/1与k进行比较。
若想达到判断j的值是否在i和k之间,应写成i<j&&j<k
例子:输入一个年龄,如果年龄在18~36输出青年
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (18 <= age <= 36)
printf("青年\n");
return 0;
}
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18 && age <= 36)
printf("青年\n");
return 0;
}
我们在第一个代码里输入10结果也可以输出青年,这是由于代码先计算18≥10?结果返回0 ,再和36比较大小。10<36,故返回1,即可执行操作,最终打印青年。
3.条件操作符
条件操作符也叫三目操作符,需接受三个操作数。形式如下
exp 1? exp2: exp 3
计算逻辑:若exp1为真,则计算exp2;若exp1为假,计算exp 3 。
练习1:使用条件操作符表示以下代码
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d", b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = (a > 5 ? 3 : -3);
printf("%d", b);
return 0;
}
练习2:使用条件表达式实现两个数中较大值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m=(a > b ? a : b);
printf("%d", m);
return 0;
}
4.逻辑操作符:&&,||,!
作用:提供逻辑判断功能,用于构建更复杂的表达式。
4.1逻辑取反运算符
改变单个表达式真假
例子:有个变量叫flag ,若flag 为假,打印do something
#include <stdio.h>
int main()
{
int flag = 0;
scanf("%d", &flag);
if (!flag)
printf("do somrthing");
return 0;
}
若flag 为真,!flag 为假,不执行操作;若flag 为假,!flag为真,执行操作。
以上代码的意思是当flag 为假的时候执行操作。
4.2逻辑与运算符(并且)
两表达式为真,则为真;若有一假,则为假。
例子:月份3~5是春天
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if (month >= 3 && month <= 5)
printf("春天\n");
return 0;
}
4.3逻辑或运算符(或者)
两侧至少有一个表达式为真,则为真,否则为假。
例子:一年中月份是12月或1月或2月是冬天
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if (month == 12 || month == 1 || month == 2)
printf("冬天\n");
return 0;
}
4.4练习:闰年的判断
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0)
printf("闰年\n");
else if (year % 400 == 0)
printf("闰年\n");
return 0;
}
#include <stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
printf("闰年\n");
return 0;
}
4.5短路
C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
我们可以看逻辑与运算符的例子
month >= 3 && month <= 5
当左边month >= 3结果为0时,右边的month <= 5就不用判断了,整个表达式结果为0
所以对于&&来说,左边操作数结果为0时,右边操作数不再执行。
那么,逻辑或操作符呢?
month == 12 || month == 1 || month == 2
当month == 12结果为0时,继续判断后面操作数,直到结果为真。
所以,对于||来说,当做操作数的结果不为0时,不用判断有操作数。
下面运用以上知识判断以下代码的输出值
#include<stdio.h>
int main()
{
int i = 0,a = 0,b = 2,c =3, d =4;
i =a++&&++b&&d++;//1234
//i =a++||++b||d++;//1334
printf ("%d\n%d\n%d\n%d\n", a, b, c, d);
return 0;
}
5.switch语句
除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是⼀种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。
注:switch后的expression 必须用整型表达式
case后用整型常量表达式
5.1if和switch 的不同
练习:输入一个整数,计算除3后的余数
用if 语句
#include <stdio.h>
int main()
{
int num = 0;
scanf ("%d",&num);
if (num % 3 == 0)
printf ("余数是0\n");
else if (num % 3 ==1)
printf ("余数是1\n");
else
printf ("余数是2\n");
return 0;
}
用switch 语句
#include <stdio.h>
int main()
{
int num = 0;
scanf ("%d",&num);
switch (num % 3)
{
case 0:
printf ("余数是0\n");
break ;
case 1:
printf ("余数是1\n");
break ;
case 2:
printf ("余数是2\n");
break ;
}
return 0;
}
关于switch有以下注意事项
case后用空格与常数隔开。
每个case语句执行完,后面要加上break ,才能跳出switch 语句。
5.2switch中的break
前面的代码如果去掉break 有什么效果呢
#include <stdio.h>
int main()
{
int num = 0;
scanf ("%d",&num);
switch (num % 3)
{
case 0:
printf ("余数是0\n");
case 1:
printf ("余数是1\n");
case 2:
printf ("余数是2\n");
}
return 0;
}
我们发现,7除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”的打印。
这是为什么呢?
原因是switch语句也是分支效果的,只有在switch语句中使用break才能在跳出switch语句,如果某一个case 语句的后边没有break语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到break语句或者switch语句结束。就比如上面的代码就执行了case2中的语句。
所以在switch语句中break 语句是非常重要的,能实现真正的分支效果。
当然,break也不是每个case语句都得有,这就得根据实际情况来看了
练习:输入 1~7的数字,打印对应的星期几
例如:
输入:1输出:星期一
输入:2输出:星期二
输入:3输出:星期三
输入:4输出:星期四
输入:5输出:星期五
输入:6输出:星期六
输入:7输出:星期天
#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 ;
}
return 0;
}
如果需求发生变化,变为:
1.输入1~5,输出的是“工作日”;
2.输入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 ;
}
return 0;
}
上面的练习中,我们发现应该根据实际的情况来在代码中觉得是否使用break,或者在哪里使用break,才能正确完成实际的需求。
5. 3switch中的default
在使用switch语句的时候,我们经常可能遇到一种情况,比如switch后的表达式中的值无法匹配代码中的case语句的时候,这时候要不就不做处理,要不就得在switch语句中加入default子句。
switch后边的expression的结果不是value1,也不是value2的时候,就会执行default子句。
就比如前面做的打印星期的练习,如果day的输入不是1~7的值,如果我们要提示:输入错误则可以这样完成代码:
#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 ;
default :
printf ("输入错误\n");
break ;
}
return 0;
}
5.4 switch语句中的case和default的顺序问题
在switch语句中case子句和default子句有要求顺序吗?default只能放在最后吗?
其实,在switch语句中case语句和default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常是把default子句放在最后处理的。
6. while循环
C语言提供了3种循环语句,while就是其中一种,接下来就介绍一下while语句。
while语句的语法结构和if语句非常相似。
6.1if和while的对比
if(表达式)
语句;
while(表达式)
语句;//若想循环更多语句加上大括号
下面用具体的代码来对比二者的区别
在屏幕上打印hehe
if 语句
#include<stdio.h>
int main()
{
int a = 1;
if (1)
printf ("hehe \n");
return 0;
}
while 语句
#include<stdio.h>
int main()
{
int a = 1;
while (1)
printf ("hehe \n");
return 0;
}
6.2while的执行流程
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
6.3while的循环实践
练习:在屏幕上打印1~10
#include<stdio.h>
int main()
{
int num = 1;
while (num <= 10)
{
printf ("%d", num);
num = num + 1;
}
return 0;
}
6.4练习
输入一个正的整数,逆序打印这个整数的每一位
例如:
输入:1234,输出:4321
输入:521,输出:125
解析:1.要想得到n的最低位,可以使用n%10的运算,得到的余数就是最低位,如1234%10得到4
2.要想去掉n的最低位,找出倒数第二位,则使用n=n/10操作就可以去掉最低位的,如n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第二位3。
循环1和2两个步骤,在n变成0之前,就能到所有的位。
#include<stdio.h>
int main()
{
int n =0;
scanf ("%d", &n);
while (n)
{
printf ("%d",n%10);
n =n/10;
}
return 0;
}
7.for循环
7.1语法形式
for(表达式1;表达式2;表达式3)
语句;
表达式1表循环变量初始化,表达式2表循环结束条件判断,表达式3用于循环变量的调整。
7.2for循环的执行流程
首先执行表达式1变量初始化,接下来执行表达式2的判断,若判断结果为0,则不执行;若判断不为0,则执行循环语句,之后再进行循环变量的调整。再到表达式2判断结果是否为0,再决定循环是否继续。
总的来说,表达式1只执行一次,剩下表达式2和3在搞循环。
7.3for循环的实践
练习:在屏幕上打印一到十
#include <stdio.h>
int main()
{
int num = 0;
for (num = 1;num <= 10;num++)
{
printf ("%d",num);
}
return 0;
}
7.4练习:计算1~100间3的倍数之和
//产生1~100数字
//找出能整除3的数字
//求和
#include<stdio.h>
int main()
{
int num = 0;
int sum = 0;
for (num = 1;num <= 100;num ++)
{
if (num % 3 == 0)
sum += num ;
}
printf ("%d", sum);
return 0;
}
8. do while 语句
在循环语句中用的最少。语法如下:
do
语句
while(表达式);
while 和for 都是先判断后执行是否可以进入循环语句,而do while 是先执行语句,再判断表达式,若为真,则进入下一次循环,反之不进入。
8.2do while 的执行流程
do while 先执行语句,执行完再去判断表达式,若结果不为0,则进入下一次循环。
所以do while 表达式至少先执行一次循环
8.3do while 的循环实例
在屏幕上打印一到十的数字
#include<stdio.h>
int main()
{
int num = 1;
do
{
printf ("%d",num);
num++;
}
while (num <= 10);
return 0;
}
8. 4练习:输入一个正整数,判断它是几位
#include <stdio.h>
int main()
{
int num = 0;
int cnt =0;//计数器
scanf ("%d",&num);
do
{
cnt++;
num = num / 10 ;
}
while (num);
printf ("%d", cnt);
return 0;
}
9. break 和continue 语句
在循环执行的过程中, 如果某些状况发生的时候, 需要提前终止循环, 这是非常常见的现象。C语言中提供了 break 和 continue 两个关键字, 就是应用到循环中的。
break 的作用是用于永久的终止循环, 只要 break 被执行, 直接就会跳出循环,继续往后执行。
continue 的作用是跳过本次循环中 continue 后边的代码, 在 for 循环和 while 循环中有所差异的。
9.1while中的break 和continue
9. 1. 1break
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if(i == 5)
break ;
printf ("%d",i);//当i=5后,就执行break, 循环就终止了
i =i + 1;
}
return 0;
}
打印了1,2,3,4后,当i等于5的时候,循环在 break 的地方终⽌,不再打印,不再循环。
所以 break 的作用就是永久的终⽌循环,只要 break 被执行, break 外的第一层循环就终止了。
那以后我们在循环中,想在某种条件下终⽌循环,则可以使用break 来完成我们想要的效果。
9.1.2 continue举例
continue 是继续的意思,在循环中的作用就是跳过本次循环中 continue 后边的代码,继续进行下⼀次循环的判断。
上面的代码,如果把break 换成continue
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
printf("%d ", i);
i = i+1;
return 0;
}
到这里我们就能分析出来, continue 可以帮助我们跳过某一次循环 continue 后边的代码,直接到循环的判断部分,进行下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。
9.2 for循环中的break和continue
9.2.1 break 举例
其实和 while 循环中的 break一样, for 循环中的 break 也是用于终止循环的,不管循环还需 要循环多少次,只要执行到了 break ,循环就彻底终止,我们上代码。
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ", i);
}
return 0;
}
break 的作用是永久的终⽌循环,未来我们在某个条件发生的时候,不想再继续循环的时候,就可以使⽤ break 来完成。
9. 2. 2continue举例
将以上代码改写成continue
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
所以在 for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发生的时候,本次循环无需再执行后续某些操作的时候,就可以使⽤continue 来实现。
10.嵌套的循环
前面学习了while, do while, for 循环,这三种循环往往嵌套在一起更好解决问题,也就是我们说的循环嵌套,我们可以看一个例子
10.1练习
找出100~200的素数,并打印在屏幕上
注:素数也叫质数,只能被1和本身的数字整除
题⽬解析:
1. 要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使用循环解决。
2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产生2~i-1之间的数字,也可以使用循环解决。
3. 如果2~i-1之间有数字能整除,那它就不是素数。
#include <stdio.h>
int main()
{
//产生100~200的数字
int i = 0;
for (i = 100;i <= 200;i ++)
{
//判断i是否为质数,并打印2~num-1的数
int n = 0;
int flag =1;//假设i为质数
for (n = 2;n < i;n ++)
{
if (i % n == 0)
{
flag = 0;
break ;
}
}
if (flag == 1)
printf ("%d ",i);
}
return 0;
}
11. goto 语句
C语言提供了⼀种非常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("Hello world!\n");
goto next;
printf("haha\n");
next:
printf("hehe\n");
return 0;
}
goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建议是能不用尽量不去使用;但是 goto 语句也不是⼀无是处,在多层循环的代码中,如果想快速跳出使用 goto 就非常的方便了。
本来 for 循环想提前退出得使用 break ,⼀个 break 只能跳出⼀层 for 循环,如果3层循环嵌套就得使用3个 break 才能跳出循环,所以在这种情况下我们使用 goto 语句就会更加的快捷。
标签:语句,num,int,break,循环,printf,分支 From: https://blog.csdn.net/2401_86562710/article/details/141905274