C语言三大结构:顺序、选择、循环讲解

发布于:2025-07-31 ⋅ 阅读:(21) ⋅ 点赞:(0)
C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构选择结构循环结构

. 顺序结构


二. 选择结构

if、switch语句

2.1 if语句

2.1.1 if

if ( 表达式 )

2         语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0为真

2.1.2 else

if ( 表达式 )

2         语句1

else

       语句2

2.1.3 分支中包含多条语句

if else 语句中默认都只控制⼀条语句
若想要同时控制多条语句,就需要用 { } 将代码括起来

2.1.4 嵌套if

if else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断

比如:

//要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数
#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输入的数字是0\n");
	else if (num > 0)
		printf("输入的数字是正数\n");
	else
		printf("输入的数字是负数\n");

	return 0;
}
//输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数
#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);

	if (num > 0)
	{
		printf("正数\n");

		if (num % 2 == 0)
			printf("偶数\n");
		else
			printf("奇数\n");
	}
	else
		printf("非正数\n");

	return 0;
}

2.1.5 悬空else问题

如果有多个 if else else 总是跟最近的尚未配对的 if 匹配

2.2 switch语句

switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式
 switch  (expression)  {
 case  value1:  statement
3    case  value2:  statement
4   . . .
5    default:  statement
6   }
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
注:
1. switch 后的 expression 必须是整型表达式
2. case 后的值,必须是整形常量表达式

2.2.1 if和switch语句的对比

举例:输⼊任意⼀个整数值,计算除3之后的余数
下面我们分别用if语句和switch语句来完成这个代码
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);
	int rem = num % 3;
	switch (rem)
	{
	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语句

2.2.2 switch中的break

每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束

2.2.3 switch中的default

 switch  (expression)  {
 case  value1:  statement
3    case  value2:  statement
4    default:  statement
5   }
当  switch 后的表达式中的值⽆法匹配代码中的 case 语句时,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句

比如上面:switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执default 子句

2.2.4 case和default的顺序问题

switch 语句中 case 语句和 default 语句是没有顺序要求的,只要其顺序是满⾜实际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的


三. 操作符

3.1 关系操作符

C 语⾔⽤于⽐较的表达式,称为 “关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个:
> 大于
< 小于
>= 大于等于
<=

小于等于

== 相等
!= 不相等
关系表达式通常返回 0 1 ,表⽰真假
C 语⾔中, 0 表⽰假,所有⾮零值表⽰真。⽐如, 20 > 12 返回 1 12 > 20 返回
关系表达式常⽤于 if while 结构
注意:1.  相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符

           2. 多个关系运算符不宜连用(连用合法但不建议用)

3.2 条件操作符

条件操作符也称三目操作符,需要接受三个操作数

形式如下:

1    exp1  ?  exp2  :  exp3

它的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果exp1 为假, exp3 计算,计算的结果是整个表达式的结果

举例:

//使⽤条件表达式实现找两个数中较⼤值
int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	printf("%d", a > b ? a : b);

	return 0;
}

区分:逗号表达式

逗号表达式,会从左到右依次计算,但是整个表达式的结果是最后一个表达式的结果

int main()
{
	int b = 0;
	int c = 4;
	int a = (a = 3, a + 3, b = c * 3, c = 2 * a + b);
	//		 a = 3         b = 12     c = 18
	printf("%d\n", a);
	printf("%d\n", c);

	return 0;
}

//输出结果:
//18
//18

3.3 逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符:
! 逻辑取反运算符(改变单个表达式的真假)
&& 逻辑与运算符,“并且”(两侧的表达式都为真,则为真,否则为假)
|| 逻辑或运算符,”或者“(两侧至少有一个表达式为真,则为真,否则为假)
C语⾔中,⾮0表⽰真,0表⽰假
举例:闰年的判断
//输⼊⼀个年份year,判断year是否是闰年
//闰年判断的规则:
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年

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;
}
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“ 短路 
对于 && 操作符来说,左边操作数的结果是0的时候,右边操作数就不再执行
对于  || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;
	//i = a++||++b||d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	return 0;
}
//运行结果
//a = 1
//b = 2
//c = 3
//d = 4
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	//i = a++ && ++b && d++;
	i = a++||++b||d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	return 0;
}
//运行结果:
//a = 1
//b = 3
//c = 3
//d = 4

3.4 算术、赋值、单目操作符

