
迄今为止,我们的咒语(程序)只是简单地将符文(语句)依次激活,效果单一而直接,显得僵硬迟钝。但真正的强大的魔法,在于控制与凝聚,灵活多变,能够更好的应对这个风诡波谲的世界。 想象一下你有一个自动凝聚能量直至饱和的法阵,一个是能循环往复运转的魔法钟摆…你的魔法将告别死板,拥有真正的“灵魂”与“力量”。准备好施展你的第一个智能魔法了吗?
分支语句就像魔法师手中的预言水晶球或一个命运的岔路口,存在着许许多多的可能。
if语句:就像魔法师凝视水晶球,窥探未来的一个片段。
if语句的语法形式如下:
if(表达式)
语句表达式成立(为真),则语句执行。表达式不成立(为假),则语句不执行。
C语言中,0为假,非0为真,也就是表达式的结果如果是0,则语句不执行,表达式的结果不为0,则语句执行。
例子:输入一个整数,判断是否为偶数
#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;
}

else语句:如果水晶球里面显示的是两种未来,那么魔法师就必须选择其中一个未来,此时就需要if…else…语句。
else语句语法如下:
if(表达式)
语句1
else
语句2 例子:输入一个年龄,>=18岁就输出:可以谈恋爱了,否则就输出:不可以谈恋爱。
#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;
} 一般情况下,if和else在水晶球中只能看到某一个固定的片段。即if和else语句中默认都只控制一条语句,例如:
#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…语句同时控制多种片段(语句),那我们应该怎么办呢?那么就需要{}将代码给括起来。形成一整套连贯的、组合的魔法动作或仪式步骤,不再是单一的法术,而是一个法术序列。例子如下:


嵌套if就像是层层深入的预言。它不再是一次简单的“是或否”的抉择,而是一个逻辑层层递进、环环相扣的决策过程。即在if…else…语句中,else可以与另一个if语句连用,构成多重判断。
例如:要求输入一个整数,判断输入的整数是0,还是整数或者负数。
#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语句,从而完成更多复杂逻辑的判断。
如果有多个if和else,可以记住else总是更最近的if匹配。
#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…就没法执行,最终什么都不打印。真正的书写是如下的:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("haha\n");
else
printf("hehe\n");
return 0;
}如果代码改成下面的这样就更容易理解:
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匹配,可以这样修改代码:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("haha\n");
}
else
{
printf("hehe\n");
}
return 0;
}可以看到只要适当带上大括号,代码的逻辑就会更加清晰,所以大家以后书写代码时注意括号的使用,让代码的可读性更高。
C语言用于比较的表达式,被称为关系表达式,里面的运算符则被称为关系操作符。这些是魔法师用来探测、感知和判断世界的基本工具,就像刻在卷轴上的真理符文或手中的探测仪。
它们的本身不产生效果,而是揭示真相。魔法师用它们来探测关于世界的问题:
>(大于运算符):探测左侧的魔力是否在强度或位阶上超越右侧<(小于运算符):探测左侧的魔力是否在强度或位阶上不及右侧>=(大于等于运算符):探测左侧的魔力是否在强度或位阶上达到或超越右侧<=(小于等于运算符):探测左侧的魔力是否在强度或位阶上未超过或恰好等于右侧==(相等运算符):探测两个魔法元素是否达到完美的和谐共振!=(不相等运算符):探测两个魔法元素是否存在本质的差异与排斥下面是一些例子:
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;注意: ==与=是两个不相等的运算符,不要混淆。
“=”是赋值,“==”是判断相等
判断两个数据是否相等时候,如果其中有一个常量的时候,常量建议写左边 像这样
int k = 5;
if(3 == K)因为若为
int main()
{
int k = 5;
if (k == 3)
printf("hehe\n");
return 0;
}

