捋一捋C++中的逻辑运算(一)——表达式逻辑运算

2024-06-04 20:28

本文主要是介绍捋一捋C++中的逻辑运算(一)——表达式逻辑运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意,今天要谈的逻辑运算是C++语言编程中的“与或非”逻辑运算,不是数学集合中的“交并补”逻辑运算。而编程中的逻辑运算又包括表达式逻辑运算和位逻辑运算,本章介绍表达式逻辑运算,下一章介绍位逻辑运算。

目录

一、几个基本的概念

二、逻辑运算

1、逻辑表达式的计算顺序

(1)运算符优先级

(2)逻辑表达式的运算顺序

①人工分析

②程序验证

2、复合逻辑运算与数学区间的关系

3、表达式逻辑运算的应用

(1)和if……else搭配

(2)和条件表达式搭配


一、几个基本的概念

要想搞清楚表达式逻辑运算,首先要了解关系运算符、关系表达式、逻辑运算符、逻辑表达式4个概念。

1、关系运算符

关系运算符,有6种关系,分别为小于(<)、大于(>)、等于(==)、小于等于(<=)、大于等于(>=)、不等于(!=)

2、关系表达式

关系表达式是指计算机程序中用关系运算符将两个表达式连接起来的式子。

关系表达式的值是逻辑值“真”或“假”。但是C++语言没有逻辑型变量和逻辑型常量,也没有专门的逻辑值,故以“非0”代表“真”,以“0”代表“假”。在关系表达式求解时,以“1”代表“真”,以“0”代表假。当关系表达式成立时,表达式的值为1,否则表达式的值为0。

关系表达式有双目和单目两种。

(1)双目

就是关系表达式中有两个表达式,比如,a>b,c<10,a==4,a<=8等。

#include <iostream>
using namespace std;
int main() {int a=3,b=2;bool c,d,e;c=a>b;d=a<b;e=(a==b);cout << "a大于b的逻辑值:"<< c << endl;cout << "a小于b的逻辑值:"<< d << endl;cout << "a等于b的逻辑值:"<< e << endl;return 0;
}

运行结果为:

a大于b的逻辑值:1
a小于b的逻辑值:0
a等于b的逻辑值:0

(2)单目

就是关系表达式只有一个表达式,a+b,a,b*c等等。那么有人问了,关系表达式就是要有比较,只有一个表达式,怎么比较,和谁比较?

单目关系表达式,实际是这个表达式和“0”进行比较,如果这个表达式的结果是0,就是“假”,其值为0,如果这个表达式的结果非0,就是“真”,其值为1。特别要注意,代表真的是“非0”,而不是“1”,也就是任何一个“非0”的数,都逻辑值都是“真”,包括小数和负数。

#include <iostream>
using namespace std;
int main() {float a=3,b=0.3,c=-5,d=0;bool b1,b2,b3,b4;b1=a;b2=b;b3=c;b4=d;cout << "3的逻辑值:"<<b1<< endl;cout << "0.3的逻辑值:"<< b2<< endl;cout << "-5的逻辑值:"<< b3<< endl;cout << "0的逻辑值:"<< b4<< endl;return 0;
}

运行结果:

3的逻辑值:1
0.3的逻辑值:1
-5的逻辑值:1
0的逻辑值:0

3、逻辑运算符

C++中表达式逻辑运算有“逻辑与”、“逻辑或”和“逻辑非”3种,对应的逻辑运算符为“&&”,“||”,“!”。“逻辑与”和“逻辑或”是双目运算,是两个关系表达式进行逻辑运算,“逻辑非”是单目运算,是一个关系表达式进行取反运算。关系表达式1用“A”代表,关系表达式2用“B”代表,逻辑运算的规则如表1所示。

表1 三种逻辑运算规则
逻辑运算逻辑运算结果为“真”逻辑运算结果为“假”
A && BA、B都为“真”A、B不都为“真”
A || BA、B不都为“假”A、B都为“假”
!AA为“假”A为“真”

4、逻辑表达式

用逻辑运算符将关系表达式或逻辑量连接起来的有意义的式子称为逻辑表达式。逻辑表达式的值是一个逻辑值,即“true”或“false”。C语言编译系统在给出逻辑运算结果时,以数字1表示“真”,以数字0表示“假”,但在判断一个量是否为“真”时,以0表示“假”,以非0表示“真”。

注意,逻辑表达式中可以由多个逻辑运算符、多种运算符复合而成。如“A && B || C”,“A && !B”。

二、逻辑运算

那么搞清楚以上4个概念后,也就能搞清楚什么是逻辑运算了,逻辑运算就是求逻辑表达式的逻辑值。那么在进行逻辑运算时需要注意以下几点:

1、逻辑表达式的计算顺序

因为逻辑表达式由多个关系表达式、多个逻辑运算符复合而成,那么就要搞清楚计算的顺序。

(1)运算符优先级

