首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基本魔法语言分支和循环 (一) (C语言)

基本魔法语言分支和循环 (一) (C语言)

作者头像
散峰而望
发布2025-12-23 12:52:58
发布2025-12-23 12:52:58
1160
举报

前言

迄今为止,我们的咒语(程序)只是简单地将符文(语句)依次激活,效果单一而直接,显得僵硬迟钝。但真正的强大的魔法,在于控制凝聚,灵活多变,能够更好的应对这个风诡波谲的世界。 想象一下你有一个自动凝聚能量直至饱和的法阵,一个是能循环往复运转的魔法钟摆…你的魔法将告别死板,拥有真正的“灵魂”与“力量”。准备好施展你的第一个智能魔法了吗?

分支语句

分支语句就像魔法师手中的预言水晶球或一个命运的岔路口,存在着许许多多的可能。

1. if语句

1.1 if

if语句:就像魔法师凝视水晶球,窥探未来的一个片段。

if语句的语法形式如下:

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

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

C语言中,0为假,非0为真,也就是表达式的结果如果是0,则语句不执行,表达式的结果不为0,则语句执行。

例子:输入一个整数,判断是否为偶数

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n % 2 == 0)
		printf("%d是偶数\n", n);
	return 0;
}
在这里插入图片描述
在这里插入图片描述
1.2 else

else语句:如果水晶球里面显示的是两种未来,那么魔法师就必须选择其中一个未来,此时就需要if…else…语句。

else语句语法如下:

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

例子:输入一个年龄,>=18岁就输出:可以谈恋爱了,否则就输出:不可以谈恋爱。

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age>=18)
        printf("真真可以谈恋爱了\n");
    else    
        printf("真真不可以谈恋爱\n");
    return 0;
}        
1.3 如何在分支中包含多条语句

一般情况下,if和else在水晶球中只能看到某一个固定的片段。即if和else语句中默认都只控制一条语句,例如:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int age = 0;
    scanf("%d", &age);
    if(age>=18)
       printf("成年了\n");
       printf("可以谈恋爱了\n");
    return 0;
}       
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到上面的代码,无论你输入的是>=18还是<18,“可以谈恋爱了”都会打印在屏幕上。

这是因为if…else…语句只能控制一条语句,就是printf(“成年了\n”)。if语句为真,则打印“成年了”,if语句为假,则不打印。对于printf(“可以谈恋爱了\n”)是独立存在的,不管if语句是真是假,都会执行。那么如果我们如果想要if…else…语句同时控制多种片段(语句),那我们应该怎么办呢?那么就需要{}将代码给括起来。形成一整套连贯的、组合的魔法动作或仪式步骤,不再是单一的法术,而是一个法术序列。例子如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.4 嵌套if

嵌套if就像是层层深入的预言。它不再是一次简单的“是或否”的抉择,而是一个逻辑层层递进、环环相扣的决策过程。即在if…else…语句中,else可以与另一个if语句连用,构成多重判断。

例如:要求输入一个整数,判断输入的整数是0,还是整数或者负数。

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

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

	return 0;
}

else后面可以跟一条语句,故后面可以跟if语句,又if与else连贯,所以可以不用{},从而构成if语句,从而完成更多复杂逻辑的判断。

1.5 悬空else问题

如果有多个if和else,可以记住else总是更最近的if匹配。

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("haha\n");
	else
			printf("hehe\n");
	return 0;

}

程序运行结果是什么呢?

可能很多初学魔法师,上来就判断a为0,不等于1,那就执行else语句,打印haha。但如果你运行代码,输出的结果:什么都不输出。

在这里插入图片描述
在这里插入图片描述

这是为什么呢?

这就是悬空else问题,如果多个if和else,else总是和最近的if匹配。在上面的代码排版中,我故意让else与第一个if对齐,让我们误以为else与第一个if匹配的。故而当if不成立时,自然想到的就是执行else语句,打印hehe,实际上else是和第二个if进行配套,这样后面的if…else…语句嵌套在第一个if语句中。如果第一个if不成立,嵌套的if…else…就没法执行,最终什么都不打印。真正的书写是如下的:

