当前位置: 首页 > news >正文

理解Go中的布尔逻辑

布尔数据类型(bool)可以是两个值之一,truefalse。布尔值在编程中用于比较和控制程序流程。

布尔值表示与数学逻辑分支相关的真值,它指示计算机科学中的算法。布尔(Boolean)一词以数学家乔治·布尔(George Boole)命名,总是以大写字母B开头。

Go中表示布尔值的数据类型是bool,全部小写。值truefalse将始终分别是小写的tf,因为它们在Go中是特殊值。

本教程将涵盖你需要了解bool数据类型如何工作的基础知识,包括布尔比较、逻辑运算符和真值表。

比较运算符

在编程中,比较运算符用于比较值,并求值为单个布尔值true或false。

下表展示了布尔比较操作符。

操作符含义
==等于
!=不等于
<小于
>大于
<=小于等于
>=大于等于

为了理解这些操作符是如何工作的,让我们在Go程序中将两个整数赋值给两个变量:

x := 5
y := 8

在这个例子中,因为x的值是5,所以它小于y的值是8

使用这两个变量及其关联的值,我们来遍历前一个表中的操作符。在这个程序中,你要让Go打印出每个比较运算符的计算结果是true还是false。为了更好地理解这个输出,你还需要Go打印一个字符串,显示它正在求值:

package mainimport "fmt"func main() {x := 5y := 8fmt.Println("x == y:", x == y)fmt.Println("x != y:", x != y)fmt.Println("x < y:", x < y)fmt.Println("x > y:", x > y)fmt.Println("x <= y:", x <= y)fmt.Println("x >= y:", x >= y)
}
Outputx == y: false
x != y: true
x < y: true
x > y: false
x <= y: true
x >= y: false

按照数学逻辑,Go从表达式中计算了以下内容:

  • 5 (x)等于8 (y)吗?false
  • 5不等于8吗?true
  • 5小于8吗?true
  • 5大于8吗?false
  • 5小于或等于8吗?true
  • 5不小于等于8吗?false

虽然这里使用整数,但也可以用浮点值替换。

字符串也可以与布尔操作符一起使用。除非使用额外的字符串方法,否则它们是区分大小写的。

你可以看看如何在实践中比较字符串:

sammy := "Sammy"
sammy := "sammy"fmt.Println("Sammy == sammy: ", Sammy == sammy)
OutputSammy == sammy:  false

字符串Sammy不等于字符串Sammy,因为它们并不完全相同;一个以大写字母S开头,另一个以小写字母S开头。但是,如果你添加另一个变量,并将其赋值给Sammy,那么它们将计算为相等:

sammy := "Sammy"
sammy := "sammy"
alsoSammy := "Sammy"fmt.Println("Sammy == sammy: ", Sammy == sammy)
fmt.Println("Sammy == alsoSammy", Sammy == alsoSammy)
OutputSammy == sammy:  false
Sammy == alsoSammy true

你也可以使用其他比较操作符,包括><来比较两个字符串。Go将使用字符的ASCII值按字典顺序比较这些字符串。

你也可以使用比较操作符计算布尔值:

t := true
f := falsefmt.Println("t != f: ", t != f)
Outputt != f:  true

上述代码块计算出true不等于false

注意===这两个操作符之间的区别。

x = y   //设x = y
x == y  // 计算x是否等于y

第一个=是赋值操作符,它将一个值设置为另一个值。第二个是比较运算符==,用于判断两个值是否相等。

逻辑运算符

有两个用于比较值的逻辑运算符。它们将表达式求值为布尔值,返回truefalse。这些运算符是&&||!,定义如下:

  • && (x && y)是and操作符。如果两个陈述都为真,它为真。
  • || (x || y)是or运算符。如果至少有一个陈述为真,则为真。
  • ! (!x)是not操作符。只有当命题为假时,它才为真。

逻辑运算符通常用于判断两个或多个表达式是否为真。例如,它们可以用来确定成绩是否通过,以及学生是否注册了这门课,如果两种情况都为真,那么该学生将在系统中被分配一个分数。另一个例子是,根据用户是否有商店积分或在过去6个月内是否进行过购买,来确定用户是否为在线商店的有效活跃客户。

为了理解逻辑运算符的工作原理,让我们计算三个表达式:

fmt.Println((9 > 7) && (2 < 4))   // Both original expressions are true
fmt.Println((8 == 8) || (6 != 6)) // One original expression is true
fmt.Println(!(3 <= 1))            // The original expression is false
Outputtrue
true
true

在第一种情况下,fmt.Println((9 > 7) && (2 < 4))9 > 72 < 4都需要求值为true,因为使用了and操作符。

在第二个例子中,fmt.Println((8 == 8) ||(6 != 6)),由于8 == 8被求值为true,因此6 != 6被求值为false没有任何区别,因为使用了or操作符。如果你使用and操作符,结果将为false。

在第三种情况下,fmt.Println(!(3 <=1))not运算符会否定3 <=1返回的false值。

让我们用浮点数代替整数,并针对错误求值:

fmt.Println((-0.2 > 1.4) && (0.8 < 3.1))  // One original expression is false
fmt.Println((7.5 == 8.9) || (9.2 != 9.2)) // Both original expressions are false
fmt.Println(!(-5.7 <= 0.3))               // The original expression is true

在这个例子中:

  • and必须至少有一个false表达式的结果为false。
  • or的两个表达式都必须为false。
  • !必须使其内部表达式为true,才能使新表达式的计算结果为false。

如果这些结果对你来说不清楚,请浏览一些[真值表]以进一步澄清。

你也可以使用&&||!:

!((-0.2 > 1.4) && ((0.8 < 3.1) || (0.1 == 0.1)))

先看一下最里面的表情:(0.8 < 3.1) || (0.1 == 0.1)。这个表达式求值为true,因为两个数学表达式都是true

接下来,Go将返回值true与下一个内部表达式相结合:(-0.2 > 1.4) && (true)。这个例子返回false,因为数学语句-0.2 > 1.4为false,并且(false)和(true)返回false

最后,我们有一个外部表达式:!(false),它的计算结果为true,所以如果我们打印这条语句,最终的返回值是:

Outputtrue

逻辑运算符&&||!计算表达式并返回布尔值。

真值表

数学的逻辑分支有很多东西需要学习,但你可以有选择地学习其中的一些,以提高编程时的算法思维。

下面是比较运算符==以及每个逻辑运算符&&||!的真值表。虽然你可能能够推理出它们,但记住它们也是有帮助的,因为这可以使你的编程决策过程更快。

== (equal) 真值表

x==y返回
true==truetrue
true==falsefalse
false==truefalse
false==falsetrue

&& (and) 真值表

xandy返回
trueandtruetrue
trueandfalsefalse
falseandtruefalse
falseandfalsefalse

|| (or) 真值表

xory返回
trueortruetrue
trueorfalsetrue
falseortruetrue
falseorfalsefalse

! (not) 真值表

| not | x | 返回 |
| — | — | — | — |
| not | true | false |
| not | false | true |

真值表是逻辑中常见的数学表,在计算机编程中构造算法(指令)时要记住真值表。

使用布尔操作符控制流量

要以流控制语句的形式控制程序的流和结果,你可以使用条件后跟子句

一个条件求值为布尔值true或false,表示程序中做出决定的一个点。也就是说,条件会告诉你某项计算结果是true还是false。

子句是跟在条件之后的代码块,它规定了程序的结果。也就是说,它是“如果xtrue,那么做这个”结构的“做这个”部分。

下面的代码块展示了一个比较运算符和条件语句协同工作来控制Go程序流程的例子:

if grade >= 65 {                 // Conditionfmt.Println("Passing grade") // Clause
} else {fmt.Println("Failing grade")
}

这个程序将评估每个学生的成绩是及格还是不及格。以成绩为83的学生为例,第一个语句将被求值为true,并触发打印语句Passing grade。如果一个学生的成绩是59,第一个语句将被求值为false,因此程序将继续执行与else表达式绑定的print语句: Failing grade

布尔运算符提供了一些条件,可以通过流控制语句来决定程序的最终结果。

总结

本教程介绍了布尔类型的比较和逻辑操作符,以及真值表和使用布尔进行程序流控制。

相关文章:

理解Go中的布尔逻辑

布尔数据类型(bool)可以是两个值之一&#xff0c;true或false。布尔值在编程中用于比较和控制程序流程。 布尔值表示与数学逻辑分支相关的真值&#xff0c;它指示计算机科学中的算法。布尔(Boolean)一词以数学家乔治布尔(George Boole)命名&#xff0c;总是以大写字母B开头。 …...

rv1126-rknpu-v1.7.3添加opencv库

rv1126所使用的rknn sdk里默认是不带opencv库的&#xff0c;官方所用的例程里也没有使用opencv&#xff0c;但是这样在进行图像处理的时候有点麻烦了&#xff0c;这里有两种办法: 一是先用python将所需要的图片处理好后在转化为bin格式文件&#xff0c;在使用c或c进行读取&…...

【Redis】Redis持久化深度解析

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 Redis持久化介绍RDB原理Fork函数与写时复制关于写时复制的思考 RDB相关配置 AOF原理AOF持久化配置AOF文件解读AOF文件修复AOF重写AOF缓冲区与AOF重写缓存区AOF缓冲区可以替代AOF重写缓冲区吗AOF相关配置写后…...

c/c++--字节对齐(byte alignment)

1. 默认字节对齐 在所有结构体成员的字节长度都没有超出操作系统基本字节单位(32位操作系统是4,64位操作系统是8)的情况下 按照结构体中字节最大的变量长度来对齐&#xff1b;若结构体中某个变量字节超出操作系统基本字节单位 那么就按照系统字节单位来对齐。 注意&#xff1…...

算法进阶——字符串的排列

题目 输入一个长度为 n 字符串&#xff0c;打印出该字符串中字符的所有排列&#xff0c;你可以以任意顺序返回这个字符串数组。 例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。 数据范围&#xff1a;n<10 要求&#xff1a;空间复…...

