本章分支结构的学习内容如下:
三、C语言中的分支与循环—if语句 (1)
三、C语言中的分支与循环—关系操作符 (2)
三、C语言中的分支与循环—条件操作符 与逻辑操作符(3)
三、C语言中的分支与循环—switch语句(4)分支结构 完
本章循环结构的学习内容如下:
三、C语言中的分支与循环—while循环 (5)
三、C语言中的分支与循环—for循环 (6)
三、C语言中的分支与循环—do-while循环 (7)
三、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;
}