C语言笔记:控制流

 ACM金牌带你零基础直达C语言精通-课程资料

 本笔记属于船说系列课程之一,课程链接:ACM金牌带你零基础直达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 > 0 && n < 60) {
        printf("FAIL");
    } else if (n >= 60 && n < 75) {
        printf("MEDIUM");
    } else if (n >= 75 && 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;
}

最终结果:

如何结束循环读入 ctrl + c

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 语句

可以回顾一下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的人了。

        

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初猿°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值