首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >分支与循环(1)

分支与循环(1)

作者头像
用户12004530
发布2026-01-23 14:46:34
发布2026-01-23 14:46:34
640
举报

c语言是一门结构化程序设计语言

支持三种结构

1:顺序结构

2:选择结构  如IF  switch

3:循环结构  如while  for   do……while

if语句

代码语言:javascript
复制
if(表达式)
    语句

想要进入IF分支就要先判断表达式是否正确,若表达式为“true”,就进入IF分支,执行语句,若表达式为“false”,就不进入IF分支,执行IF分支以及语句外面的代码,0表示"false",非0表示"true"

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	if (num1 == 5)
		printf("num1的值是5");
      return 0;
}

可以看到当我们输入5的时候,表达式结果为“true”,就执行IF分支里面的代码,当我们输入4的时候,表达式结果为“false”,就没有执行IF分支的代码

else

else可以看作成是IF分支的表达式结果为“false”的执行代码,当表达式结果为“false”的时候就进入else代码

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	if (num1 == 5)
		printf("num1的值是5\n");
	    printf("num1的值是正确的");
	else
		printf("num1的值是错误的");
      return 0;
}

此时我们运行程序后一定会报错

可以看到有一个报错“没有匹配if的非法else”,这是因为if语言默认只匹配一条语句,else一样

如果要匹配多条语句就要在if或else后面加大括号(只有一个语句可以加大括号)

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	if (num1 == 5)
	{
		printf("num1的值是5\n");
		printf("num1的值是正确的");
	}
	else
	{
		printf("num1的值是错误的\n");
		printf("输入错误");
	}
      return 0;
}

嵌套if

我们可以在if里面嵌套多个if或if……else,构成多重判断

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int age;
	scanf("%d",&age);
	if (age >=18)
	{
		printf("成年人\n");
		if (age >= 25)
		{
			printf("25岁及以后的成年人比18岁的要大\n");
	    }
		else
		{
			printf("要小\n");
		}
	}
	else
	{
		printf("未成年\n");
	}
	
      return 0;
}

当我们输入的年龄大于等于18岁就进入if语言,且输入的年龄比18岁还要大就进入if嵌套中的第一个if语句,反之就进入第一个if语句中的else语句,如果输入的年龄比18岁小就进入第一个if语句配套的else语句

else if

若我们在else嵌套if语句就可以这样写

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	if (num1 == 0)
		printf("这是一个数字0");
	else
		if (num1 > 0)
			printf("这个数字大于0");
		else
			printf("这个数字小于0");

      return 0;
}

当我们输入的数字不是0的时候,代码就会执行第一个if语句配套的else语句里面,此时执行代码也是正确的,但我们可以优化一下代码

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	if (num1 == 0)
		printf("这是一个数字0");
	else if (num1 > 0)
			printf("这个数字大于0");
		else
			printf("这个数字小于0");

      return 0;
}

写成else if的形式更加高效简单

悬空else问题

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1=1;
	int num2 = 2;
	if (num1 == 0)
		if (num2 == 2)
			printf("输出2");
   else
			printf("没有输出的数字");

      return 0;
}

这段代码按照我们的理解来的话就是第一个if为“false”,但第二个if为“true”,就会执行第二个if分支,但是这里没有任何输出,包括else下面的代码也没有输出

那为什么会出现这种情况呢?因为else总是和最近的if匹配,就算将else的位置放在和最远的if分支一样对应的位置也不会匹配该if分支,所以代码的逻辑就是第一个if为“false”之后就无法进入第二个if  else了,程序就没有任何输出了,正确代码应该是这样的,if else嵌套在第一个if分支里面

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1=1;
	int num2 = 2;
	if (num1 == 0)
		if (num2 == 2)
			printf("输出2");
		else
			printf("没有输出的数字");

      return 0;
}

单目运算符

单目运算符就是仅对一个操作数进行运算,操作符通常在操作数的前后

自增/自减

num1++或++num1,num1--或--num1(同理)

num1++意思是将num1本身的数字赋值给num1++本身,然后将num1+1后赋值给num1,

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1=1;
    printf("%d\n",num1);
    printf("%d", num1++);
      return 0;
}

为什么都是1,因为num1++是先使用num1的值,然后再加“1”后赋值给num1,那我们再加一行输出num1的代码

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1=1;
    printf("%d\n",num1);
    printf("%d\n", num1++);
    printf("%d\n", num1);
      return 0;
}

那为什么第一个num1输出1,第三个num1 输出2,因为程序执行默认为顺序执行,执行第一行后输出1,第二行就执行num1++后,num1从“1”变为"2",第三行再执行输出num1,这个时候num1就为“2”

那我们将“num1++”换成“++num1”会怎么样?

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1=1;
    printf("%d\n",num1);
    printf("%d\n", ++num1);
    printf("%d\n", num1);
      return 0;
}

