【C语言基础】分支和循环(上)
目录
1. if语句
1.1 if
1.2 else
1.3分支中包含多条语句
1.4 嵌套 if
1.5 悬空 else 问题
2. 关系操作符
3.条件操作符
4.逻辑操作符:&&,||,!
4.1逻辑取反运算符
4.2 逻辑与运算符
4.3 逻辑或运算符
4.5 短路
5. switch语句
5.1 if语句和switch的对比
5.2 switch语句中的break
5.3 switch语句中的default
5.4 switch语句中的case和default的顺序问题
6.while循环
6.1 if和while的对比
6.2while语句的执行流程
6.3while循环的实践
6.4 练习
7.for循环
7.1语法形式
7.2 for循环的执行流程
7.3 for循环的实践
7.4while循环和for循环的对比
7.5 练习
8.do-while循环
8.1语句形式
8.2 do while循环的执行流程
8.3do while循环的实例
8.4练习
9.break 和continue语句
9.1while循环中break和continue
9.1.1break举例
9.1.2continue举例
9.2for循环中的break和continue
9.2.1break举例
9.2.2 continue 举例
9.3do while循环中的break和continue
10.循环的嵌套
10.1练习
11.goto语句
1. if语句
1.1 if
if语句的语法形式如下:
if(表达式) 语句表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行。
在C语言中,0为假,非0为真,也就是表达式的结果如果是0,则语句不执行,表达式的结果不是0,则语句执行。
例子:输入一个整数,判断是否为奇数
#include<stdio.h> int main() { int num = 0; //输入 scanf("%d", &num); //判断 if (num % 2 == 1) printf("奇数\n", num); else printf("偶数\n", num); return 0; }1.2 else
如果一个数不是奇数,那就是偶数了,如果任意一个整数,我们要怎么清楚的判断是奇数还是偶数,那就要使用if...else语句了,该语法形式如下:
if (表达式) 语句1 else 语句2例子:输入一个整数,判断是否为奇数,如果是奇数打印奇数,否则打印偶数。
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); if (num % 2 == 0) printf("%d是偶数\n", num); else printf("%d是奇数\n", num); return 0; }练习:输入一个年龄,>=18岁就输出:成年,否则就输出:未成年
#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 语句中默认都只控制一条语句,比如:
上面的代码,你会发现输入的值不管是>=18,还还是<18,“可以谈恋爱”都会打印在屏幕上。
这是因为 if 语句只能控制一条语句,就是printf("成年了\n"),if 语句为真,则打印成年了,if 语句为假,则不打印,对于 printf(“可以谈恋爱了\n”),是独立存在的,不管 if 语句的条件的真假,都会被执行。那如果我们要 if 语句同时控制2条语句,那就要使用 { } 将代码扩起来,else 后也可以跟上大扩号,即保证正确性,也美观。
如果输入小于18的数,if 语句就为假,什么都不会被打印。
那就需要加上else。
1.4 嵌套 if
在 if else 语句中,else可以与另一个 if 语句连用,构成多重判断。
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。如下所示。
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); if (num > 0) printf("%d是正数\n", num); else if(num < 0) printf("%d是负数\n", num); else printf("%d是零\n", num); return 0; }也可以不使用else if ,如下所示。
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); if (num != 0) { if (num > 0) { printf("%d是正数\n",num); } else { printf("%d是负数\n",num); } } else { printf("%d是零\n",num); } return 0; }以上就是嵌套 if 语句的语法,有了嵌套 if 语句,就可以完成更多复杂逻辑的判断。
练习:
输入一个人的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁至44岁打印“青年”
如果年龄在45岁至59岁打印“中老年”
如果年龄在60岁至89岁打印“老年”
如果90岁以上打印“老寿星”
代码如下:
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (age < 18) printf("少年\n"); else if (age <= 44) printf("青年\n"); else if (age <= 59) printf("中老年\n"); else if (age <= 89) printf("老年\n"); else printf("老寿星\n"); return 0; }1.5 悬空 else 问题
如果有多个 if 和else,可以记住这样一条规则,else 总是跟最接近的 if 匹配。
#include<stdio.h> int main() { int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }这个程序运行的结果是什么?我们刚刚接触这个语言的时候认为,输入个0,不等于1,那就执行else子句打印haha。
但是当运行代码时,输出的结果是空。
为什么呢,这就是悬空else的问题,如果有多个 if 和 else ,可以记住这样一条规则,else 总是跟最接近的 if 匹配。
上面的代码排版,让 else 和第一 if 语句对齐,让我们以为 else 是和第一个 if 匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 字句,打印 haha ,但实际 else 是和第二个 if 进行匹配的,这样后边的 if...else语句是嵌套在第一个 if 语句中的,如果第一个 if 语句不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。就是说,我们开始的时候让 a = 0 ,进入条件判断 (if(a == 1)),但是它没有else,所以不符合条件,所以什么都没有打印,除非设置 int a = 1;它才会进入到内部的 if...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"); } return 0; }或者如果我们希望else确实和第一个 if 匹配,可以这样编写
#include<stdio.h> int main() { int a = 0; int b = 2; if (a == 1) { if (b == 2) printf("hehe\n"); } else { printf("haha\n"); } return 0; }只要带上适当的大括号,代码的逻辑就会更加的清晰,所以以后在写代码的时候要注意括号的使用,让代码的可读性更高。
2. 关系操作符
C语言用于比较的表达式,称为“关系表达式”,里面使用的运算符就称为“关系运算符”,主要有下面6个。
> 大于运算符
< 小于运算符
>= 大于等于运算符
== 相等运算符
!=不相等运算符
下面是一些例子。
a == b; a != b; a < b; a > b; a <= b; a >= b;关系表达式通常返回 0 或 1,表示真假。
C语言中,0 表示为假,所有非零值表示为真。比如,20>12返回1,12>20返回0。
关系表达式常用 if 或者 while 结构。
if (x == 3) { printf("x is 3.\n"); }注意:相等运算符==与赋值运算符=是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,他可以运行,但很容易出现意料之外的结果。
if (x = 3)...上面示例中,原意式x == 3,但是不小心写成x = 3 。这个式子表示对变量x 赋值 3 ,它的返回值为3,所以 if 判断总是为真。
为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。
if (3 == x)这样的话,如果把== 误写成 = ,编译器就会报错。
如果没写错,就会打印输出。
另一个需要避免的错误是:多个关系运算符不宜连用。
i < j < k上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到有计算,所以实际执行的是下面的表达式。
(i < j) < k上面式子中,i < j 返回0或1,所以最终是0或1与变量 k 进行比较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使用下面的写法。
i < j && j < k比如:我们输入一个年龄,如果年龄在18~36岁之间,我们输出青年。
如果我们这样写额,当我们输入10的时候,依然输出青年,如下图:
这是因为,我们先拿18和age中存放的10比较,表达式18<=10为假,18<=age的结果是0,再拿0和36比较,0<=36为真,所以打印了青年,因此即使当age是10的时候,也能打印青年,逻辑上是有问题,正确代码如下:
#include<stdio.h> int main() { int age = 0; scanf("%d", &age); if (18 <= age && age <= 36) { printf("青年\n"); } return 0; }3.条件操作符
条件操作符也叫三目操作符,需要接受三个操作数的,形成如下:
exp1?exp2:exp3 真 执行 不执行 假 不执行 执行
条件操作符的计算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果。
练习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.逻辑操作符:&&,||,!
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
!:逻辑取反运算符(改变单个表达式的真假)。
&&:逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
||:逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
注:C语言中,非表示真,0表示假
4.1逻辑取反运算符
比如,我们有一个变量叫flag,如果flag为假,要做一个什么事情,就可以这样写代码
#include<stdio.h> int main() { int flag = 0; if (!flag) { printf("do something\n"); } return 0; }如果flag为真,!flag就是假,如果flag为假,!flag就是真。
所以上面的代码的意思就是本来flag为假(flag = 0),但是!flag 进行取反之后为真,执行if语句中的代码。
4.2 逻辑与运算符
&&就是与运算符,也是并且的意思,&&是一个双目操作符,使用方式是a&&b,&&两边的表达是都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如:如果我们说月份是3月到5月,是春天,代码如下
#include<stdio.h> int main() { int month = 0; scanf("%d", &month); if (month >= 3 && month <= 5) { printf("春天\n"); } return 0; }这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。
4.3 逻辑或运算符
||就是或运算符,也就是或者的意思,||也就是一个双目操作符,使用的方式是a || b,||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说一年中月份是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)||(year % 400 == 0)) { printf("闰年\n"); } else { printf("不是闰年\n"); } return 0; }4.5 短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
如前面的代码:
if(month >= 3 && month <= 5)表达式中&&的左操作数是month>=3,操作数是month<=5,当左操作数month >=3的结果是0的时候,即使不判断month<=5,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行。
if (month == 12 || month == 1 || month == 2)对于||操作符,如果month == 12 ,则不用再判断month是否等于1或者2,整个表达式的结果也是1(冬季)。
所以,||操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
练习:阅读代码,计算代码输出的结果
int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = (a++ && ++b && d++); printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d); return 0; } int main() { int i = 0, a = 1, b = 2, c = 3, d = 4; i = (a++ || ++b || d++); printf("a = %d\nb = %d\nc = %d\nd = %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.1 if语句和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; }上述的代码中,我们要注意的点有:
1.case和后边的数字之间必须有空格
2.每一个case 语句中的代码执行完成后,需要加上break,才能跳出这个 switch 语句。
5.2 switch语句中的break
前面的代码中,如果我们去掉case语句中的break,会出现什么情况呢
我们发现,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 输出:星期六
输入:0 输出:星期七
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); switch (num % 7) { 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 0: printf("星期日\n"); break; } return 0; }如果需求发生变化,变为:
1.输入1~5,输出的是“工作日”;
2.输入6~7,输出“休息日”
那参考代码如下:
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); switch (num % 7) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 0: printf("休息日\n"); break; } return 0; }上面的练习中,可以发现应该根据实际的情况,来在代码中觉得是否使用break,或者在哪里使用break,才能正确完成实际的需求。
5.3 switch语句中的default
在使用switch语句的时候,我们经常可能遇到一种情况,比如switch后的表达式中的值无法匹配代码中的case语句的时候,这时候要不就不做处理,要不就得在switch语句中加入default子句。
switch(expression) { case value1: statement case value2: statement default: statement }switch后面的expression的结果不是value1,也不是value2的时候,就会执行default子句。
就比如前面做的打印星期的练习,如果day的输入不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码:
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); switch (num % 7) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 0: printf("休息日\n"); break; default: printf("输入错误\n"); } return 0; }5.4 switch语句中的case和default的顺序问题
在switch语句中case子句和default子句有要求顺序吗?default只能放在最后吗?
其实,在switch语句中case和default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常把default子句放在最后处理的。
6.while循环
C语言提供了3种循环语句,while就是其中一种,接下来就介绍一下while语句。
while语句的语法结构和if语句非常相似。
6.1 if和while的对比
if(表达式) 语句; while(表达式) 语句;//如果循环体想包含更多的语句,可以加上大括号以下代码进行对比
#include<stdio.h> int main() { if (1) printf("hehe\n");//if后边条件满足,打印一次hehe return 0; } #include<stdio.h> int main() { while (1) printf("hehe\n");//while后边条件满足,无限打印hehe return 0; }这就是他们的区别,while语句是可以实现循环效果的。
6.2while语句的执行流程
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
6.3while循环的实践
练习:在屏幕上打印1~10的值
参考代码:
#include<stdio.h> int main() { int num = 1; while (num <= 10) { printf("%d\n", num); num++; } 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。
3.循环1和2两个步骤,在n变成0之前,就能到所有的位。
#include<stdio.h> int main() { int num = 0; scanf("%d", &num); while (num ) { printf("%d ", num % 10); num /= 10; } return 0; }7.for循环
7.1语法形式
for循环式三种循环中使用最多的,for循环的语法形式如下:
for(表达式1;表达式2;表达式3) 语句;//如果循环体想包含更多的语句,可以加上大括号表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
7.2 for循环的执行流程
首先执行表达式1初始化循环变量,接下来就是执行表达式2的判断部分,表达式2的结果如果==0,则循环结束;表达式2的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
7.3 for循环的实践
练习:在屏幕上打印1~10的值
#include<stdio.h> int main() { int i = 0; for(i=1; i<=10; i++) { printf("%d ",i); } return 0; }7.4while循环和for循环的对比
for和while在实现循环的过程中都有初始化、判断、调整这三个部分,但是for循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候while循环的三个部分就比较分散,所以从形式上for循环更优一些。
7.5 练习
练习1:
计算1~100之间3的倍数的数字之和
#include<stdio.h> int main() { int i = 0; int sum = 0; for(i=1; i<=100; i++) { if (i % 3 == 0) sum = sum + i; } printf("%d ",sum); return 0; }对于这个代码还有优化空间,如下
#include<stdio.h> int main() { int i = 0; int sum = 0; for(i=3; i<=100; i+=3) { sum = sum + i; } printf("%d ",sum); return 0; }8.do-while循环
8.1语句形式
在循环语句中do-while语句的使用最少,它的语法如下:
do 语句; while(表达式);while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而do while循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
8.2 do while循环的执行流程
在do while循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在do while语句中循环体是至少执行一次的,这是do while循环比较特殊的地方。
8.3do while循环的实例
在屏幕上打印1~10的值
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); i++; } while (i <= 10); return 0; }一般 do while使用在循环体至少被执行一次的场景下,所以较少一些。
8.4练习
输入一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入:12 输出:2
#include<stdio.h> int main() { int i = 0; int j = 0; scanf("%d", &i); do { j++; i = i / 10; } while (i); printf("%d", j); return 0; }这里并非必须使用do while语句,但是这个代码就比较适合实用do while 循环,因为n即使是0,也是1位数,要统计位数的。
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;//当i等于5后,就执行break,循环就终i+ 止了 printf("%d", i); i = i + 1; } return 0; }执行的结果:
打印1,2,3,4后,当i等于5的时候,循环break的地方终止,不再打印,不再循环。
所以break的作用就是永久的终止循环,只要break被执行,break外的第一层循环就终止了。
那以后我们在循环中,想要在某种条件下终止循环,则可以使用break来完成我们想要的效果。
9.1.2continue举例
continue是继续的意思,在循环中的作用就是跳过本次循环中continue后边的代码,继续进行下一次循环的判断。
将上面的代码换成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.2for循环中的break和continue
9.2.1break举例
其实和while循环中的break一样,for循环中的break也是用于终止循环的,不管循环还需要循环多少次,只要执行到了break,循环就彻底终止。
break的作用是永久的终止循环,我们在某个条件发生的时候,不想再继续循环的时候,就可以使用break来完成。
9.2.2 continue 举例
上面的代码,把break换成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来实现。
这里我们可以对比一下while循环和for循环中continue的区别:
9.3do while循环中的break和continue
do while语句中的break和continue的作用和while循环中几乎一摸一样。
10.循环的嵌套
10.1练习
找出100~200之间的素数,并打印在屏幕上。
注:素数又称质数,只能被1和本身整除的数字。
- 要从100~200之间找出素数,首先得有100~200之间的数,这里使用循环解决。
- 假设要判断i是否为素数,需要产生2~i-1之间的数字,也可以使用循环解决。
- 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
#include<stdio.h> int main() { int i = 0; for (i = 100; i <= 200; i++) { int j = 0; for (j = 2; j < i; j++) { if (i % j == 0) break; } if (i == j) printf("%d ", i); } return 0; }11.goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
例如:
#include<stdio.h> int main() { printf("hehe\n"); goto next; printf("haha\n"); next: printf("跳过了haha的打印\n"); return 0; }goto语句如果使用不当,就会导致在函数内部随意跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是goto语句也不是一无是处,在多层循环的代码中,如果想快速跳出,使用goto就非常的方便。
for (...) { for (...) { for (...) { if (disaster) goto error; } } } error: //...本来for循环想提前退出得使用break,一个break只能跳出一层for循环,如果3层循环嵌套就得使用3个break才能跳出循环,所以在这种情况下我们使用goto语句就会更加的快捷。
小结
本篇博客主要记录了 C 语言学习过程中的一些基础知识点,包括 if 语句、switch 语句、关系与逻辑操作符,以及 while、for、do-while 循环等内容。同时结合实例代码,对常见语法、执行流程以及容易出现的问题进行了整理和总结。由于本人也是 C 语言学习阶段,文章难免存在理解不到位或表述不准确的地方,欢迎大家批评指正。如果文章中存在错误,还请多多包涵,也希望能和大家一起交流学习,共同进步。相关代码已上传至 Gitee:https://gitee.com/ZhiWeiCoder/student_c。大家也可以关注一下我这个代码库,谢谢。
