C语言:顺序、分支与循环

目录

一、顺序结构

二、选择结构

1.条件判断语句

(1) if 语句

if语句的几种形式

悬空else问题

条件运算符

逻辑运算符:!、&&、| |

(2) switch语句

三、循环结构

1.循环语句

(1) while循环

(2) for循环

(3) do while循环

2.转向语句

(1) break和continue

(2) return 语句

(3) goto语句


C语言是结构化的程序设计语言。

五种语句分类:空语句、表达式语句、控制语句、复合语句、函数调用语句

控制语句是用于控制程序的执行流程,实现程序的各种结构方式。

其中包含三种结构分类:顺序结构、选择结构、循环结构。

C语言有9种控制语句,可以分为以下三类:

  1. 条件判断语句(也叫分支语句):if 语句、switch 语句;
  2. 循环语句for 语句、while 语句、do while 语句;
  3. 转向语句break 语句、continue 语句、return 语句、goto 语句

接下来介绍一下三种结构以及9种控制语句

一、顺序结构

顺序结构是一种最基本,最简单的编程结构。程序自上而下依次执行。
 

#include <stdio.h>
int main() 
{  
	printf("0");
	printf("1");
	printf("2");

	return 0;
}
打印结果:012

// 这里比较简单易懂,不多说啦

二、选择结构

1.条件判断语句

1. if 语句

if语句的几种形式

可以分为三种形式:

单if语句、if...else...语句、if...else if...else..语句。

语法形式如下:

// 1.单if语句
if ( 表达式 )
    语句;

注意:这里条件成立后只会执行一条语句

如果想执行多条语句,则要加上{}
if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
如下:
if ( 表达式 )
{
    语句1;
    语句2;
    ....
}


// 2.if...else...语句
if ( 表达式 )
{
    语句1;
}
else
{
    语句2;
}


// 3.if...else if...else语句
if ( 表达式 )
{
    语句1;
}
else if
{
    语句2;
}
...
else
{
    语句3;
}

表达式成立(为真,即非0),则执行语句,表达式不成立(为假,即0),则不执行语句。

在C语言中,0表示假,非0表示真

// 例子:判断一份成绩对应的等级
// 单if实现
#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d", &score);
    if(score >= 60)
        printf("合格\n");
    return 0;
}

// if...else...实现
#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d", &score);
    if(score >= 60)
        printf("合格\n");
    else
        printf("不合格\n");
    return 0;
}

// if...else if...else实现
#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d", &score);
    if(score >= 0 && score < 60)
        printf("不合格\n");
    else if(score >= 60 && score < 70)
        printf("中等\n");
    else if(score >= 70 && score < 85)
        printf("良好\n");
    else if(score >= 85 && score <= 100)
        printf("优秀\n");
    else
        printf("成绩出错\n");
    return 0;
}

// 当然也可以用if...else...的嵌套来写
#include <stdio.h>
int main()
{
    int score = 0;
    scanf("%d", &score);
    if(score >= 0 && score < 60)
    {
        printf("\n");
    }
    else
    {
        if(score < 70)
        {
            printf("中等\n");
        }
        else
        {
            if(score < 85)
            {
                printf("良好\n");
            }
            else
            {
                if(score <= 100)
                {
                    printf("优秀\n");
                }

            }
        }
    }
    return 0;
}

这里注意一下:括号中的判断不合格如score < 60 && score >= 0,初学者比如我,之前就直接写成 0 <= score < 60,其实这种写法没错,但无意义;

原因是:< 的运算符顺序是从左至右,所以 0 <= score < 60 被理解为 (0 <= score) < 60. 如果0 <= score 成立 ( 为真 ) 则结果为1,否则 ( 为假 ) 结果为0.  比如:score取 6, 那么 0 <= score 结果为1,又1 < 60 成立,则结果为 1.

悬空else问题

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

#include <stdio.h>
int main()
{
    int a = 1, b = 3;
    if(a == 2)
        if(b == 3)
            printf("Y\n");
    else
        printf("N\n");
    return 0;
}
这段代码,很多初学者,包括我哈,直接看a不为1,就直接执行else,打印 N 了

#include <stdio.h>
int main()
{
    int a = 1, b = 3;
    if(a == 2)
        if(b == 3)
            printf("Y\n");
        else
            printf("N\n");
}
稍微改变一些对应位置,很容易就可以看出,其实这段代码什么都没打印


