C语言学习--分支和循环语句

Posted 庸人冲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习--分支和循环语句相关的知识,希望对你有一定的参考价值。


在这里插入图片描述

语句结构

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

C语言的语句结构,从执行流程的角度可以划分出三种基本结构:顺序结构分支(选择)结构循环结构

C语言中由 ; 隔开的就是一条语句。

int main()
{
    int a = 0; // 语句1
    int b = 1; // 语句2
    ;          // 空语句,也是语句
    return 0;  // 语句3 
}

顺序结构

顺序结构就是从上往下的顺序依次执行语句的结构,是C语言最基本的结构。

#include <stdio.h>
int main()
{
    int a = 1;
    int b = 2;
    int c = 0;
    c = a;
    a = b;
    b = c;
    printf("a=%d b=%d\\n",a,b );
    return 0;
}

在这里插入图片描述

分支(选择)结构

为了完成不同的任务,我们通常需要给一段执行代码前加上判断条件,来决定是否执行相应的代码,这种结构就成为分支(选择)结构。
在这里插入图片描述

if 语句

if语句分为: if、if else 、if else if … else;

if

int main(){
    if(表达式)  // 如果表达式为真,执行语句1
    { 
        执行语句1; 
    }
               // 表达式为假,继续执行下面语句
    return 0;
}

举例

int main()
{
    int age = 10;
    if(age<18)
    {
        printf("未成年");
    }
    // 单条执行语句可以省略代码块,个人习惯使用代码块,结构清晰。
}

在这里插入图片描述

#include <stdio.h>
int main()
{
    int age = 18;
    if(age<18)
    {
        printf("未成年");
    }

}

在这里插入图片描述

if else

int main()
{
    
    if(表达式) // 如果表达式为真,执行语句1
    {
        执行语句1;
    }  
      
    else {    // 否则,执行语句2
        执行语句2;
    }
    return 0;
}

举例

#include <stdio.h>
int main()
{
    int age = 10;
    if(age<18)
    {
        printf("未成年\\n");
    } 
    else 
    {
       printf("成年了\\n");    
    }
}

在这里插入图片描述

在这里插入图片描述

if else if … else

// 只能有一个语句块被执行,按顺序从上往下判断
int main()
{
    if(expr1)        // if expr1 is true,  execute statement 1;
    {
        statement1;
    } else if(expr2) // if expr2 is true,  execute statement 2;
    {
        statement2;
    } else if(expr3) // if expr3 is true,  execute statement 3;
    {
        statement3;
    } ...           // ...
      else          // else ,execute  statment4
    {
        statment4;    
    }
    return 0;
}

举例

#include <stdio.h>
int main()
{
    int age = 10;
    if(age<18)
    {
        printf("未成年\\n");
    }  
    else if((age>=18)&&(age<28))
    {
        printf("青年\\n");
    } 
    //  注意:(18<=age<28) 这种写法是错误的,系统会先判断18<=age,再将判断返回的真值与28比较,为真时返回1<28,为假时返回0<28,这种判断条件永真。
     else if((age>=28)&&(age<60))
    {
        printf("壮年\\n");
    } 
     else if((age>=60)&&(age<150))
    {
        printf("老年\\n");
    } 
    else
    {
        printf("respect\\n");
    }   
    return 0;
}
// 太多了,不截屏了

悬空else 问题

// 下面代码的输出结果?
#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	if (a == 0)
		if (b == 2)
			printf("haha\\n");
	else
			printf("hehe\\n");
	return 0;
}

在这里插入图片描述

因此建议使用代码块{}将执行语句包裹,会使得程序的结构化更加清晰,编译器也能编译出我们想要的效果。
在这里插入图片描述

if 书写形式对比

例一

下面代码意思是否一样?

if(expr)
{
    return x;
}
return z;
if(expr)
{
    return x;
}
else 
{ 
    return z;
}

上述代码的意思是一样的,return x 会直接跳出当前函数,不会执行return 后面的语句。

因此为了不产生歧义,使用第二种书写方式的代码风格是更加清晰的。

例二

下面代码的输出结果为?

int main()
{
    int a = 0;
    if(a = 1)
    {
        printf("1\\n");
    }
    else
    {
        printf("0\\n");
    }
    return 0;
}

输出结果为1, 因为 =赋值操作符,等于给a重新赋值为1,条件永真。

为了避免这类错误,可以将常量放在 == 右侧,变量放在 == 左侧

int main()
{
    int a = 0;
    if(1 == 0) // 这样书写即使少写一个 = 代码也会报错
    {
        printf("1\\n");
    }
    else
    {
        printf("0\\n");
    }
    return 0;
}

练习

判断一个数是否为奇数

先分析:

  1. 奇数不能被2整除的整数,假设奇数x,则x%2=1;
#include <stdio.h>
int main()
{
    int num = 0;
    printf("请输入一个整数>:");
    scanf("%d", &num);
    if (1 == num % 2)
    {
        printf("%d is a odd number\\n", num);
    }
    else
    {
        printf("%d is a even number\\n", num);
    }
    return 0;
}

输出1~100之间的奇数

分析:

  1. 奇数是不能被2整除的整数,假设奇数x,则x%2=1;

  2. 偶数一定是2的倍数,1一定是奇数,因此从1开始查找每次+2,跳过所有偶数。

  3. 利用循环遍历1~100的数。