见:

C语言编程指南:从数据类型到printf/scanf深度解析-CSDN博客


四. 循环结构

4.1 while循环

1    while  ( 表达式 )
2           语句 ;   // 如果循环体想包含更多的语句,可以加上⼤括号

while 语句执行流程:

⾸先上来执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语句,语句执⾏完后再继续判断,是否进⾏下⼀次判断

举例:

//在屏幕上打印 1~10 的值
#include <stdio.h>

int main()
{
	int num = 1;
	while (num <= 10)
	{
		printf("%d ", num);
		num++;
	}

	return 0;
}
//输出结果:
//1 2 3 4 5 6 7 8 9 10

4.2 for循环

1    for  ( 表达式 1 ;   表达式 2 ;   表达式 3 )
2          语句; // 如果循环体想包含更多的语句,可以加上⼤括号

表达式1 :⽤于循环变量的初始化

表达式2 :⽤于循环结束条件的判断

表达式3 :⽤于循环变量的调整

for 循环执行流程:

⾸先执行表达式 1 初始化循环变量,再执行表达式 2 的判断部分, 表达式 2 的结果如果 == 0 ,则循环结束;表达式2 的结果如果 != 0 则执行循环语句,循环语句执行完后,再去执行表达式3 ,调整循环变量;然后再去表达式 2 的地⽅执行判断, 表达式 2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。
举例:
//在屏幕上打印1~10的值
int main()
{
	int num = 0;
	for (num = 1; num <= 10; num++)
	{
		printf("%d ", num);
	}

		return 0;
}

4.3 do-while循环

  do
2           语句;
3     while  ( 表达式

区分:

while for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执行循环语句,如果不满⾜就跳
出循环;
而  do while 循环则是直接进⼊循环体,执行循环语句,然后再执行  while 后的判断表达式,表
达式为真,就会进行下⼀次,表达式为假,则不再继续循环

也就是说, do while 语句中循环体是至少执行⼀次

举例:

//在屏幕上打印1~10的值
#include <stdio.h>

int main()
{
    int num = 1;
    do
    {
        printf("%d ", num);
        num++;
    }while(num <= 10);

    return 0;
}

4.4 循环嵌套

将 while, do while, for 三种循环嵌套在一起就是嵌套循环

举例:判断素数 

//找出100~200之间的素数,并打印在屏幕上
//注:素数称质数,只能被1和本⾝整除的数字
int main()
{
	int i = 0;
	//利用循环产生100~200的数字
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1; // 设1为素数
		//循环产生2~i-1的数字,来判断是否为素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0; //不是素数
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}

	return 0;
}
//运行结果
//101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

五. break,continue,goto语句

在循环执⾏的过程中,如果某些状况发生的时候,需要提前终⽌循环,C语⾔中提供了 break continue 两个关键字
1.  break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
2.  continue 的作⽤是跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有 所差异的

5.1 while中的break和continue

break:

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;//当i等于5后,就执⾏break,循环就终⽌了
		printf("%d ", i);
		i = i + 1;
	}

	return 0;
}
//运行结果
//1 2 3 4

continue:

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;
}
//进入死循环

5.2 for中的break和continue

break:

int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}
//运行结果:
//1 2 3 4

continue:

int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue; //这里continue跳过了后面的打印,来到i++的调整部分
		printf("%d ", i);
	}

	return 0;
}
//运行结果
//1 2 3 4 6 7 8 9 10

5.3 do while 中的break和continue

do while 语句中的 break continue 的作⽤和 while 循环中⼏乎⼀模⼀样

break:

int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}
//运行结果
//1 2 3 4

continue:

int main()

{
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i++;
	} while (i <= 10);

	return 0;
}
//运行结果
//1 2 3 4

5.4 goto语句

goto语句可以实现在同一个函数内跳转到设置好的标点处

举例:

int main()
{
	printf("hehe\n");
	goto next;
	printf("haha\n");
next:
	printf("跳过了haha的打印\n");
	
	return 0;
}
运行结果:
hehe
跳过了haha的打印

goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们建议尽量不使⽤goto;但是,在多层循环的代码中,如果想快速跳出,可以使⽤ goto ,⾮常⽅便,毕竟一个 break 只能跳出一层循环


结语

让我们共同学习与提升

欢迎朋友们指出问题或者提意见~


网站公告

今日签到

点亮在社区的每一天
去签到