对于悬空else的问题,我们只要记住:else总是跟最接近的if匹配

当然这里建议大家,写代码的时候可以养成习惯,
每个条件(或循环)语句后都加上大括号可以让代码看起来更规范整齐,又不易犯错
#include <stdio.h>
int main()
{
    int a = 1, b = 3;
    if(a == 2)
    {
        if(b == 3)
        {
            printf("Y\n");
        }
        else
        {
            printf("N\n");
        }
    }
}

接下来介绍一下,表达式中用于比较的表达式,比如:a < b, a == b 等,通常返回的值为 0 或 1 ,表示真假。

其中主要的6种 <、<=、>、>=、==、!= 这些为关系操作符(运算符),这些大家应该很容易理解的,需要注意的是:比如判断x等于3:if ( x == 3 ).., 有些同学,没错还是我,有次写成了 x = 3 找了半天没找出来错误= =、 为了防止这种错误,借鉴了一些大佬的写法比如 if ( 3 == x ).. ,这样只要 == 误写成 = ,如 if ( 3 = x ) 立马就报错了,因为常量不能被赋值。

再介绍一个条件运算符(也叫三目操作符,顾名思义就是有三个操作数)

条件运算符

形式:表达式1 ? 表达式2 : 表达式3

运算逻辑:表达式1(为真),计算表达式2,否则(为假)计算表达式3 ,整个表达式的结果是计算完的结果

判断两数中最大数

#include<stdio.h>
int main()
{
    int a = 0, b = 0;
    scanf("%d %d", &a, &b);
    if(a>b)
        max = a;
    else
        max = b;
    printf("%d\n", max);
    return 0;
}

//  可以改写为
#include<stdio.h>
int main()
{
    int a = 0, b = 0;
    scanf("%d %d", &a, &b);
    int max = a > b ? a : b;
    printf("%d\n", max);
    return 0;
}
逻辑运算符:!、&&、| |

主要有三种:

!:取反运算符,改变单个表达式的真假,如:! ( 非0 ) 结果为 0,! 0 结果为 1

&&:与运算符,并且的意思(需要两侧表达式都为真,则为真,否则为假

| |:或运算符,或者的意思(需要两侧表达式都为假,则为假,否则为真),也可以理解为:两侧至少有一个表达式为真,则为真,否则为假

&&和||都为双目运算符。逻辑运算符有⼀个特点:求值从左到右。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

比如:if(m == 1 | | m==2 | | m == 3) , 假设m为 1,m == 1成立,则后面表达式都不求值判断了; && 同理。

小结:!取反;&&两真为真,一假为假;| | 一真为真,两假为假。

2. switch语句

一种特殊形式的if...else...

switch (整型表达式) 
{
    case 整型1: 
        语句1;
    case 整型2: 
        语句2;
    ....
    default: 
        语句3;
}
运算逻辑:整型表达式的值与case后面的case匹对,执行相应代码块,若没有能匹对的,则执行default的语句。
这里用字符,如'A'也是可以的,应为ASCII码值对应的是整型


注意:
1. case 和后边的整型数字之间要有空格
2. 每个case语句中的代码执⾏完后,要加上break,才能跳出这个switch语句,不然会挨个执行下去
比如:
switch (2) 
{
    case 1: 
        printf("1");
    case 2: 
        printf("2");
    case 3:
        printf("3");
    default: 
        printf("4")
}
switch()括号中2,对应下边case 2,无break,执行结果:234

switch (2) 
{
    case 1: 
        printf("1");
    case 2: 
        printf("2");
    case 3:
        printf("3");
        break;
    default: 
        printf("4")
}
执行结果:23

3.case语句和default是没有顺序要求的,只要顺序满足实际需求就可以,通常还是建议default放在最后
4.switch中是没有continue的

三、循环结构

1. 循环语句


(1) while循环

while语法结构和if相似,其中的区别就是while有循环效果

比如:
if(1)
    printf("Y");  // 打印一次

while(1)
    printf("Y");  // 死循环,打印无数次

while的练习应用
// 求1到100的和
#include <stdio.h>
int main()
{
    int i = 1, sum = 0;
    while(i <= 100)
    {
        sum = sum + i;
        i++;
    }
    printf("%d", sum);
    return 0;
}


// 逆序打印一个整数的每一位,如:1234,打印4 3 2 1
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    while(n)
    {
        printf("%d ", n%10);
        n /= 10;
    }
    return 0;
}

