知识点精讲
一、关系运算符基本概念
关系运算符用于比较两个操作数的大小/相等关系 ,运算结果为布尔值:满足关系返回1(真) ,不满足返回0(假) ,核心用于条件判断。
6种关系运算符全表 :
运算符
名称
示例
示例说明
返回值
==
等于
5 == 5
5等于5
1
!=
不等于
5 != 3
5不等于3
1
>
大于
7 > 9
7大于9
0
<
小于
2 < 6
2小于6
1
>=
大于等于
8 >= 8
8大于等于8
1
<=
小于等于
4 <= 1
4小于等于1
0
核心注意 :
==(等于)与=(赋值)是高频易错点!==用于比较,=用于赋值,混淆会导致逻辑错误。
// 正确用法
if (a == 5) { // 判断a是否等于5
printf("a等于5");
}
// 错误用法(典型陷阱)
if (a = 5) { // 实际是给a赋值5,非比较,永远为真
printf("a等于5");
}
二、关系运算符优先级与结合性
优先级规则 :算术运算符 > 关系运算符 > 赋值运算符
// 优先级示例:先算算术运算,再算关系运算
int a = 3 + 2 > 6 - 1;
// 步骤:3+2=5,6-1=5 → 5>5 → 0 → a最终值为0
关系运算符内部优先级 :
>、<、>=、<=(高) > ==、!=(低)
int b = 5 > 3 == 2;
// 步骤:先算5>3=1 → 再算1==2 → 0 → b最终值为0
结合性 :关系运算符为左结合 (从左到右执行)
// 左结合示例(连续比较陷阱)
int c = 1 < 2 < 3;
// 步骤:先算1<2=1 → 再算1<3=1 → c最终值为1(但逻辑上1<2<3本就成立)
int d = 3 > 2 > 1;
// 步骤:先算3>2=1 → 再算1>1=0 → d最终值为0(逻辑陷阱!)
三、特殊类型的关系比较
1. 字符比较(按ASCII码值)
#include
int main() {
char ch1 = 'a', ch2 = 'A';
// 'a'的ASCII码是97,'A'是65 → 97>65 → 返回1
printf("%d\n", ch1 > ch2);
// '0'的ASCII码是48,'9'是57 → 48<57 → 返回1
printf("%d\n", '0' < '9');
return 0;
}
2. 浮点数比较(避免直接用==)
浮点数因精度问题,不能直接用==判断相等,需判断差值是否小于极小值(如1e-6):
#include
#include // 需引入math库
int main() {
float x = 0.1 + 0.2;
float y = 0.3;
// 错误:0.1+0.2=0.30000001,与0.3不相等,返回0
printf("%d\n", x == y);
// 正确:判断差值绝对值小于1e-6,视为相等,返回1
printf("%d\n", fabs(x - y) < 1e-6);
return 0;
}
四、关系运算符常见错误(高频考点)
// 错误示例1:=与==混淆
#include
int main() {
int a = 3;
if (a = 5) { // 赋值操作,a=5,表达式值为5(非0即真)
printf("a等于5"); // 错误执行
}
return 0;
}
// 错误示例2:连续比较陷阱
#include
int main() {
int a = 2;
if (1 < a < 3) { // 1<2=1 → 1<3=1,看似正确
printf("a在1~3之间");
}
int b = 4;
if (1 < b < 3) { // 1<4=1 → 1<3=1,错误执行(b实际不在区间)
printf("b在1~3之间");
}
return 0;
}
例题精选
例题1:关系运算符基本返回值
计算以下关系表达式的返回值,输出最终结果。
#include
int main() {
int a = 8, b = 5;
int res1 = a == b; // 8等于5?
int res2 = a != b; // 8不等于5?
int res3 = a >= b + 2;// 8大于等于5+2?
printf("%d %d %d\n", res1, res2, res3);
return 0;
}
显示结果与解析
运行结果:
0 1 1
解析:
1. res1:8==5不成立,返回0;
2. res2:8!=5成立,返回1;
3. res3:先算b+2=7,8>=7成立,返回1;
4. 核心考点:关系表达式返回值只有1/0,且遵循算术>关系的优先级。
例题2:=与==混淆的错误分析
分析以下代码的执行结果,指出错误并修正。
#include
int main() {
int score = 85;
// 意图:判断分数是否等于60
if (score = 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
return 0;
}
显示结果与解析
运行结果:
及格
解析:
1. 错误原因:if(score=60) 是赋值操作,将60赋值给score,表达式值为60(非0即真),因此执行if分支;
2. 修正方案:将=改为== → if(score == 60);
3. 修正后结果:score=85≠60,执行else分支,输出"不及格";
4. 高频考点:这是中职考试最常见的关系运算符错误,必须重点掌握。
例题3:优先级与结合性实战
计算以下表达式的最终值,写出执行步骤。
#include
int main() {
int x = 3, y = 5, z = 2;
int res = x + y > y - z == z;
printf("res = %d\n", res);
return 0;
}
显示结果与解析
运行结果:
res = 1
解析:
1. 执行步骤:
- 第一步(算术运算):x+y=8,y-z=3;
- 第二步(高优先级关系运算):8>3=1;
- 第三步(低优先级关系运算):1==2=0?→ 注意:此处笔误!正确步骤:y-z=3,z=2 → 8>3=1,1==2=0;
(修正后运行结果:res = 0)
2. 核心规则:
- 算术运算符优先级 > 关系运算符;
- > 优先级 > ==;
- 所有关系运算符均为左结合。
例题4:连续比较的逻辑陷阱
分析代码执行结果,指出连续比较的问题并修正。
#include
int main() {
int num = 4;
// 意图:判断num是否在1~3之间
if (1 < num < 3) {
printf("num在1~3之间\n");
} else {
printf("num不在1~3之间\n");
}
return 0;
}
显示结果与解析
运行结果:
num在1~3之间
解析:
1. 错误原因:连续比较1
2. 修正方案:用逻辑与(&&)替代连续比较 → if(1 < num && num < 3);
3. 修正后结果:num=4不满足条件,执行else分支,输出"num不在1~3之间";
4. 高频考点:连续比较是逻辑陷阱重灾区,考试常考修正方案。
例题5:字符的关系比较(ASCII码)
分析以下字符比较的返回值,解释原因。
#include
int main() {
char c1 = '8', c2 = '5', c3 = 'b', c4 = 'B';
printf("%d\n", c1 > c2); // 数字字符比较
printf("%d\n", c3 < c4); // 大小写字母比较
printf("%d\n", 'A' <= 'Z');// 大写字母范围
return 0;
}
显示结果与解析
运行结果:
1
0
1
解析:
1. 字符比较本质是比较ASCII码值:
- '8'的ASCII码是56,'5'是53 → 56>53 → 返回1;
- 'b'的ASCII码是98,'B'是66 → 98<66不成立 → 返回0;
- 'A'=65,'Z'=90 → 65<=90成立 → 返回1;
2. 核心考点:数字字符/字母字符的ASCII码范围是考试重点(0-9:48-57;A-Z:65-90;a-z:97-122)。
例题6:浮点数比较的易错点
分析代码执行结果,修正浮点数比较的错误。
#include
#include
int main() {
float m = 0.1 + 0.2;
float n = 0.3;
// 错误的比较方式
if (m == n) {
printf("m等于n\n");
} else {
printf("m不等于n\n");
}
// 正确的比较方式
if (fabs(m - n) < 1e-6) {
printf("m约等于n\n");
} else {
printf("m不约等于n\n");
}
return 0;
}
显示结果与解析
运行结果:
m不等于n
m约等于n
解析:
1. 错误原因:浮点数存储有精度误差,0.1+0.2=0.30000001,与0.3的二进制存储值不同,直接用==判断返回假;
2. 修正方案:判断两个浮点数的差值绝对值是否小于极小值(如1e-6),视为相等;
3. 核心考点:浮点数比较是中职考试的高频难点,必须掌握fabs()函数的用法(需引入math.h)。