[C++ Primer] 表达式

news/2024/10/23 13:36:58/文章来源:https://www.cnblogs.com/Invinc-Z/p/18247066

[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.hqwc.cn/news/724587.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在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…

Golang性能优化实践

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

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

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

c# 获取年,月,日,时,分,秒,星期几

this.nian.Text = DateTime.Now.Year.ToString(); //获取年 this.yue.Text = DateTime.Now.Month.ToString(); //获取月 this.ri.Text = DateTime.Now.Day.ToString(); //获取日 this.xingqi.Text = DateTime.Now.ToString("dddd"); //获取周几 this.shijian.Text = …

2024-06-13 闲话

2024-06-13 闲话今日最乐

多系统修改默认启动系统,grub

问题 我的电脑装了Windows 和 kUbuntu双系统,但是默认是启动kUbuntu的,作为一个使用了多年windows的普通用户,我更希望默认启动是Windows而不是Linux。因此需要修改顺序。 解决 使用root权限修改/boot/grub/grub.cfg文件。 很多文章里都说windows是4,但是我设置了并没有反应…

php基础语法_面向对象

PHP php代码标记 多种标记来区分php脚本 ASP标记:<% php代码 %> 短标记: 脚本标记: 标准标记(常用): 简写风格: ASP风格:<% php代码 %>注意:简写风格和ASP风格需要在php.ini配置文件中修改以下配置为on,移植性差 short_open_tag = on asp_tags = on<ht…

Linux脚本语言入门.md

0、shell介绍 1)Shell是什么? Shell是一个命令行解释器,它为用户提供一个详Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的…

排查Java进程CPU占用高之三板斧

写在前面 线上环境突然出现Java进程CPU占用率持续超过100%的问题,该如何排查并定位呢? 问题一:我们如何知道线上环境的那个服务器(或者哪个Docker容器)出现了CPU持续高的故障了呢? 如果是有比较完善的监控设施,当出现CPU持续高时可以通过发送报警通知的方式告知开发人员…