[C++ Primer] 表达式

news/2024/9/30 15:30:57

[C++ Primer] 表达式

  1. 左值和右值

    当一个对象被用作右值时,用的是对象的值(内容);当对象被用作左值时,用的是对象的身份(在内存中的位置)。

    几种熟悉的运算符要用到左值:

    • 赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果也是左值。
    • 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,该指针是右值。
    • 内置解引用运算符*、下标运算符[ ]、迭代器解引用运算符、string和vector的下标运算符[ ]的求值结果都是左值。
    • 内置类型和迭代器的递增递减运算符作用于左值运算对象,所得结果也是左值。
  2. 4种运算符明确规定了运算对象的求值顺序:

    • 逻辑与运算符&&
    • 逻辑或运算符||
    • 条件运算符 ?:
    • 逗号运算符(,)
  3. 赋值运算符的左侧运算对象必须是一个可修改左值

  4. 递增递减运算符

    • 前置版本++i :首先将运算对象加1,然后将改变后的对象作为求值结果。

    • 后置版本i++ :将运算对象加1,求值结果是运算对象改变之前那个值的副本。

    int i = 0, j;
    j = ++i;			// j = 1, i = 1 :前置版本得到递增之后的值
    j = i++;			// j = 1, i = 2 :后置版本得到递增之前的值
    

    这两种运算符必须作用于左值运算对象。前置将对象本身作为左值返回,后置将对象原始值的副本作为右值返回。
    建议:尽量使用前置++i,除非必须,否则不用后置版本

  5. 箭头运算符作用于一个指针类型的运算对象,结果是一个左值。点运算符分两种情况:若成员所属的对象是左值,结果为左值,若成员所属的对象是右值,结果为右值。

  6. sizeof 运算符

    sizeof运算符返回一条表达式或一个类型名字所占的字节数。满足右结合律,所得的值是一个size_t类型的常量表达式。运算符的运算对象有两种形式:

    sizeof (type)
    sizeof expr
    

    第二种形式中,返回的是表达式结果类型的大小,并不计算其运算对象的值

  7. 逗号运算符

    含有两个运算对象,按照从左到右顺序依次求值,首先对左侧表达式求值,然后将求值结果丢弃掉,逗号运算符真正的结果是右侧表达式的值。若右侧运算对象是左值,则最终求值结果也是左值。

  8. 隐式转换

    数组转换为指针:在大多数用到数组的表达式中,数组自动转换成指向数组首元素的指针:

    int ia[10];
    int *ip = ia;			// ia转换成指向数组首元素的指针
    

    不会发生转换的情况:当数组被用作decltype关键字的参数,或者作为取地址符&sizeoftypeid等运算符的运算对象时,用一个引用来初始化数组时。

  9. 命名的强制类型转换

    形式:cast-name<type>(expression);

    type时转换的目标类型,expression是要转换的值。若type是引用类型,则结果是左值。cast-namestatic_castdynamic_castconst_castreinterpret_cast中的一种。

    • static_cast
      任何具有明确定义的类型转换,只要不包含底层const,就可以使用static_cast

    • const_cast
      const_cast只能改变运算对象的底层const。

      const char *pc;
      char *p = const_cast<char*>(pc);		// 正确:但是通过p写值是未定义的行为
      
    • reinterpret_cast
      通常为运算对象的位模式提供较低层次上的重新解释。

    • dynamic_cast
      支持运行时类型识别

  10. 旧式的强制类型转换

    type(expr);		// 函数形式的强制类型转换
    (type)expr;		// C语言风格的强制类型转换
    

    与命名的强制类型转换相比,旧式的从表现形式上来说不那么清晰明了,容易被看漏,一旦转换过程出现问题,追踪起来困难。

  11. C++运算符优先级表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/45176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

在vs code通过git提交文件至远程仓库(github)

1.在远程仓库新建一个repository得到一个.git地址2.在vs code打开文件夹(注意是打开文件夹folder而非文件file),然后添加文件3.点击SOURCE CONTROL,点击Initialized Repository,然后添加远程仓库地址第一次需要Github网页授权你本地vs code的Git提交权限,此后便可直接选择…

解决 git 忽略了不在.gitignore中的文件的问题,不在.gitignore 中的文件被忽略了的问题

解决 git 忽略了不在.gitignore中的文件的问题,就是这个文件或者文件夹不在.gitignore中,但是却被git忽略了,文件夹下新增文件都不会被git add 需要自己去手动 git add -f 命令去添加,造成部分代码没有提交。 1.先查看被忽略了哪些文件和文件夹 git status --ignored 我这…

灵哥讲llama3(上)

llama3简介 llama3 是meta 2024年4月18日发布的开源的大语言模型, 发布当时是state-of-art(最牛逼)的开源LLM,下图是llama3和其他主流模型评测对比:llama3官方发布了两个模型的参数:8B和70B(B代表Billion, 10亿),以及发布了用于推理的源代码,官方github地址:https://g…

12-CSS浮动

css浮动01 介绍02 浮动规则03 案例练习 3.1 缝隙的解决方案 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

Golang性能优化实践

内存警察 警惕一切隐式内存分配 典型case:函数返回了字符串、切片,警惕一切字符串传进去的输入,函数内部重新分配了一个新的内存返回 对象复用 1.sync.pool 保证有一个ch大小的对象可用 假设有cpu核数那么多并发任务,可以保证gc的时候有保底在2.局部cache sync.pool毕竟加锁…

linux+windows跨端md软件选择(未找到)

目的 windows上使用typora当初是通过破解的方式实现的。现在装双系统时想做做笔记,没有一个管理的软件用起来很不方便。 要求正常编辑,没有难以忍受的问题。 目录管理及大纲(基于标题层级) linux+windows双端,且linux端能够读取。 从粘贴图片能够在相应的img目录下创建图片…

Linux Debian安装教程

本教程介绍了如何安装和配置 Linux Debian 操作系统,包括虚拟机创建、开启虚拟化、操作系统安装和SSH远程连接,适用于初学者和有经验的用户。Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建。它采用了自由软件协议,并且由志…