0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++入门之表达式

jf_78858299 来源:QStack 作者:月下西楼 2023-03-17 13:55 次阅读

背景

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<

有四个运算符是保证操作数的远算顺序,&&操作符先运算左边,只有左边为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";
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • Class
    +关注

    关注

    0

    文章

    52

    浏览量

    19525
  • 操作符
    +关注

    关注

    0

    文章

    20

    浏览量

    8999
收藏 人收藏

    评论

    相关推荐

    MATLAB符号表达式

    of the symbolic matrix Mans= a*d-b*c请注意,上面的第一个例子的符号表达式是用单引号以隐含方式定义的。它告诉MATLAB  ' cos(x) ' 是一个字
    发表于 09-22 15:45

    C语言:指针表达式

    字符'b' printf("%c\n",*cp);//还是字符'a' return 0;}*(cp+1)在前面的表达式中增加了一个括号。这个括号使表达式先执行加法运算,就是把1和cp中所
    发表于 01-11 13:41

    C,C++表达式求值顺序超详解

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4,而不是4和5:a = 4;
    发表于 12-08 14:30

    【LabVIEW懒人系列教程-小白入门】1.7LabVIEW数据操作表达式

    ③利用公式节点需要注意的是,公式节点的语法类似c语言,但是有差异,务必参考帮助中的语法使用。验证正确今日总结①如何利用数学函数编写表达式② 如何利用表达式节点编写表达式 ③如何利用公式
    发表于 07-29 00:48

    表达式求值是什么意思

    嵌入式C语言入门——表达式求值
    发表于 12-15 06:24

    防范表达式的失控

    在C 语言中,表达式是最重要的组成部分之一,几乎所有的代码都由表达式构成。表达式的使用如此广泛,读者也许会产生这样的疑问,像+ 、- 、3 、/ 、& & 这样简单的运算也会出现
    发表于 04-22 16:57 13次下载

    快速入门IPv6和正则表达式

    对于日常开发中只接触IPv4,并没有深入研究过正则表达式的开发者,面对IPv6和正则表达式,容易产生畏惧心理,觉得是两座难以翻越的大山。本文通过一些表格整理对IPv6的表示方法,以及正则表达式的特殊符号进行了分类和说明,带领大家
    的头像 发表于 03-30 09:31 8458次阅读
    快速<b class='flag-5'>入门</b>IPv6和正则<b class='flag-5'>表达式</b>

    C++入门教程之数据类型、运算符和表达式的详细资料说明

    本文档的详细介绍的是C++入门教程之数据类型、运算符和表达式的详细资料说明。主要内容包括了: 基本数据类型 常量和变量 输入输出 运算符和表达式 数据类型的转换 构造数据类
    发表于 02-15 11:26 2次下载
    <b class='flag-5'>C++</b><b class='flag-5'>入门</b>教程之数据类型、运算符和<b class='flag-5'>表达式</b>的详细资料说明

    C++程序设计教程之数据类型与表达式的详细资料说明

    本文档的主要内容详细介绍的是C++程序设计教程之数据类型与表达式的详细资料说明包括了:1 . C++的数据类型,2 . 常量,3 . 变量,4 . C++的运算符,5 . 算术运算符与
    发表于 03-14 14:48 0次下载
    <b class='flag-5'>C++</b>程序设计教程之数据类型与<b class='flag-5'>表达式</b>的详细资料说明

    Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则
    发表于 03-26 09:13 10次下载
    Python正则<b class='flag-5'>表达式</b>指南

    Lambda表达式详解

    C++11中的Lambda表达式用于 **定义并创建匿名的函数对象** ,以简化编程工作。下面看一下Lambda表达式的基本构成。
    的头像 发表于 02-09 11:28 849次阅读

    表达式与逻辑门之间的关系

    逻辑表达式是指表示一个表示逻辑运算关系的式子,是一个抽象的类似数学表达式,下面我们重点说明下其表达式与逻辑门之间的关系。
    的头像 发表于 02-15 14:54 1118次阅读
    <b class='flag-5'>表达式</b>与逻辑门之间的关系

    C语言的表达式

    在C语言中,表达式是由操作符和操作数组成。表达式可以由一个或者多个操作数组成,不同的操作符与操作数组成不同的表达式,因此,表达式才是C语言的基本。
    的头像 发表于 02-21 15:09 954次阅读
    C语言的<b class='flag-5'>表达式</b>

    Linux入门之正则表达式

    正则表达式是用来表达字符串匹配模式的方法,利用正则表达式,可以让我们轻易地实现对目标字符串的**查找**、**删除**、**替换**等操作。 正则表达式并不复杂,它并不包含难以理
    的头像 发表于 05-12 15:31 567次阅读
    Linux<b class='flag-5'>入门</b>之正则<b class='flag-5'>表达式</b>

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式  Zabbix是一款开源的监控软件,它能通过监控指标来实时监测服务器和网络的运行状态,同时还能提供警报和报告等功能来帮助管理员
    的头像 发表于 08-24 15:50 1215次阅读