C语言关系、条件和逻辑操作符详解
C语言关系、条件和逻辑操作符详解
C语言中的关系操作符、条件操作符和逻辑操作符是编程的基础,正确理解和使用这些操作符对于编写高效、正确的代码至关重要。本文将详细介绍这些操作符的用法、常见错误以及实际应用,帮助读者掌握C语言中的基本逻辑运算。
关系操作符
C语言中用于比较的表达式称为“关系表达式”(relational expression),其中使用的运算符称为“关系运算符”(relational operator)。主要的关系运算符有6个:
>
:大于运算符<
:小于运算符>=
:大于等于运算符<=
:小于等于运算符==
:相等运算符!=
:不相等运算符
关系表达式的一些例子:
a == b
a != b
a < b
a > b
a <= b
a >= b
关系表达式通常返回0或1,表示真假。例如,如果a
等于b
,表达式会返回1(真);如果a
不等于b
,表达式会返回0(假)。
“==”与“=”的区别
需要注意的是,相等运算符“==”与赋值运算符“=”是两个不同的运算符,不要混淆。
例如,当键盘输入3时,if
表达式中a
(3)判断等于3,if
表达式为真,打印“hehe”。如果输入5,if
表达式中a
(5)判断不等于3,if
表达式为假,打印“haha”。
为了避免错误,建议将常量写在左边,变量写在等号右边,例如if (3 == a)
。这样,如果误将“==”写成“=”,编译器会报错,因为不能将变量赋值给常量。
多个关系运算符不宜连用
另一个需要避免的错误是多个关系运算符的连续使用,例如i < j < k
。这种写法虽然合法但通常达不到预期结果,因为关系运算符是从左到右计算的,实际执行的是(i < j) < k
。
例如,下面的代码中,即使age
为10,也会打印“青年”,因为18 <= age
为假(返回0),而0 <= 40
为真。
多个关系运算符判断值是否在中间的写法
如果要判断一个值是否在两个值之间,应该使用逻辑与运算符&&
,例如i < j && j < k
。
例如,要判断年龄是否在18岁到36岁之间,应该使用:
if (age >= 18 && age <= 36)
{
printf("青年\n");
}
条件操作符
条件操作符也称为三目操作符,是C语言中唯一的三目操作符,形式为exp1 ? exp2 : exp3
。如果exp1
为真,则计算exp2
;如果exp1
为假,则计算exp3
。
练习1:使用条件操作符改造代码
将以下代码中的if...else...
语句使用条件操作符改造:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
改造后的代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = (a > 5 ? 3 : -3);
printf("%d\n", b);
return 0;
}
练习2:使用条件表达式实现找两个数中较大值
可以使用条件表达式实现找两个数中较大值的功能:
#include <stdio.h>
int main()
{
int a, b, max;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
max = (a > b ? a : b);
printf("较大的数是:%d\n", max);
return 0;
}
逻辑操作符
逻辑运算符用于构建更复杂的表达式,主要有三个运算符:
!
:逻辑取反运算符&&
:逻辑与运算符||
:逻辑或运算符
逻辑取反操作符:!
逻辑取反运算符!
只有一个操作数,是非0(真)变为0(假),0(假)变为1(真)。
逻辑与运算符:&&
逻辑与运算符&&
表示“并且”的关系,只有两侧的表达式都为真时整个表达式才为真。
逻辑或运算符:||
逻辑或运算符||
表示“或者”的关系,只要两侧的表达式中有一个为真,整个表达式就为真。
练习:闰年的判断
输入一个年份year
,判断是否是闰年。闰年的判断规则:
- 能被4整除且不能被100整除的是闰年
- 能被400整除的是闰年
可以使用逻辑运算符实现:
#include <stdio.h>
int main()
{
int year;
printf("请输入年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
printf("%d是闰年\n", year);
}
else
{
printf("%d不是闰年\n", year);
}
return 0;
}
短路求值
C语言逻辑运算符具有短路求值的特点,即如果左侧的表达式已经能够确定整个表达式的结果,就不再计算右侧的表达式。
例如:
int a = 0, b = 2, c = 3, d = 4;
int i = a++ && ++b && d++;
在这个例子中,由于a++
的结果为0,整个表达式的结果已经确定为0,因此++b
和d++
都不会被执行。只有a
在使用后自加了1,即a=1
,而b
、c
、d
的值不变。
将&&
改为||
时:
int a = 0, b = 2, c = 3, d = 4;
int i = a++ || ++b || d++;
由于a++
的结果为0,需要继续计算++b
。++b
的结果为3,整个表达式的结果已经确定为1,因此d++
不会被执行。只有a
在使用后自加了1,即a=1
,而b
、c
、d
的值不变。