1. if
语句
1.1 if
if 语句的语法形式如下
scss
if ( 表达式 )
语句
表达式为真,则执行语句;表达式为假,则不执行该语句。
在C语言中,0为假,非0表示为假。也就是说,当表达式的结果是0时,则语句不被执行;当表达式的结果是1时,则该语句被执行。
代码题:输入一个整数,判断是否为奇数
arduino
# include <stdio.h>
int main()
{
int num = 0;
// 输入
scanf("%d", &num);
// 判断和输出
if (num % 2 == 1)
printf("%d 是奇数", num);
return 0;
}
1.2 else
在上面的代码当中,我们可以看到如果过输入的数是一个奇数,它会输出该数是一个奇数。如果输入的一个数它不是奇数,而是一个偶数呢?
因此,我们对上面的代码题目进行变形,即:如果任意一个非零数的整数,我们要清除的判断是奇数还是偶数。这时我们就需要用到if...else...
语句了,其语法格式如下
arduino
if ( 表达式 )
语句1
else
语句2
若表达式为真,则执行语句1;若表达式为假,则执行语句2。
代码题:输入一个整数,判断是否为奇数,如果为奇数打印奇数,否者打印偶数
arduino
# include <stdio.h>
int main()
{
int num = 0;
// 输入
scanf("%d", &num);
// 判断和输出
if (num % 2 == 1)
printf("%d 是奇数\n",num);
else
printf("%d 是偶数\n",num);
return 0;
}
1.3 分支中包含多条语句
一个错误的代码举例
arduino
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
printf("完全民事行为能力人\n");
else
printf("未成年\n");
printf("限制或无民事行为能力人");
return 0;
}

这个错误的原因是:在C语言默认情况下,if
和else
的后面只能跟着一条语句
如果要跟多条语法的话,可以使用{}
,修正代码如下
arduino
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("成年\n");
printf("完全民事行为能力人\n");
}
else
{
printf("未成年\n");
printf("限制或无民事行为能力人");
}
return 0;
}
1.4 嵌套if
在if else
语句中,else
可以与另一个if
语句连用,构成多重判断。
代码题:要求输入一个整数,判断输入的整数是0,还是正数或者负数。
-
解答方式一:
arduino# 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; }
-
解答方式二:也是比较推荐的写法
arduino# 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; }
一个小练习:
输入一个人的年龄
如果年龄 < 18岁, 打印"少年"
如果年龄 在 18岁到44岁, 打印"青年"
如果年龄 在 45岁到59岁, 打印"中老年"
如果年龄 在 60岁到89岁, 打印"老年"
如果年90岁及以上, 打印"老寿星"
我将在本篇文档的末尾放入我的解答方案
如果有多个if
和else
,可以记住这样一条规则,else
总是跟最近的if
匹配
我们首先从下面的代码开始
ini
# 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
语句,打印hehe
但是当去运行该段代码,输出的结果实际上是啥都不输出
因此我们一定要养成良好的代码习惯,上段代码复制到编译器VS2022后会自动对齐即,else
总是跟最近的if
匹配,如下图所示