代码语言:javascript
复制
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("haha\n");
	    else
			printf("hehe\n");
	return 0;

}

如果代码改成下面的这样就更容易理解:

代码语言:javascript
复制
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	[
		if (b == 2)
			printf("haha\n");
	    else
			printf("hehe\n");
	}
	return 0;

}

如果我们希望else与第一个if匹配,可以这样修改代码:

代码语言:javascript
复制
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("haha\n");
	}
  else
	{
			printf("hehe\n");
    }
  return 0;

}

可以看到只要适当带上大括号,代码的逻辑就会更加清晰,所以大家以后书写代码时注意括号的使用,让代码的可读性更高。

2. 关系操作符

C语言用于比较的表达式,被称为关系表达式,里面的运算符则被称为关系操作符。这些是魔法师用来探测、感知和判断世界的基本工具,就像刻在卷轴上的真理符文或手中的探测仪

它们的本身不产生效果,而是揭示真相。魔法师用它们来探测关于世界的问题:

代码语言:javascript
复制
>(大于运算符):探测左侧的魔力是否在强度或位阶上超越右侧
代码语言:javascript
复制
<(小于运算符):探测左侧的魔力是否在强度或位阶上不及右侧
代码语言:javascript
复制
>=(大于等于运算符):探测左侧的魔力是否在强度或位阶上达到或超越右侧
代码语言:javascript
复制
<=(小于等于运算符):探测左侧的魔力是否在强度或位阶上未超过或恰好等于右侧
代码语言:javascript
复制
==(相等运算符):探测两个魔法元素是否达到完美的和谐共振
代码语言:javascript
复制
!=(不相等运算符):探测两个魔法元素是否存在本质的差异与排斥

下面是一些例子:

代码语言:javascript
复制
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;

注意: ==与=是两个不相等的运算符,不要混淆。

“=”是赋值,“==”是判断相等

判断两个数据是否相等时候,如果其中有一个常量的时候,常量建议写左边 像这样

代码语言:javascript
复制
int k = 5;
if(3 == K)

因为若为

代码语言:javascript
复制
int main()
{
	int k = 5;
	if (k == 3)
		printf("hehe\n");
	return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发现什么都没有输出,但改为k = 3时,系统没有报错(vs2022),出现bug。相当于3在括号里赋值。

如果改成这样的形式编写,则会出现报错。

代码语言:javascript
复制
int main()
{
	int k = 5;
	if (3 = k)
		printf("hehe\n");
	return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关系表达式通常返回0或1,表示真假。

C语言中,0表示假,所有非零值表示真。比如,1<2返回1,1>2返回0。例如:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关系表达式常用于if或while结构,从而来做出判断。

另一个需要注意的错误:多个关系符不宜连用

代码语言:javascript
复制
a < b < c

上面的示例中,连用两个小于运算符。这是合法表示,不会报错,但是不会达到想要的结果,即不会保证变量j的值在i和k之间。因为关系运算符是从左往右计算,属于语法没错,但逻辑是错误的,所以执行的是下面的表达式:

代码语言:javascript
复制
(a < b) < c

先判断a是否小于b,是则被替换为1,不是则被替换为0。最终是0或1和变量c进行比较。例如:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果想判断b是否在a和c之间,应该使用下面的写法:

代码语言:javascript
复制
a < b && b < c

例如:我们输入一个年龄,如果在18到36之间,我们输入青年。

如果我们这样写:

代码语言:javascript
复制
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (18 <= age <= 36)
		printf("青年\n");
	return 0;
}

会发现88岁时还是青年😅。

在这里插入图片描述
在这里插入图片描述

这是因为我们先拿18和88比较,得到返回值为0,再拿0和36比较,0<=36为真,所以打印了青年。如果想解决这个问题应该这么做

代码语言:javascript
复制
if (18 <= age && age <= 36)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发现只有在18~36之间的才能打印出青年

以上就是关于操作符,我们需要掌握的,剩下的只要按字面意思理解使用就行。

3. 条件操作符

条件操作符是一个瞬间窥探两种未来,并立即将一种化为现实的禁忌魔法器物。它的形态可能是一块一分为二又合二为一的水晶,每一半都映照出不同的未来;也可能是一面镜子,左边显示一种结果,右边显示另一种。因此,条件操作符也叫三目操作符,需要三个操作数,形式如下:

代码语言:javascript
复制
exp1 ? exp2 : exp3

其运作逻辑:如果exp1为真,exp2计算,计算结果是整个表达式的结果;如果exp1为假,exp3计算,计算结果是整个表达式的结果。也就是魔法师向其中注入一个条件(一个真/假的问题),水晶会同时在其两个切面上显现出两个可能的结果。然后,根据条件的真假,其中一个切面的景象会瞬间物质化,成为现实,另一个则如泡沫般消散。

代码语言:javascript
复制
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	if (a > 5)
		b = -3;
	else
		b = 3;
	printf("%d", b);
	return 0;
}

