C++教程之表达式

C++实现简单表达式求值 【代码】C++实现简单表达式求值。 阅读详情

背景

背景

C++中提供了很多操作符且定义了什么时候可以用于操作基本类型,其还允许我们定义用于操作class类型的操作符,接下来几篇文章将会介绍C++中用于基本类型的操作符,与此同时也会介绍一些库中操作符。一个表达式是由一个或多个操作符组成的并且返回一个结果。一个最简单的表达式就是一个变量或者字面量,更加复杂的表达式是由一个操作符和一个或多个操作数组成。

基础知识

C++中有一些影响表达式计算的基础概念,所以我们在使用前需要先了解一下这些基本概念。

基本概念

C++中有一元运算符也有二元运算符,一元运算符就像是地址操作符&或者是解引用操作符*,都是作用于一个操作数。类似==就是二元操作符,是作用在两个操作数上的。还有一个三元运算符,其可以操作三个操作数,函数调用则不限制操作数的数量。其中像*即可以是一元运算符(解引用符),也可以是二元运算符(乘法符号),在实际使用中由其所处的上下文环境决定。

理解这么多运算符需要理解运算符的优先级和结合性,这取决于操作数的运算顺序,以下就是一个例子,*操作符的操作数可以是10和20,也可以是是10和20/2,或者是15和20/2,该如何理解这个表达式呢,接下来我们详细说明。

操作数转换

作为计算表达式的一部分,操作数会经常从一个类型转换为另一个类型,例如二元运算符通常希望两个操作数是同一个类型,这些运算符可以用于不同类型的操作数只要两个操作可以转化为同一个类型。例如我们可以将一个整型转化成一个浮点型,但是我们无法将一个指针类型转化为一个浮点型。

运算符重载

C++定义了应用于基本类型和复合类型的操作符含义,我们自己可以定义操作符作用于class类型时操作符的含义,这种定义给了已有操作符的其他含义,这种我们称之为运算符重载。IO库中的<<和>>操作符就是重载远算符。

当我们使用重载运算符时,运算符的含义。操作数和最后的结果都取决于运算符是如何定义的,但是操作数的数量和优先级和结合性是不会改变的。

左值和右值

C++中的表达式不是左值(rvalue)就是右值(rvalue),这个名称是从C中继承过来的,其是为了好记忆,左值可以在赋值的左边,右值则不可以。在C++中左值和右值更好区分,一个左值表达式代表一个对象或者一个函数,然而需要注意的是一些左值表达式如const对象不能作为赋值操作符的左操作数。而且一些表达式产生对象但是是返回右值而不是返回左值。总的来说,当我将一个对象当作右值使用时返回的他的值,当作左值使用时返回的是其地址。

操作符在需要左值或者右值以及返回左值或者右值时是不同的,我们可以将一个左值当作右值使用,但是却不能将右值当作左值使用。

当使用decltype时左值和右值也不同,当我对一个表达式使用decltype,如果表达式返回的是左值,函数返回则是引用,例如如果p 是int*类型,decltype(p)返回的时int&,如果运算表达式是右值如地址操作符如decltype(&p)返回int*, 这是一个指针,指向一个指向int类型的指针。

优先级和结合性

一个表达式包含两或两个个以上的操作符的表达式是复合表达式,计算一个复合表达式需要将利用操作符将操作数分组,优先级和结合性决定如何分组,开发者也可以通过括号来强制分组。

通常表达式的值依赖于子表达式如何分组,操作数将会和优先级高的操作符结合在一起,例如乘和除的优先级相同,但是他们的优先级比加高,所以要先算乘除,后算加减。在优先级的相同的情况下由结合性决定如何分组,算术操作符是向左结合,这意味着在优先级相同的情况下从左向右分组:

  • 因为优先级所以3 + 4 * 5结果是23而不是35
  • 因为结合性所以20 - 15 - 3是2而不是8
运算顺序

优先级决定了操作数如何被分组,但是其并未确定哪一个操作数先被运算,在绝大多数情况下这个顺序是不固定的,例如在下面的例子中,我们知道f1和f2必须要在乘法执行前调用,然后将他们的结果相乘,但是我们并不知道f1和f2哪个先调用:

int i = f1() * f2();

对于没有指定运算顺序的操作符而言,一个表达式指向并改变同一个对象会发生错误,这么做的表达式会引发未定义的错误。一个简单的例子,<< 操作符并不指定操作数的运算顺序,其结果就是输出表达式未知。

int i = 0;
std::cout<<i<<" "<<i++<<std::endl;

有四个运算符是保证操作数的远算顺序,&&操作符先运算左边,只有左边为true才会运算右边,|| , ?:和,也会确定操作顺序。

成员获取操作符

点操作符.和箭头操作符->都能获取到成员,点操作符可以获取到class类型的成员,而箭头操作符可以获取到指针的成员:

string s1 = "a string", *p = &s1;
auto n = s1.size();
n = (*p).size();
n = p->size(); //等价于(*p).size()

由于解引用符有优先级低于点操作符,所以我们需要使用括号改变远算顺序

条件操作符

条件操作符能够简化if-else的逻辑结构,通常的使用形式如下

cond?expr1 : expr2;

其中cond是一个条件,如果cond为true,运算expr1,反之则运算expr2,例子如下

string finalgrade = (grade < 60)? "failed" : "pass";

条件操作符也可以嵌套:

finalgrade = (grade > 90) ? "high pass": (grade < 60) ? "fail" : "pass";

最后

这篇文章主要介绍了表达式,更多文章可以关注公众号QStack。

复现YOLOv8语义分割和目标检测训练自己的数据集 训练过程首先会显示你所使用的训练的硬件设备信息,然后下一段话则是你的参数配置,紧接着是backbone信息,最后是加载信息,并告知你训练的结果会保存在runs\segment\trainxx。(1)修改数据加载配置文件,在E:\project\MODEL\YOLO\yolov8-8.2.76\ultralytics-8.2.76\ultralytics\cfg\datasets。三、训练自己的数据集,segment数据集是json格式的。如果想使用多卡训练,device='\0,1,2,xxx\' 阅读详情

相关推荐

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5512

C++系列七:表达式

表达式是计算机编程语言中的基本构造块之一,它由运算符和操作数组成,用于执行各种算术和逻辑运算以及计算变量的值。本文章深入探讨了C++中的表达式,并介绍其不同类型、优先级和计算顺序等方面的知识。

聚集机器学习、信息安全 4247

PCB布局布线要求及多层电路板叠加原则

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。

Ka_wyb的博客 2933

C++ 表达式

C++ 表达式

SpriCoder的博客 2874

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

c++表达式详细介绍

C++ 表达式涵盖了从简单的算术运算到复杂的逻辑决策的多种方面。初学者需要首先了解表达式的基础概念,例如操作符、操作数、以及它们如何组合来形成有意义的指令。接下来,掌握不同类型的操作符(如算术、关系、逻辑操作符)和它们的优先级与结合性,对于编写正确无误的代码至关重要。此外,高级主题如赋值表达式、条件表达式和类型转换,提供了更多的灵活性和表达能力。理解这些概念对于高效利用 C++ 的强大功能来说是必不可少的。

shopeeai的博客 2684

Open3D点云数据处理(六):点云、mesh可视化(Visualizer类)

本文介绍了Open3D中Visualizer类可视化几何对象的方法,给出了常用参数解释和代码示例。

孙悟空 3024

C++//表达式

1. 表达式基本概念 运算对象类型转换过程中,小整数类型(bool,char,short)通常被提升(promoted)为较大的整数类型(int)。 C++语言定义了运算符作用于内置类型和复合类型的运算对象时所执行的操作。当运算符作用于类类型的运算对象时,用户可以自定义其含义,这个过程称为重载运算符。 IO库的>>和<<以及string对象,vector对象和迭代器使用的都是重载的运算符。 重载某个运算符时运算对象的类型和返回值的类型都是可以自定义的,但是运算对象的个数、运算

weixin_43918519的博客 2219

人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理

C++、Python、ONNX、人工智能、异常检测、Anomalib 2.1.0

FriendshipTang的博客 170

Cadence 开发合集【总目录】

专栏主要介绍Cadence原理图和PCB信号完整性电源完整性仿真相关的内容,更加注重实操,以帮助大家轻松上手并不断提高;在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。 ............

fydar的博客 1万+

C++教程|表达式

表达式是运算符与数据连接起来的表达运算的式子,表达式也称运算式。 C++语言中的所有操作都是用表达式表示的。

皖山文武 526

从 QQ 聊天到 AI Agent:AstrBot + NapCat 接入 DeepSeek

<think>我们根据要求,根据提供的内容生成≤150字的文章摘要。内容是关于在Windows上使用Docker部署AstrBot+NaPCat,配置DeepSeek,实现QQ AI机器人。摘要需简洁概括主要步骤和结论。注意字数。</think>在Windows 11上通过Docker一键部署AstrBot与NapCat,实现QQ机器人。NapCat扫码登录QQ,AstrBot接入并配置DeepSeek API,完成AI对话。后续可扩展人格、插件及MCP工具,并通过cpolar提供公网管理入口,打造可扩展的

天道酬勤 1万+

C++ 正则表达式教程:C++ 中的正则表达式与示例