(2) for循环

语法形式:
for(表达式1; 表达式2; 表达式3)
{
    语句;
}
表达式1:循环变量的初始化, 如:i = 0
表达式2:循环结束条件的判断, 如:i <= 100
表达式3:循环变量的调整, 如:i++

while与for的对比

// 求1到100的和
#include <stdio.h>
int main()
{
    int i = 1; // 初始化
    int sum = 0;
    while(i <= 100)  // 判断
    {
        sum = sum + i;
        i++;    // 调整
    }
    printf("%d", sum);
    return 0;
}


#include <stdio.h>
int main()
{
    int i = 1, sum = 0;
    for(i = 1; i <= 100; i++) // 初始化, 判断, 调整
    {
        sum = sum + i;
    }
    printf("%d", sum);
    return 0;
}

(3) do while循环

语法形式
do
{
    语句;
}while(表达式);  // 注意do while后边while()结束有带 ;

while和for都是先判断,再执行语句;do while则是先执行语句,再判断
也就是说do while语句中循环体是至少执行一次的



练习
计算一个正整数的位数, 如:1234 输出4
#include<stdio.h>
int main()
{
    int n = 0;
    int count = 0;  // 计数
    scanf("%d", &n);
    do
    {
        count++;
        n = n / 10;
    }while(n);
    printf("%d", count);
    return 0;
}

2. 转向语句

(1) break和continue

break作用是永久终止本次循环,就是直接跳出本次循环,进入下一次循环

continue作用是跳过本次循环continue后边的代码,进入下一次循环

continue在while和for中还是有区别的

#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10)
    {
        if(i == 5)
            continue;
        printf("%d ", i);
        i += 1;
    }
    return 0;
}
代码结果:先打印1 2 3 4 后边死循环,

原因是:i==5时continue跳过后边代码,也就是i没加1,i还是5,符合if就一直continue死循环了

#include <stdio.h>
int main()
{
    int i = 1;
    for(i=1; i<=10; i++)
    {
        if(i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}
代码结果:1 2 3 4 6 7 8 9 10 

原因是:i==5时,执行continue,跳过了printf后执行调整i++
这里提一下,循环结束后i的值是11,for循环中变量的调整是每次循环体结束后执行,
也就是i==10的时候,执行循环体后,再执行i++为11,进入下一次循环判断11不符合i<=10,结束循环

(2) return 语句

函数执行return语句时,它将返回一个特定的值,并结束当前的函数调用。

这里先简单普及一下,因为很多小伙伴还没学到函数,后面会单独出的

void func()  // void 表示无类型,无需返回值时,用void
{
    return;      // 函数无返回值
}


int add(int a, int b)  // int 表示整型,函数体中的return需要返回整型
{
    int sum = a + b;
    return sum;   // 返回sum值
}

初学时写的main是主函数,可以放在任意位置
函数是C语言的主要组成部分

如果多循环中,符合某种条件就想结束本函数
可以如下使用:
#include<stdio.h>
int main()
{

    for(...)
    {
        for(...)
        {
            if(...)
                return 0;
        }
    }
    
}
单循环时,
#include<stdio.h>
int main()
{
    for(...)
    {
        ...
        break;  // 这时用return 0;效果是一样的
    }
}

先不讲了,怕有人晕了

(3) goto语句

goto 语句可以实现在同⼀个函数 内无条件跳转到指定标签位置执行代码。

#include <stdio.h>
int main()
{
    goto n;    // n为指定标签,这句话是跳转到指定标签n的位置。
    printf("不被执行\n");

n:    // 标签的定义
    printf("可被执行\n");     // 指定标签包含的代码
    return 0;
}
这里的打印结果:可被执行

实际应用中应尽量避免使用goto,在庞大的程序中,用goto容易导致代码不易理解,调试时很难找到错误

在多层循环代码中,如果想快速跳出,使用goto还是比较方便的
比如:
#include <stdio.h>
int main()
{
    for(....)
    {
        for(...)
        {
            for(...)
            {
                if()
                    goto n;
            }
        }
    }
}
n:
    ...


for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。

文章有点长,非常感谢大家观看!!!

大家一起加油!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值