c语言笔记:控制流
一、条件表达式
什么是条件表达式,由关系运算符组成的表达式就叫做条件条件表达式;
C语言关系运算符

代码演示
int main() {
int a, b;
scanf("%d%d", &a, &b);
//输出每个条件表达式对应的整形值
printf("a == b (%d)\n", a == b);
printf("a != b (%d)\n", a != b);
printf("a < b (%d)\n", a < b);
printf("a > b (%d)\n", a > b);
printf("a <= b (%d)\n", a <= b);
printf("a >= b (%d)\n", a >= b);
printf("!(a == b) (%d)\n", !(a == b));
printf("a = %d\n", a);
//看关系表达式对应整形值是否可以参与运算
a += (a == b);
printf("a = %d\n", a);
//实践判断逻辑与和逻辑或的判断逻辑
printf("a < b && a == 3 (%d)\n", a < b && a == 3);
printf("a < b || a == 3 (%d)\n", a < b || a == 3);
printf("1 && 1 (%d)\n", 1 && 1);
printf("1 && 0 (%d)\n", 1 && 0);
printf("0 && 1 (%d)\n", 0 && 1);
printf("0 && 0 (%d)\n", 0 && 0);
printf("1 || 1 (%d)\n", 1 || 1);
printf("1 || 0 (%d)\n", 1 || 0);
printf("0 || 1 (%d)\n", 0 || 1);
printf("0 || 0 (%d)\n", 0 || 0);
return 0;
}
最终结果

练习(要求不能使用分支结构)

代码实现
#include<stdio.h>
int main() {
int a, b;
scanf("%d%d", &a, &b);
//这里需要用到printf函数的返回值
//printf返回值是输出了多少个字符
//而这里printf 输出了4个字符 Y E S \n,所以返回值为4
//那么就可以看为 a < b && 4, 而非0及真所以后半部分为真
//a < b如果成立就会输出YES
//不成立就不会输出
//因为逻辑与如果前面的条件表达式不成立那么,他就不会再去执行后面的代码了
a < b && printf("YES\n");
//这里的逻辑和上面相同
!(a < b) && printf("NO\n");
return 0;
}
结果展示

二、分支结构
if-else 语句

还有一种格式,就是没有{},
#include <stdio.h>
int main() {
int a, b;
scanf("%d%d", &a, &b);
//这种形式只会执行if()后面的一条语句,记住是一条
if (a < b) printf("YES\n");
//同理else 也是
else printf("NO\n");
return 0;
}
练习

代码实现
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
if (n == 0) {
printf("HEHE");
} else if (n < 60) {
printf("FAIL");
} else if (n < 75) {
printf("MEDIUM");
} else if (n <= 100) {
printf("GOOD");
}
printf("\n");
return 0;
}
最终结果

switch 语句

a为一个表达式,
如果表达式的值
如果等于v1执行代码块1, 然后依次执行代码块2,代码块3
如果等于v2, 然后执行代码块2,代码块3
如果等于v3, 执行代码块3;
然后如果在case v3下面可能还有一条语句:
default: 代码块4
这条语句的作用就是,如果上面的v1,v2, v3都不等于,就执行代码块4
对于break的使用在下面代码中来看
代码演示
#include<stdio.h>
int main() {
int a;
scanf("%d", &a);
switch (a) {
//break的作用,如果a = 1,那么就会进入case 1, 执行case 1中的代码段
//如果没有break,那么执行完case 1中的语句,会接着执行case 2中的语句
//直到switch 结构末尾才结束
//那么break的作用就是在相应位置结束switch语句,不在往下执行
case 1: printf("case a = 1\n"); break;
case 2: printf("case a = 2\n"); break;
case 3: printf("case a = 3\n"); break;
case 4: printf("case a = 4\n"); break;
default : printf("default value\n"); break;
}
return 0;
}
最终效果

while语句

while语句执行流程

代码演示:
int main() {
//读入一个n,输出1-n
int n;
scanf("%d", &n);
//第一种 实现方式
int i = 0;
while (i < n) {
i += 1;//同理代码 i = i + 1;
printf("i = %d\n", i);
}
//第二种
printf("-----------------\n");//分界线
i = 1;
while (i <= n) {
//i++,这个代码的意思就是,先用i的值,然后在对i进行+1操作
//就比如现在 i为1,然后输出i = 1, 现在在对i进行+1操作,i就为2了
printf("i = %d\n", i++);
}
i = 0;
//第三种
printf("-----------------\n");//分界线
while (i < n) {
//++i,这个代码的意思就是,先对i进行+1操作,然后在用i的值
//比如现在i为0,先对i进行+1操作,现在i = 1,然后在使用i,也就是输出i = 1;
printf("i = %d\n", ++i);
}
printf("-----------------\n");//分界线
i = 1;
//第四种
//这种会有一个bug,当n为0的时候应该不会输出,但是他要执行一次
//这就是 while 和 do_while 的区别
//do_while 不管表达式成不成立都会先执行一次
do {
printf("i = %d\n", i++);
} while (i <= n);
return 0;
}
最终结果

BUG结果:
这里就是do_while语句执行了一次

技巧,如何通过while循环读入
#include<stdio.h>
int main() {
int x;
//利用scanf的返回值,scanf的返回值是成功读入了多少个参数
//而EOF对应整形值是-1,EOF也称文件结束符
//scanf读到文件末尾时,就会返回-1
//就会结束循环
while (scanf("%d", &x) != EOF) {
printf("2 * x = %d\n", x * 2);
}
return 0;
}
最终结果

