三、C语言中的分支与循环—条件操作符 与逻辑操作符(3)
本章分支结构的学习内容如下:
三、C语言中的分支与循环—switch语句(4)分支结构 完
本章循环结构的学习内容如下:
三、C语言中的分支与循环—break和continue语句(8)循环结构 完??
1.条件操作符(三目操作符)
condition ? expression1 : expression2
这里,condition
是一个布尔表达式,即它的结果为真(非零)或假(零)。如果 condition
为真,则整个条件操作符的结果是 expression1
的值;如果为假,则结果是 expression2
的值。这个操作符通常用于需要简单条件判断的地方,可以使代码更加简洁。
1)代码练习:使用条件表达式实现找两个数中较大值
在这个例子中,条件操作符用于比较两个整数 a
和 b
。如果 a > b
为真,则 max
被赋值为 a
的值;否则,max
被赋值为 b
的值。这种方式比使用传统的 if-else
语句更加简洁。
#include <stdio.h>
int main() {
int a = 10, b = 20;
// 使用条件操作符决定哪个数较大
int max = (a > b) ? a : b;
printf("较大的数是:%d\n", max);
return 0;
}
2.逻辑操作符(&& , || , !)
1)`&&` (逻辑与)
?当且仅当两个操作数都为真(非零)时,结果为真。如果第一个操作数为假(零),则不再检查第二个操作数(短路行为)。不同操作数的结果如下:
2)`||` (逻辑或)
如果至少一个操作数为真,则结果为真。如果第一个操作数为真,第二个操作数不会被检查(短路行为)。
3) `!` (逻辑非)
如果操作数为假(零),结果为真(1),反之亦然。
4)代码练习1
在这个例子中:
- `a > 0 && b > 0` 检查 `a` 和 `b` 是否都大于 0。
- `a > 0 || c > 0` 检查 `a` 或 `c` 至少有一个大于 0。
- `!c` 检查 `c` 是否等于 0(因为 `c` 为 0,`!c` 的结果为真)。
#include <stdio.h>
int main() {
int a = 5, b = 10, c = 0;
// 逻辑与 (&&)
if (a > 0 && b > 0) {
printf("a 和 b 都大于 0\n");
} else {
printf("a 和 b 不都大于 0\n");
}
// 逻辑或 (||)
if (a > 0 || c > 0) {
printf("a 或 c 至少有一个大于 0\n");
} else {
printf("a 和 c 都不大于 0\n");
}
// 逻辑非 (!)
if (!c) {
printf("c 等于 0\n");
} else {
printf("c 不等于 0\n");
}
return 0;
}
5)代码练习2:闰年的判断
if (1||2)
printf("%d年时闰年",year);
在1的内部有一个与关系,能被4整除并且不能被100整除是闰年,我们可以写成
能被4整除&&不能被100整除
最后结合起来判断闰年的条件是:
if((能被4整除&&不能被100整除)||(能被400整除是闰年))
最终我们的代码如下:
#include <stdio.h>
//闰年判断的规则:
//能被4整除并且不能被100整除是闰年
//能被400整除是闰年
int main()
{
int year = 0;
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0)|| (year % 400 == 0))
printf("%d年是闰年",year);
else
printf("%d年不是闰年", year);
return 0;
}
3.短路现象
&&
(逻辑与)和
||
(逻辑或)时的一种特殊行为。当确定整个逻辑表达式的值无需完全评估所有部分时,某些部分的评估就会被跳过。这种行为可以提高效率,也可以用于条件判断中的某些特殊用途。
1)短路现象详解:
-
逻辑与 (
&&
) 的短路现象: 如果&&
操作符的左侧表达式评估为假(0),则整个表达式的结果必定为假,因此没有必要评估右侧的表达式。例如,在表达式A && B
中,如果A
是假,不论B
的值如何,整个表达式的结果都是假。 -
逻辑或 (
||
) 的短路现象: 如果||
操作符的左侧表达式评估为真(非0),则整个表达式的结果必定为真,因此不需要再评估右侧的表达式。例如,在表达式A || B
中,如果A
是真,不论B
的值如何,整个表达式的结果都是真
2)代码练习
在这个例子中:在main函数外面定义了两个不同的函数,方便调用test1() 和test2(),test1() 和test2()分别有各自的打印任务,如果执行test1() 和test2(),则相应的内容会被打印。
- 在
test1() && test2()
表达式中,因为test1()
返回假(0),所以不会执行test2(),只执行了test1(),所以"执行了 test1"这句话被打印
。 - 在
test2() || test1()
表达式中,因为test2()
返回真(非0),所以不会执行test1(),只执行了
test2() ,所以"执行了 test2"这句话被打印
。
短路现象在实际编程中非常有用,特别是当右侧表达式依赖于左侧表达式的结果时。例如,避免除以0的错误或在访问数组或指针之前先检查它们是否为 NULL
。
#include <stdio.h>
int test1() {
printf("执行了 test1\n");
return 0; // 返回假(0)
}
int test2() {
printf("执行了 test2\n");
return 1; // 返回真(非0)
}
int main() {
printf("测试逻辑与 (&&) 的短路现象:\n");
if (test1() && test2()) { // 因为 test1 返回假,所以 test2 不会执行
printf("两者都为真\n");
} else {
printf("至少有一个为假\n");
}
printf("\n测试逻辑或 (||) 的短路现象:\n");
if (test2() || test1()) { // 因为 test2 返回真,所以 test1 不会执行
printf("至少有一个为真\n");
} else {
printf("两者都为假\n");
}
return 0;
}
4.知识点结合的代码练习
#include <stdio.h>
int main()
{
int A = 0;
int B = 0;
scanf("%d%d", &A, &B);
(A && B) ? (printf("A和B在一起")) : (printf("A和B做朋友"));
return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!