#include <stdio.h>
int main()
{
    for (int i = 1; i <= 100; i += 2)
    {
        if (i % 2 == 1)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

switch语句

switch语句常用于多分支情况

语法

switch(int_expr) 
{
    case const_expr1: 
            statement1;
    case const_expr2: 
            statement2;
            break;
    case const_expr3: 
        	statement3;
    ...
    default :
        	statment4;
        	break;
}
  1. switch语句中的表达式(int_expr)必须是整型表达式

  2. case 后面的表达式(const_expr)必须是整型常量表达式

  3. int_expr 会按照顺序结构从上往下依次对比 const_expr,哪个相等就从哪个case开始执行。

  4. 当执行完毕后,如果case里的执行语句含有break;跳出当前switch语句,如果没有break;则继续执行下面的case

  5. 当所有expr与所有case的 const_expr 都不相等,如果有 default 默认执行 default 里面的语句。如果没有则结束switch语句。

  6. default 的位置不影响switch语句的执行顺序。

  7. 分支语句中不能使用continue;

举例

#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	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;
}

如果case中没有break; 执行继续执行当前case之后的语句,直到遇到break; 或者switch语句全部执行完毕。

// 例如将说有break;删除,并输入1,查看最终的输出结果
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
		printf("星期一\\n");
	case 2:
		printf("星期二\\n");
	case 3:
		printf("星期三\\n");
	case 4:
		printf("星期四\\n");
	case 5:
		printf("星期五\\n");
	case 6:
		printf("星期六\\n");
	case 7:
		printf("星期天\\n");
	default:
		printf("输入值不正确\\n");
	}
	return 0;
}

结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9Fp54NS-1623408611999)(pic/image-20210609124049454.png)]

练习

下面代码的输出结果为?

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch(n)
    {
        case 1: m++;
        case 2: n++;
        case 3:
            // switch语句可以嵌套使用
            switch(n)
            {
                case 1 : n++;
                case 2 : 
                    m++;
                    n++;
                    break;
            }
        case 4:
            m++;
            break;
        default:
            break;
    }
    printf("m = %d, n = %d\\n", m,n);
    return 0;
}

结果为: m = 5, n = 3

代码分析

int main()
{
    int n = 1;
    int m = 2;
    switch(n)
    {
        case 1: m++; // n = 1首先进入 case 1:m++; m = 2 + 1 = 3
        case 2: n++; // 接着 n++; n = 1 + 1 = 2
        case 3:      // 接着 进入 case 3:
            switch(n)
            {
                case 1 : n++;
                case 2 :   // n = 2 进入 case 2:
                    m++;   // m = 3 + 1 = 4
                    n++;   // n = 2 + 1 = 3
                    break; // 跳出当前的这个嵌套的switch
            }
        case 4:    // 继续执行 case 4: 
            m++;   // m = 4 + 1 = 5
            break; // 跳出当前switch循环
        default:
            break;
    }
    printf("m = %d, n = %d\\n", m,n); // m = 5 n = 3
    return 0;
}

循环结构

  1. 循环结构(语句),有规律的执行重复的操作,被重复执行的语句称为循环体
  2. 循环语句中的判断表达式用于判断循环的终止条件。
  3. 条件为真继续循环,条件为假终止循环。
  4. 循环语句分为3种:whilefordo while

while循环

先判断,当表达式为真进入循环,为假终止循环。

注意切勿使while循环的判断表达式永真,会成为死循环

在这里插入图片描述

语法

while(expr)
{  // 循环体
    statement;
}

举例

打印1~10

分析:

#include <stdio.h>
int main()
{
    int i = 1;
    while(i<=10) // 当i>10时 条件式为假,结束循环
    {
        printf("%d ", i);
        i++;
    }
    return 0;
}

break和continue

break 终止整个循环

// 假如你买了5个包子,当吃到第三个时,你开始拉肚子...
int main()
{
    int i = 1;
    while (i <= 5)
    {
        printf("正在吃第%d包子\\n", i);
        if (3 == i)
        {
            printf("拉肚子了,上医院\\n");
            break;
        }
        i++;
    }
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOpLyD2n-1623408612000)(pic/image-20210609143648144.png)]

continue 跳出本次循环,后面的代码本次不再不执行,继续下次循环

// 假如你买了5个包子,当吃到第三个时,吃到一个虫子...
int main()
{
    int i = 1;
    while (i <= 5)
    {
        printf("正在吃第%d包子\\n", i);
        if (3 == i)
        {
            printf("有虫子,丢掉,接着吃\\n");
            i++; 
            continue;
        }
        i++; 
        
    }
    return 0;
}

在这里插入图片描述

注意

continue 后面如果有对条件表达式中变量的操作,例如 ++ – 等,很容易造成死循环。

// 例如上面的代码
int main()
{
    int i = 1;
    while (i <= 5)
    {
        printf("正在吃第%d包子\\n", i);
        if (3 == i)
        {
            printf("有虫子,丢掉,接着吃\\n");
            // i++; 这里如果不写i++,就变成死循环
            // i == 3时 跳出本次循环,i没有+1,i == 3,继续进入if语句,一直重复就变成死循环了
            continue;
        }
        i++; 
    }
    return 0;
}

while循环的一些实际应用

下面代码的意思是?

#include <stdio.h>
int main()
{
    int ch = 0;
    while((ch= getchar()) != EOF)  // getchar 接收一个字符,当 ch == EOF时,终止循环。 
        以上是关于C语言学习--分支和循环语句的主要内容,如果未能解决你的问题,请参考以下文章

二c语言初阶之分支和循环

初学者对分支语句和循环语句的浅述(C语言)

C语言☀️分支语句和循环语句,一篇文章就够了☀️(详细讲解+代码演示+图解)赶快收藏吧

C语言分支语句与循环语句

C语言分支语句和循环语句

手把手带你学会C语言的分支语句和循环语句