js中 slice 用法用法全解析

slice 工作原理 在深入研究一些更高级的用法之前&#xff0c;让我们看一下 slice 方法的基础知识。如MDN文档&#xff0c; slice 是数组上的一个方法&#xff0c;它最多有两个参数: arr.slice([begin[, end]]) begin 从该索引处开始提取原数组中的元素,如果该参数为负数&am…...

Typora安装教程

Typora 安装教程 安装 官网最新版 自行官网下载 社区版&#xff08;老版本&#xff0c;附带激活码&#xff09; 链接: https://pan.baidu.com/s/1t_3o3Xi7x09_8G1jpQYIvg?pwdmeyf 提取码: meyf 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 将百度云盘下…...

Pytorch中张量的维度扩张与广播操作示例

广播操作允许你对不同形状的张量执行逐元素操作&#xff0c;而无需显式循环。 一个关于分子坐标离散格点化的实战例子&#xff1a; def cdists(mols, grid):Calculates the pairwise Euclidean distances between a set of molecules and a listof positions on a grid (uses…...

身份证号码,格式校验:@IdCard(自定义注解)

目标 自定义一个用于校验 身份证号码 格式的注解IdCard&#xff0c;能够和现有的 Validation 兼容&#xff0c;使用方式和其他校验注解保持一致&#xff08;使用 Valid 注解接口参数&#xff09;。 校验逻辑 有效格式 符合国家标准。 公民身份号码按照GB11643&#xff0d;…...

【Java】instanceof 关键字

instanceof 通过返回一个布尔值来指出&#xff0c;某个对象是否是某个特定类或者是该特定类的子类的一个实例。 如果 object 是class 的一个实例&#xff0c;则 instanceof 运算符返回 true&#xff0c;如果 object 不是指定类的一个实例&#xff0c;或者object 是null, 则返回…...

Android 13.0 recovery出厂时正在清理字体大小的修改

1.前言 在13.0的系统rom定制化开发中,在系统中recovery模块也是系统中比较重要的模块,比如恢复出厂设置,recovery ota升级,清理缓存等等, 在一些1080p的设备,但是density只是240这样的设备,会在恢复出厂设置的时候,显示的字体有点小,产品要求需要将正在清理的字体调大…...

京东商品数据:8月京东环境电器行业数据分析

8月份&#xff0c;环境电器大盘市场整体下滑。鲸参谋数据显示&#xff0c;8月京东平台环境电器的大盘将近570万&#xff0c;环比下滑约29%&#xff0c;同比下滑约10%&#xff1b;销售额为25亿&#xff0c;环比下滑约23%&#xff0c;同比下滑约8%。 *数据源于鲸参谋-行业趋势分析…...

elasticsearch(ES)分布式搜索引擎04——(数据聚合,自动补全,数据同步,ES集群)

目录 1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结 1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现…...

webdriver.Chrome()没反应

今天学习爬虫安装selenium之后刚开始webdriver.Chrome()正常 后面运行突然卡在这一步了 百度发现是版本不匹配 我们下载旧版本的chrome Download Google Chrome 95.0.4638.69 for Windows - Filehippo.com 禁用chrome的自动更新 打开文件所在位置 点击Google文件夹 右键up…...

java html转word、pdf(包含图片)

html转word maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version> </dependency> <dependency><groupId>org.jsoup</groupId><artifactId>…...

不容易解的题10.10

5.最长回文子串 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/longest-palindromic-substring/?envTypelist&envIdZCa7r67M给一个字符串&#xff0c;让我们找最长回文子串 这题不用说&#xff0c;回文子串那一定是连续的&#…...

淘宝天猫店铺所有商品数据接口,淘宝API接口

获取淘宝店铺所有商品数据接口的步骤如下&#xff1a; 获取授权&#xff1a;使用 OAuth 2.0 协议对应用进行授权&#xff0c;以便能够访问店铺的商品信息。获取店铺信息&#xff1a;使用淘宝 API 的 taobao.shop.get 接口&#xff0c;传入店铺的 user_id 参数&#xff0c;获取…...

Prometheus和grafana安装配置手册

1.简介 本文档为prometheus和grafana安装配置手册&#xff0c;prometheus和grafana的内容、和操作过程&#xff0c;详细介绍了服务监控配置、dashboard配置、告警配置等操作。 2.部署说明 Prometheus基于Golang编写&#xff08;需要安装&#xff09;&#xff0c;编译后的软件…...

从零开始探索C语言(十一)----共用体和位域

文章目录 1. 共用体1.1 定义共用体1.2 访问共用体成员 2. 位域2.1 位域声明2.2 位域的定义和位域变量的说明2.3 位域的使用2.4 位域小结 1. 共用体 共用体是一种特殊的数据类型&#xff0c;允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体&#…...

【数据结构】算法的时间复杂度

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.算法时间复杂度定义 二.大O阶渐近表示法 &#x1f38f;大O阶渐近表示法的定义 &#x1f38f;推导大O阶方法 三.常见的时间复杂度 &#x1f4cc;常数阶 &#x…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...