发现什么都没有输出,但改为k = 3时,系统没有报错(vs2022),出现bug。相当于3在括号里赋值。
如果改成这样的形式编写,则会出现报错。
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结构,从而来做出判断。
另一个需要注意的错误:多个关系符不宜连用。
a < b < c上面的示例中,连用两个小于运算符。这是合法表示,不会报错,但是不会达到想要的结果,即不会保证变量j的值在i和k之间。因为关系运算符是从左往右计算,属于语法没错,但逻辑是错误的,所以执行的是下面的表达式:
(a < b) < c先判断a是否小于b,是则被替换为1,不是则被替换为0。最终是0或1和变量c进行比较。例如:


如果想判断b是否在a和c之间,应该使用下面的写法:
a < b && b < c例如:我们输入一个年龄,如果在18到36之间,我们输入青年。
如果我们这样写:
int main()
{
int age = 0;
scanf("%d", &age);
if (18 <= age <= 36)
printf("青年\n");
return 0;
}会发现88岁时还是青年😅。

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

发现只有在18~36之间的才能打印出青年。
以上就是关于操作符,我们需要掌握的,剩下的只要按字面意思理解使用就行。
条件操作符是一个瞬间窥探两种未来,并立即将一种化为现实的禁忌魔法器物。它的形态可能是一块一分为二又合二为一的水晶,每一半都映照出不同的未来;也可能是一面镜子,左边显示一种结果,右边显示另一种。因此,条件操作符也叫三目操作符,需要三个操作数,形式如下:
exp1 ? exp2 : exp3其运作逻辑:如果exp1为真,exp2计算,计算结果是整个表达式的结果;如果exp1为假,exp3计算,计算结果是整个表达式的结果。也就是魔法师向其中注入一个条件(一个真/假的问题),水晶会同时在其两个切面上显现出两个可能的结果。然后,根据条件的真假,其中一个切面的景象会瞬间物质化,成为现实,另一个则如泡沫般消散。
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = -3;
else
b = 3;
printf("%d", b);
return 0;
}改造为:
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = a > 5 ? 3 : -3;
printf("%d", b);
return 0;
}

这些运算符不是直接探测世界的符文,而是连接多个基础真理、编织复杂法则的咒语纽带。它们让魔法师能构建出“当A并且B成立时”或“当A或者B成立时”这样的复杂条件。
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

!:一个可以反转事物真相的逆位符文。它像一面“否定之镜”,将被探测的法则映射为对立面。比如,我们有一个变量叫flag,flag若为假,则可以这样:
int main()
{
int flag = 0;
if (!flag)
{
printf("haha\n");
}
return 0;
}flag为假时不打印,用!转变一下就可以打印了。



&&:一条必须同时共振所有连接点的魔法锁链,或一个需要所有符文都被点亮才能激活的复合封印。&&是双目运算符,使用方式是a&&b,&&两边的表达式都是真的,整个表达式才为真。只要有一个是假的,则整个表达式为假。例如:
int main()
{
int age = 0;
scanf("%d", &age);
if (18 <= age && age <= 36)
printf("青年\n");
return 0;
}
||:一块分流水晶,只要任意一条路径有能量流入,就能激活最终效果。或者一个拥有多个触发条件的魔法契约,满足任意一条件即可生效。||也是双目操作符,使用方式是a||b,||两边有一个表达式只要是真的,那么整个就是真的,否则为假。例如:春天的月份是3或4或5月
int main()
{
int month = 0;
scanf("%d", &month);
if (month == 3 || month == 4 || month == 5)
{
printf("春天\n");
}
return 0;
}C语言逻辑运算符还有个特点,它总是先对左侧的表达式求值,在对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再右边的表达式。这种情况称为 短路。
对于&&操作符来说,左边的操作数结果为0时,右边就不再执行。
对于||操作符来说,左边的操作数结果不为0时,右边就不再执行。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行的运算称为短路求值。
(暂时就更新这么多,后面会加速持续更新。如有错误,希望各位佬指正。)