常见的运算符包括算数运算符(+,-,*,/等),关系运算符(>,<,>=,<=,==,!=),逻辑运算符(&&,||,!)和赋值运算符(=)。那么这四种运算符的优先级为:

括号逻辑非 >算数运算符关系运算符> 逻辑与> 逻辑或 > 赋值运算符

尤其要注意的是:逻辑非的优先级比算数运算符还要高

(2)逻辑表达式的运算顺序

逻辑表达式的运算规则为:先计算优先级高的运算符,同一优先级中的运算符按照从左到右依次计算。

例:假设a=3,b=0.3,c=2,d=0,那么逻辑表达式“ !(a<b+c)||b<c&&d>0”的结果是多少?

先来编制程序如下,声明一个bool型变量b1,并将!(a<b+c)||b<c&&d>0的值赋值给b1,这样表达式中就包含了上述运算符的所有情况。

①人工分析

先来分析一下“b1=  !(a<b+c)||b<c&&d>0”的结果:

第一步:括号优先级最高,所以首先要计算括号中a<b+c的值,而a<b+c中有算数运算符和关系运算符,算数运算符优先级更高,先计算b+c,结果为2.3,逻辑表达式变为以下情况:

b1=  !(a<2.3)||b<c&&d>0

第二步:括号中有两步计算,只完成一步,括号还没去去掉,仍然优先级最高,下一步要计算关系表达式a<2.3的值,a=3,所以a<2.3的逻辑值为假,也就是0,逻辑表达式变为以下情况:

b1=  !0||b<c&&d>0

第三步:表达式中括号已经去掉,优先级最高的是“逻辑非”,!0=1,所以表达式变为:

b1=  1||b<c&&d>0

第四步:表达式中只有关系运算符和逻辑运算符,优先计算关系运算符b<c和d>0,逻辑值分别为1和0,表达式变为:

b1=  1||1&&0

第五步:表达式中只有逻辑运算符,逻辑与高于逻辑或,先计算1&&0,结果为0,表达式变为:

b1=  1||0

第六步:表达式中只有一个逻辑运算符,计算1||0,结果为1,表达式变为:

b1=  1

第七步:逻辑表达式已经计算出结果,最后只剩赋值运算符,把1赋值给变量b1,运算结束。

所以最终打印b1的结果应该为1。

整理以上计算过程如下:

假设a=3,b=0.3,c=2,d=0,那么

b1  =  !(a<b+c)||b<c&&d>0

      =  !(a<2.3)||b<c&&d>0

      =  !0||b<c&&d>0

      =  1||b<c&&d>0

      =  1||1&&0

      =  1||0

      =  1

②程序验证

下边编制程序验证一下,代码如下:

#include <iostream>
using namespace std;
int main() {    float a=3,b=0.3,c=2,d=0;bool b1;b1=  !(a<b+c)||b<c&&d>0;cout << "逻辑值:"<<b1<< endl;   return 0;
}

运行结果为:

逻辑值:1

与分析的结果一致,验证分析方法无误。

2、复合逻辑运算与数学区间的关系

a>3 && a<5,如果逻辑值为真时,表示a\in\left ( 3,5 \right );逻辑值为假时,表示a\notin \left ( 3,5 \right )

a>3 || a<0,如果逻辑值为真时,表示a\in\left ( -\propto ,0 \right )\bigcup \left ( 3,\propto \right );逻辑值为假时,表示a\in\left [ 0,3 \right ]

3、表达式逻辑运算的应用

在编程中,逻辑运算一般都和选择结构搭配使用,选择结构有单分支和双分支两种,如图1所示,图中的条件表达式就是逻辑表达式。

图1 选择结构

(1)和if……else搭配

最常用的就是和if……else搭配,格式如下:

if(逻辑表达式)
{执行代码1;
}
else
{执行代码2;
}

if后边的逻辑表达式计算的结果为真时,执行代码1,计算结果为假时,执行代码2。

(2)和条件表达式搭配

C++中的条件表达式,也称为问号表达式,是一种三目运算符,是一种简洁的条件表达式,它可以根据条件选择不同的值。这种表达式的通用形式为:“expression1?expression2:expression3”。其中,expression1 是条件表达式,expression2和expression3分别是当条件为真和假时返回的表达式。如果expression1的值为非零(真),则整个条件表达式的值与expression2的值相同;如果 expression1的值为零(假),则整个条件表达式的值与 expression3的值相同。

典型应用例子:比较两个值的大小,返回最大值或者最小值。

#include <iostream>
using namespace std;
int main() {    int a=55,b=13;int max,min;max=a>b?a:b;min=a>b?b:a;cout << "最大值:"<<max<< endl;cout << "最小值:"<<min<< endl; return 0;
}

运行结果:

最大值:55
最小值:13

(全文结束)

这篇关于捋一捋C++中的逻辑运算(一)——表达式逻辑运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031031

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给