2. 关系操作符
C语言用于比较的表达式,称为 "关系表达式" ,里面使用的运算符就成为 "关系运算符" ,主要有下面6个
>
: 大于运算符<
:小于运算符>=
:大于等于运算符<=
:小于等于运算符==
:相等运算符!=
:不相等运算符
下面是一些例子
arduino
# include <stdio.h>
int main()
{
int a = 0;
int b = 0;
// 输入
scanf("%d %d", &a, &b);
// 判断和输出
if (a > b)
printf("haha\n");
else if (a < b)
printf("hehe\n");
else if (a == b)
printf("xixi\n");
return 0;
}
关系表达式通常返回0
和1
,表示真假
C语言中,0
表示表达式为假,非零表示表达式为真, 比如40 > 36
表达式返回值为1
, 36 > 40
表达式返回值为0
。
关系表达式常用于if
或while
结构。
注意区分: 赋值运算符 =
和 相等操作符 ==
,有时候,虽然赋值运算符和相等操作符被混用,它可以运行,但很容易出现下面意想不到的结果。大家认为下面的代码会输出什么呢?
arduino
#include <stdio.h>
int main()
{
int a = (5 == 5);
printf("%d\n", a);
return 0;
}
-
当一个变量和一个常量作比较的时候,应该怎么写?
建议把常量放在 == 的左边
arduino#include <stdio.h> int main() { // = or == int a = 5; if (5 == a) { printf("hehe\n"); } return 0; }
关系操作符尽量不要连着使用,例如
ini
#include <stdio.h>
int main()
{
int a = 3;
int b = 7;
int c = 4;
if (a < b < c)
printf("hehe\n");
return 0;
}
我们尝试运行该代码,程序判断表达式a<b<c
为真,输出hehe
,
但是我们从数学的角度来看3<7<4
显然是不正确,但是为什么程序会打印hehe
。
而在计算机的视角,连续的关系操作符,会从左向右依次判断,首先是判断a<b
(3<7
),表达式成立,此时3<7<4
就写成了1<7
,表达式以及成立,因此,程序判断表达式a<b<c
为真,输出hehe
所以,要构造一个符合数学逻辑的关系操作的表达式,修改后的代码为
ini
#include <stdio.h>
int main()
{
int a = 3;
int b = 7;
int c = 4;
/*if (a < b < c)
printf("hehe\n");*/
if (a < b && b < c)
printf("hehe\n");
return 0;
}
这里的&&
为逻辑且 ,即 a < b
为真并且b < c
为真时,表达式才为真
代码题:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年
arduino
#include <stdio.h>
int main()
{
int age = 0;
// 输入
scanf("%d", &age);
// 判断和输出
if (age >= 18 && age <= 36)
printf("青年\n");
return 0;
}
3. 条件操作符
条件操作符也叫做三目操作符,需要接受三个操作数,语法格式如下
exp1 ? exp2 : exp3
- 说明:如果语句1表达式为真,则执行语句2;如果语句1表达式为假,则执行语句3
代码题:使用条件表达式实现找两个数中的最大值
arduino
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
int m = (a > b ? a : b);
printf("m = %d\n", m);
return 0;
}
4. 逻辑操作符:&&,||,!
逻辑运算符提供逻辑判断功能,用来构建更复杂的表达式,主要有下面三个运算符
!
: 逻辑取反运算符(它能够改变单个运算符的真假)&&
:逻辑与运算符,就是并且的意思。也就是说,当&&
两侧的表达式都是真的时候,整个表达式才为真;两侧的表达式只要有一个为假,那么整个表达式就是假的。||
:逻辑或运算符,就是或者的意思。也就是说,当||
两侧的表达式只要有一个为真,那么整个表达式就为真;当两侧的表达式全为假时,整个表达式才为假。
注意: C语言中,非0
表示真,0
表示假。
逻辑取反运算符 !
a | !a |
---|---|
非0 | 0 |
0 | 1 |
比如,我们有一个变量叫做flag
,如果flag
为假,要做一个什么事情,就可以写出下面的代码
arduino
#include <stdio.h>
int main()
{
int flag = 5;
scanf("%d", &flag);
if (!flag) // flag 为假要做什么事
{
printf("haha\n");
}
return 0;
}
如果flag
为真,!flag
就是假;如果flag
为假,!flag
就是真。所以该段代码的意思就是如果flag
为假,执行if
语句中的代码。
逻辑与运算符 &&
表达式:a | 表达式:b | 表达式:a&&b |
---|---|---|
非0 | 非0 | 1 |
非0 | 0 | 0 |
0 | 非0 | 0 |
0 | 0 | 0 |
&&
就是逻辑与运算符,就是并且的意思。&&
是一个双目操作符,使用的方式是a&&b
,&&
两边的表达式都是真的时候,整个表达式才为真;只要有一个表达式是假的,则整个表达式为假。
例如,一年当中哪些月份是春天?
请使用代码实现,输入一个月份,判断他是不是春天。
思路: 一年有1月~12月,这其中,3月,4月,5月是春天,
假设我们的输入是
x
,此时x
必需满足:
3 <= x <= 5
也就是,既要满足大于等于3,又要满足小于等于5
以下是示例代码:
arduino
#include<stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if (month >= 3 && month <= 5)
{
printf("春天\n");
}
return 0;
}
逻辑或运算符 ||