此时我们可以看到第二个和第三个都为“2”,这是因为“++num1”是先对num1加1后再赋值给“++num1”,然后“++num1”会将值赋值给num1

同理:num1+=3就为num1=num1+3,num1*=3就为num1=num1*3,减法和除法同理

关系操作符(双目运算符)

c语言中0表示“false”,所有非0的数表示“true”

=和==的区别和!=

一个等号叫作“赋值运算”,两个等号叫作“等于”

int num1=10;//表示创建一个名为“num1”的整型变量,并给它赋初始值“10”

int num1;

num1=10; //表示先定义一个整型变量,再将10赋值给num1

num1==10; // 表示num1 的值是否与10相等

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1;
    scanf("%d",&num1);
    if (num1 = 1)
    {
        printf("输出数字1");
    }
    else
    {
        printf("输出不是数字1");
    }
      return 0;
}

这段代码的结果我们本来想要让它对我们输入的数字进行判断,如果为“true”就执行IF分支,为“false”就执行else语句,但我们输入的是一个“=”,就变成了不管我们输入的数字是几,都会将“1”赋值给num1,就会执行IF分支,导致输出错误

改正的话就是需要将“=”换成“==”就可以了

!=就是不相等的意思

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1=1;
    if (num1 != 1)
    {
        printf("输出的数不是1");
    }
  
      return 0;
}

此时num1初始值为1,进入IF分支表达式后结果为“false”,就不会进入IF语句

>   <    >=   <=    +    -    *    /   同理,不逾矩

%,求余数

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1=10;
    int num2 = num1 % 3;
    printf("%d",num2);
      return 0;
}

三目运算符

三目运算符也称为条件操作符,需要三个操作数

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

符号是?和:

当表达式1为真的时候执行表达式2,整个表达式的结果就为表达式2,当表达式1为假的时候返回表达式3,整个表达式的结果就为表达式3

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1 = 0;
    int num2 = 0;
    scanf("%d %d",&num1,&num2);
    int r = (num1 > 0 ? num2 : num2 - 12);
    printf("%d",r);
      return 0;
}

num1>0为“true”,所以返回num2表达式的值

num1<0为“false”,返回num2-12表达式的值

逗号表达式

(第一个,第二个,第三个)

逗号表达式返回最后一个表达式或值

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1 = 0;
    int num2 = 0;
    scanf("%d %d",&num1,&num2);
    int r = (num1,num2+12,num1+13);
    printf("%d",r);
      return 0;
}

逗号表达式返回值为最后一个表达式或值,所以就会返回num1+13

逻辑操作符

“!”逻辑取反运算符,对单个表达式取返,例:(!真)=(假)(!假)=(真)

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int num1;
    scanf("%d",&num1);
    if (num1 == 0)
        printf("1.输出正确\n");
    if (!num1)
        printf("2.输出正确");
      return 0;
}

第一个if表达式为真,进入语句,第二个num1为0,为“false”,不能进入语句,但是“!”对单个表达式取反就是“true”,进入第二个语句

&&(逻辑与运算符)

A

B

A&&B

0

非0

false

非0

0

false

0

0

false

非0

非0

true

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1; 
	scanf("%d", &num1);
	if (num1 >= 1 && num1 <= 3)
		printf("春天");
	else
		printf("不是春天");
	return 0;
}

当num1大于等于1并且num1小于等于3的时候,才能正确输出“春天”,否则就不是“春天”

||(逻辑或运算符)

A

B

A||B

0

非0

true

非0

0

true

0

0

false

非0

非0

true

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1; 
	scanf("%d", &num1);
	if (num1 == 1 || num1 == 2 || num1 == 3)
		printf("春天");
	else
		printf("不是春天");
	return 0;
}

再给大家分享一个易错案例

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1; 
	scanf("%d", &num1);
	if (num1 >= 1 || num1 <= 3)
		printf("春天");
	else
		printf("不是春天");
	return 0;
}

这串代码当num1大于等于1或者num1小于等于3的数都可以输出“春天”

当num1输入5的时候,输出“春天”,此时就是错误答案,大家一定要记住这个问题!!!

短路

c语言逻辑运算有一个特点,总是先计算左边的,再计算右边的

在“&&”与运算符中,当第一个表达式为“true”时,再计算右边的表达式,如果右边的表达式为“true”,再计算两个表达式的与运算,若最后与运算的结果为“true”,继续计算右边的表达式,如果一直为“true”,就计算到所有表达式结束

如果左边的表达式为“false”,再计算右边表达式,如果为“true”,就计算与运算,与运算结果为“false”,就停止运算,剩下的表达式都不再进行计算了

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 1, b = 2, d = 3;
	int i = a++ && ++b && d++;
	printf("%d %d %d",a,b,d);
	return 0;
}