C++ 正则表达式教程解释了 C++ 中正则表达式的工作,包括正则表达式匹配、搜索、替换、输入验证和标记化的功能。 几乎所有的编程语言都支持正则表达式。 C++ 从 C++11 开始直接支持正则表达式。除了编程语言之外,大多数文本处理程序(如词法分析器、高级文本编辑器等)都使用正则表达式。 在本教程中,我们将探讨正则表达式的一般细节以及 C++ 编程方面的细节。 正则匹配中的基础符号 ^开头 ()组 []或, {}几次 $结尾 1. C++ 中的正则表达式 (Regex) 正则表达式是包含一系列字符的表达

weixin_43229348的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++教程之lambda表达式一

什么是Lambda? C++ 11加入了一个非常重要的特性——Lambda表达式。营里(戴维营)的兄弟都对Objective-C很熟悉,许多人多block情有独钟,将各种回调函数、代理通通都用它来实现。甚至有人选择用FBKVOController、BlocksKit等开源框架将KVO、控件事件处理都改为通过block解决。原因就是简单、方便、直观,函数的定义和使用出现在同一个地方。这里的La

戴维营教育 1183

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c++ 应输入表达式_入门AE:时间表达式的应用方法,附带教程

效果图今天继续基础教大家基础的时间表达式,是应用表达式的time这个英文单词来做出动画,简单,方便(每天5分钟,充实一整天)教程1、首先打开我们的AE2、新建一个合成,1080*660px,持续时间5秒,黑色画布3、点击椭圆工具,我们按住shift绘制一个正圆用向后平移(锚点)工具,将正圆的中心点移到到正圆中心点开椭圆图层,我们添加一个修剪路径,内容-修剪路径-开始和结束、偏移,开始值为30,结束...

weixin_31785421的博客 900

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ Lambda 表达式教程

C++ Lambda 函数或表达式类似于无需重用的内联函数,一般以简单的代码片段形式存在。典型Lambda应用场景为把封装的几行代码传给algorithm 或 asynchronou方法。本文通过示例展示它的几个应用场景。 C++ Lambda 表达式 自C++ 11引入Lambda 表达式,它可以方便地定义匿名函数对象(闭包),可以直接执行或作为参数传递给函数。 基本语法如下: [capture clause] (parameters) -> return-type { /.

neweastsun的专栏 1866

C++教程之lambda表达式

什么是Lambda? C++ 11加入了一个非常重要的特性——Lambda表达式。营里(戴维营)的兄弟都对Objective-C很熟悉,许多人多block情有独钟,将各种回调函数、代理通通都用它来实现。甚至有人选择用FBKVOController、BlocksKit等开源框架将KVO、控件事件处理都改为通过block解决。原因就是简单、方便、直观,函数的定义和使用出现在同一个地方。这里的La

起个名字好难啊 3526

Google's CEL-CPP项目快速入门教程

Google's CEL-CPP项目快速入门教程 项目简介 Google的CEL(Common Expression Language)C++实现,是一个快速、便携式的非图灵完备表达式评估库,适用于C++环境。它遵循Apache 2.0许可证,并且值得注意的是,这并非谷歌的官方产品。本教程旨在指导您了解此开源项目的结构、主要组件以及基本使用方法。 1. 目录结构及介绍 Google的cel-cpp...

gitblog_00317的博客 1051

C++青少年简明教程:C++中的标识符、常量、变量、表达式和语句

C++青少年简明教程:C++中的标识符、常量、变量、表达式和语句

cnds123的专栏 1286

C++的使用小教程3——Lambda函数与表达式

C++的使用小教程3——Lambda 函数与表达式1、什么是Lambda函数2、简单Lambda函数使用示例3、捕捉列表 lambda表达式可以用于简洁的表达一个函数,虽然不太会用,但是之后看代码的时候可能会遇见,还是学习一下为妙。 1、什么是Lambda函数 C++11提供了对匿名函数的支持,匿名函数被称为 Lambda 函数,也可以被称作Lambda表达式。 具体的形式如下: [captur...

Bubbliiiing的学习小课堂 1584

【c++教程】4.1-表达式语句

语句(statement) 语句,也就是statement,是程序的一个基本的组成部分。相当于平常说的一句话,就是一个语句。在c++中,一般语句会以;作为结束。 其中,最简单的一个语句,就是空语句,它的特点是没有表达式。也就是说,一个简单的分号就是一个空语句。空语句有的时候可以用来配合循环来使用。 // 比如说,我们创建一个简单的无限循环 while (true) // 这当然可以,但是,通常也会这样做 for (;;) 如果多用了一些空语句会怎么样呢?以我们最熟悉的第一个程序为例。 #in

程程之光 567

Modern C++ 教程:深入理解正则表达式

Modern C++ 教程:深入理解正则表达式 【免费下载链接】modern-cpp-tutorial ???? Modern C++ Tutorial: C++11/14/17/20 On the Fly | https://changkun.de/modern-cpp/ ...

gitblog_00698的博客 302
上一篇: Aptos DAPP之智能合约编写
下一篇: C++教程之位运算
QStack
博客等级 码龄6年 30粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值