||
就是逻辑或运算符,就是或者的意思。||
是一个双目操作符,使用的方式是a||b
,||
两边的表达式只要有一个表达式是真的,则整个表达式为真;两边的表达式都是假的时候,整个表达式才为假。
例如,一年当中哪些月份是冬天?
请使用代码实现,输入一个月份,判断他是不是冬天。
思路: 一年有1月~12月,这其中,1月,2月,12月是冬天,
假设我们的输入是
x
,此时x
必需满足:
x == 1
或者x == 2
或者x == 12
也就是,输入的
x
满足:等于1,等于2 ,等于12三个等式满足其中一个即可
以下是示例代码:
arduino
#include<stdio.h>
int main()
{
int month = 0;
scanf("%d", &month);
if (month == 1 || month == 2 || month == 12)
{
printf("冬天\n");
}
return 0;
}
练习:闰年的判断
输入一个年份year
,判断year
是否式闰年
闰年的判断规则:(下面的条件满足其中一个即可)
- 能被
4
整除并且不能够被100
整除的是闰年- 能被
400
整除的是闰年
以下是一段代码示例
arduino
#include<stdio.h>
int main()
{
int year = 0;
scanf("%d", &year);
//方法1
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("%d 是闰年", year);
}
// 方法2
if ((year % 4 == 0) && (year % 100 != 0))
{
printf("%d 是闰年", year);
}
else if (year % 400 == 0)
{
printf("%d 是闰年", year);
}
return 0;
}
短路
C语言逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是可以保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为**''短路"**
像前面的代码:
sql
if (month >= 3 && month <= 5)
表达式中&&
的左边操作数是 month >= 3
,右边的操作数为month <= 5
。当输入的值不满足左边的操作数 month >= 3
时,即使不判断右边的操作数month <= 5
,也能够得出整个表达式的结果为假 (值为0
)。
也就是说对于逻辑与运算符 --- &&
,左边操作数的结果为0
时,右边的操作数就不再执行。
那么对于逻辑或运算符 --- ||
呢?我们结合前面的代码:
sql
if (month == 1 || month == 2 || month == 12)
如果输入的值满足 month == 1
,则不用再判断month
是否等于2
或12
,整个表达式为真(值为1
)。
所以,逻辑或运算符 --- ||
的左边操作数的结果不为0
时,就无需执行右边操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
下面是一个关于短路求值的问题的代码示例
css
#include<stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
// 问题1
i = (a++ && ++b && d++);
// 问题2
i = (a++ || ++b || d++);
printf("i = %d, a = %d, b = %d, c = %d, d = %d", i, a, b, c, d);
return 0;
}

参考代码 1.4 节练习
-
方法1
arduino# include <stdio.h> int main() { int age = 0; // 输入 scanf("%d", &age); // 判断和输出 if (age < 18) printf("未成年\n"); else if (age <= 44) printf("青年\n"); else if (age <= 59) printf("中老年"); else if (age <= 89) printf("老年"); else printf("老寿星"); return 0; }
-
方法2
arduino# include <stdio.h> int main() { int age = 0; // 输入 scanf("%d", &age); // 判断和输出 if (age < 18) printf("未成年\n"); else { if (age <= 44) printf("青年\n"); else { if (age <= 59) printf("中老年"); else { if (age <= 89) printf("老年"); else printf("老寿星"); } } } return 0; }
来源
本篇文章来自于b站鹏哥C语言教学视频的学习笔记