三、C语言中的分支与循环—条件操作符 与逻辑操作符(3)

发布时间:2024年01月03日

本章分支结构的学习内容如下:

三、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)代码练习:使用条件表达式实现找两个数中较大值

在这个例子中,条件操作符用于比较两个整数 ab。如果 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:闰年的判断

输入?个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年
我们观察这个逻辑,发现1和2只要有一个满足就可是闰年,1和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.短路现象

C语言中的短路现象(Short-circuit Evaluation)指的是在使用逻辑操作符 &&(逻辑与)和 ||(逻辑或)时的一种特殊行为。当确定整个逻辑表达式的值无需完全评估所有部分时,某些部分的评估就会被跳过。这种行为可以提高效率,也可以用于条件判断中的某些特殊用途。

1)短路现象详解:

  1. 逻辑与 (&&) 的短路现象: 如果 && 操作符的左侧表达式评估为假(0),则整个表达式的结果必定为假,因此没有必要评估右侧的表达式。例如,在表达式 A && B 中,如果 A 是假,不论 B 的值如何,整个表达式的结果都是假。

  2. 逻辑或 (||) 的短路现象: 如果 || 操作符的左侧表达式评估为真(非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.知识点结合的代码练习

如果AB值都为非零则输出在一起,否则做朋友
#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;
}

文章来源:https://blog.csdn.net/m0_52889787/article/details/135285774
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。