for语句

循环执行流程

代码演示
#include<stdio.h>
int main() {
//实现打印1-n;
int n, i;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
printf("%d ", i);
}
printf("\n---------------\n");
//条件可以为空,三个条件都可以为空,但是需要注意避免死循环
for (i = 1; ; i++) {
//遇见break 就会跳出循环
if (i > n) break;
printf("%d ", i);
}
printf("\n---------------\n");
//只输出单数
for (i = 1; i <= n; i++) {
if (i % 2 == 0) continue;
printf("i = %d\n", i);
}
printf("\n");
return 0;
}
最终结果

goto语句

goto语句使用代码演示
#include <stdio.h>
int main() {
goto lab_1;//执行完后直接跳转到lab_1:
printf("hello world\n");
lab_1 ://上面的printf不会被执行,直接被跳过,直接执行下面的代码
printf("hello hangzhou\n");
goto lab_2;//同理跳转到lab_2:
int a = 0, b = 0;
scanf("%d%d", &a, &b);
lab_2 ://这里可以使用变量a,b但是上面的赋值是无效的
printf("%d\n", a * b);
return 0;
}
代码执行结果

可以看到a * b的结果不是0, 而是一个陌生的值,而且也没有利用scanf输入a和b的值
goto 语句模拟if-else 语句
#include <stdio.h>
int main() {
//判断n是偶数,还是基数
int n;
scanf("%d", &n);
//{}里可以放多条表达式,而小括号的作用就是将大括号里的内容变为具有返回值的表达式
//而返回值的是多少,就是最后一条表达式的值
//这里括号里面的返回值是最后表达式的值,那么就是1
//通过逻辑与的判断,只要前面的语句为真就会执行后面的语句
//因为后面的语句为1,所以一定为真
//然后通过goto语句直接跳转,从而模拟了if_else 语句
n % 2 == 0 && ({ goto if_stmt; 1; });
!(n % 2) == 0 && ({ goto else_stmt; 1;});
if_stmt:
printf("%d is even\n", n);
goto if_end;
else_stmt:
printf("%d is odd\n", n);
if_end:
return 0;
}
执行结果

goto 语句模拟switch 语句
#include <stdio.h>
int main() {
//输入数字1-3,然后输出对应的英文
int n;
scanf("%d", &n);
//和if—else 语句同样的实现方法
n == 1 && ({goto lab_1; 1; });
n == 2 && ({goto lab_2; 1; });
n == 3 && ({goto lab_3; 1; });
//error 就相当于default的作用
goto error;
lab_1:
printf("One\n");
//这里为什么要goto end
//如果没有goto end,就会往下继续执行 lab_2
//所以需要跳转到结束
goto end;
lab_2:
printf("Two\n");
goto end;
lab_3:
printf("Tree\n");
goto end;
error:
printf("input error\n");
end:
return 0;
}
执行结果

goto 语句模拟while 语句
#include <stdio.h>
int main() {
//代码要求,输出1-n的值
int n, i = 1;
scanf("%d", &n);
judge:
//这里判断i是否小于等于n, 如果满足那就继续执行
if (i <= n) goto lab_1;//循环判断条件
//不满足就跳出循环
else goto while_end;//这里就是结束循环
lab_1:
//这里需要i++,不然会死循环一直输出1
//也可以不用i++,在下面使用i += 1;
printf("%d ", i++);
//这个位置使用i += 1;
goto judge;//这里judge的作用就是返回到判断条件除
while_end:
printf("\n");
return 0;
}
最终结果

goto 语句模拟for 语句
可以先回顾上面的for语句执行流程
代码演示
#include<stdio.h>
int main() {
//输出1-n
int n;
scanf("%d", &n);
int i;
//初始化
for_1:
i = 1;
goto for_2;
for_2:
if (i <= n) goto for_4;//为真执行代码块
else goto for_end;//为假循环结束
//执行后操作
for_3:
i += 1;//或者i++;
goto for_2; //回到条件判断
//执行代码块
for_4:
printf("%d ", i);
goto for_3;
//循环结束
for_end:
printf("\n");
return 0;
}
代码执行结果

C语言中的[一条语句]

代码解释
#include<stdio.h>
int main() {
//1为真所以一定会执行if后面的代码段
//{}中的代码就是一条语句,也就是复合语句
if (1) {
printf("hello\n");
printf("ni hao\n");
}
//while后面控制一条语句也就是if语句
//然后if后面控制复合语句
//所以这里if语句会执行55次
int n = 5;
while (n--) if(1) {
printf("hello\n");
printf("666\n");
}
//循环1后面的语句就是循环1和代码段2组成的复合语句
//循环1开始后,先执行循环2,循环2开始执行然后执行代码段1
//循环2结束后,执行代码段20
//然后又返回到循环1,直到循环1结束
for (int i = 1; i <= 3; i++) {//循环1
for (int j = 1; j <= 3; j++) {//循环2
printf("(%d, %d), ", i, j);//代码段1
}
//代码段2
printf("\n");
}
return 0;
}
代码运行结果:

本章小结:
本章学习了控制流,掌握了对代码执行流程的改变;学习了这么多新的语句,在学习过后 一定要实际的去用新学的语句进行写代码,做题,加深对新知识的理解和记忆,以及加快打代码 的速度。 最后加油,看到这里你已经超过百分之95的人了。

156

被折叠的 条评论
为什么被折叠?