改造为:

代码语言:javascript
复制
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d", &a);
	b = a > 5 ? 3 : -3;
	printf("%d", b);
	return 0;
}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 逻辑操作符:&&,||,!

这些运算符不是直接探测世界的符文,而是连接多个基础真理、编织复杂法则的咒语纽带。它们让魔法师能构建出“当A并且B成立时”或“当A或者B成立时”这样的复杂条件。

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

  • !:逻辑取反运算符(改变单个表达式的真假)。
  • &&:逻辑与运算符,就是并且的意思(两侧都为真时,则为真,否则为假)。
  • ||:逻辑或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假。
4.1 逻辑取反运算符 !
在这里插入图片描述
在这里插入图片描述

!:一个可以反转事物真相的逆位符文。它像一面“否定之镜”,将被探测的法则映射为对立面。比如,我们有一个变量叫flag,flag若为假,则可以这样:

代码语言:javascript
复制
int main()
{
	int flag = 0;
	if (!flag)
	{
		printf("haha\n");
	}
	return 0;
}

flag为假时不打印,用!转变一下就可以打印了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.2逻辑与运算符 &&
在这里插入图片描述
在这里插入图片描述

&&:一条必须同时共振所有连接点的魔法锁链,或一个需要所有符文都被点亮才能激活的复合封印。&&是双目运算符,使用方式是a&&b,&&两边的表达式都是真的,整个表达式才为真。只要有一个是假的,则整个表达式为假。例如:

代码语言:javascript
复制
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (18 <= age && age <= 36)
		printf("青年\n");
	return 0;
}
4.3 逻辑或运算符 ||
在这里插入图片描述
在这里插入图片描述

||:一块分流水晶,只要任意一条路径有能量流入,就能激活最终效果。或者一个拥有多个触发条件的魔法契约,满足任意一条件即可生效。||也是双目操作符,使用方式是a||b,||两边有一个表达式只要是真的,那么整个就是真的,否则为假。例如:春天的月份是3或4或5月

代码语言:javascript
复制
int main()
{
	int month = 0;
	scanf("%d", &month);
	if (month == 3 || month == 4 || month == 5)
	{
		printf("春天\n");
	}
	return 0;
}
4.5 短路

C语言逻辑运算符还有个特点,它总是先对左侧的表达式求值,在对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再右边的表达式。这种情况称为 短路

对于&&操作符来说,左边的操作数结果为0时,右边就不再执行。

对于||操作符来说,左边的操作数结果不为0时,右边就不再执行。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行的运算称为短路求值

(暂时就更新这么多,后面会加速持续更新。如有错误,希望各位佬指正。)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 分支语句
    • 1. if语句
      • 1.1 if
      • 1.2 else
      • 1.3 如何在分支中包含多条语句
      • 1.4 嵌套if
      • 1.5 悬空else问题
    • 2. 关系操作符
    • 3. 条件操作符
    • 4. 逻辑操作符:&&,||,!
      • 4.1 逻辑取反运算符 !
      • 4.2逻辑与运算符 &&
      • 4.3 逻辑或运算符 ||
      • 4.5 短路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档