a++返回值是“1”,a就返回2,此时a++表达式为”true“,++b返回值是”3“,b的返回值也是3,此时计算与运算可以得到两个表达式结果为”true“,就继续计算剩下的表达式,d++表达式返回值是”3“,d返回”4“,再计算与运算,返回值为”true“,没有表达式了,所以计算结束,最后打印输出值为”2“”3“”4“

如果第一个表达式为”false“,就结束运算

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 0, b = 2, d = 3;
	int i = a++ && ++b && d++;
	printf("%d %d %d",a,b,d);
	return 0;
}

如果第一个表达式为为”true“,就计算第二个表达式,若返回”false“,再计算与运算,结果为”false“,就结束运算

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 1, b = 0, d = 3;
	int i = a++ && b++ && d++;
	printf("%d %d %d",a,b,d);
	return 0;
}

在”||“或运算中,当第一个表达式为“false”时,再计算右边的表达式,如果右边的表达式为“flase”,再计算两个表达式的或运算,最后或运算的结果为“false”,继续计算右边的表达式,如果一直为“false”,就计算到所有表达式直到结束或者有很多个表达式,中间有一个或运算为”true“,也就结束运算或最后一个表达式与前面的或运算返回值为”true“也结束

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 0, b = 0, d = 3;
	int i = a++ || b++ || d++;
	printf("%d %d %d",a,b,d);
	return 0;
}
代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 0, b = 0, d = 0;
	int i = a++ || b++ || d++;
	printf("%d %d %d",a,b,d);
	return 0;
}

如果左边的表达式为“true”,再计算右边表达式,如果为“false”,再进行或运算,返回值是”true“,就结束运算,后面的表达式不再计算,如果左边的表达式为“false”,再计算右边表达式,如果为“true”,再计算或运算,返回值是”true“,就结束运算,后面的表达式不再计算,

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 1, b = 0, d = 0;
	int i = a++ || b++ || d++;
	printf("%d %d %d",a,b,d);
	return 0;
}
代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 0, b = 1, d = 0;
	int i = a++ || b++ || d++;
	printf("%d %d %d",a,b,d);
	return 0;
}

switch语句

代码语言:javascript
复制
switch(表达式)
 case value1:  statement
 case value1:  statement
 default:      statemnet

case

如果我们要计算一个数%3后的余数的话可以这样写

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	switch (num1 % 3)
	{
	case 0:
		printf("余数是0\n");
	case 1:
		printf("余数是1\n");
	case 2:
		printf("余数是2\n");
	}
	return 0;
}

一个数除以3之后取余数无非就是”0“”1“”2“这个三个数,所以就可以将这个三个数作为case的常量,当表达式返回的常量与case的常量匹配的时候就进入这个匹配的case语句里面

用1/3后取余数是1,所以从case的常量为1的情况进入相应的语句,但是输出好像把case的常量为2的语句也执行了,这是因为switch的表达式的结果只决定进入的入口,没有决定跳出语句的出口就会一直执行下去,直到执行完switch的所有语句,这个时候就要介绍我们的break,用于跳出语句

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int num1;
	scanf("%d",&num1);
	switch (num1 % 3)
	{
	case 0:
		printf("余数是0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	return 0;
}

这个时候我们就可以输出正确的值了,每一个break对应相应的语句

并且case表达式的值必须为整型!!!switch后面必须为整形表达式!!!

如果我们要输入周几就会输出工作日或周末,那我们用钢才的方法或许太过冗余,我们说过了switch后面的表达式返回值是case的常量,那我们用工作日或者周末的所对应的日期来完成进入语句,那就只需要一个break跳出语句了

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int day;
	scanf("%d",&day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("周末");
	}
	return 0;
}

此时我们输入对应的日期就会返回相应的语句

default

当我们的条件不匹配case的所有常量的时候我们就需要用到default,用于处理case不匹配的问题,default可以位于switch的任何位置,但是不能随意放置!!!

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int day;
	scanf("%d",&day);
	switch (day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("周末");
	default:
		printf("请输入1到7的数字");
	}
	return 0;
}

若没有输入1到7的数字就会执行default里面的语句

代码语言:javascript
复制
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int day;
	scanf("%d",&day);
	switch (day)
	{
	case 1:
	case 2:
	default:
		printf("请输入1到7的数字");
		break;
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("周末");
	
	}
	return 0;
}

这儿时候我将default放在case 2:后面,当我输入1或者2的时候就会进入default,导致逻辑错误,所以建议default一般放在语句最后面

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • if语句
  • else
  • 嵌套if
  • else if
  • 悬空else问题
  • 单目运算符
  • 关系操作符(双目运算符)
  • =和==的区别和!=
  • 三目运算符
  • 逗号表达式
  • 逻辑操作符
  • &&(逻辑与运算符)
  • ||(逻辑或运算符)
  • 短路
  • switch语句
  • case
  • default
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档