C++ 移位运算符优先级怪异

2023-12-13

考虑以下代码:

typedef vector<int> intVec;

intVec& operator<<(intVec& dst, const int i) {
    dst.push_back(i);
    return dst;
}
int intResult0() {
    return 23;
}
int intResult1() {
    return 42;
}

// main
intVec v;
v << intResult0() << intResult1();

奇怪的是,编译器生成代码,该代码计算intResult1 BEFORE intResult0(使用最新的 VC 和 gcc 进行测试)。 编译器为什么要这样做?通过这样做,各个值的评估和使用之间的时间(不必要地)增加了(?),即首先获取 42,但最后推送到向量。 C++ 标准是否规定了这一点?


两个序列点之间的子表达式的求值顺序未定义。

上面的代码是语法糖:

v.operator<<(intResult0()).operator<<(intResult1());

编译器唯一的限制是它必须在调用方法之前评估所有参数并遵守优先级规则。但只要遵循这些规则,每个实现都可以选择细节,因此这个顺序可能会在编译器之间发生变化。

在这个例子中:

  • 因此,在 intResult2() 之前调用 intResult1() 是完全合法的。
  • 但必须在调用operator
  • 并且必须在调用operator
  • 并且operator

请参阅此处了解更多信息:
C++ 程序员应该了解哪些常见的未定义行为?

and

C++ 程序员应该了解哪些常见的未定义行为?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 移位运算符优先级怪异 的相关文章

随机推荐

  • docker React 无法在本地主机上运行

    我正在尝试使用 docker 运行我的 React 应用程序 当我运行容器时 一切看起来都很好 但我无法在本地主机 或 127 0 0 1 上访问它 这是我的配置 Dockerfile FROM node carbon RUN mkdir
  • Django 中的 AbstractUser 与 AbstractBaseUser?

    指某东西的用途AbstractUser and AbstractBaseUser看起来很相似 from django contrib auth models import AbstractUser AbstractBaseUser 两者有什
  • 如何使ForeignKey('self')禁令的管理员引用其自身?

    我有一个模型 其自身带有外键 例如 class Folder models Model name models CharField parent folder models ForeignKey self null True blank T
  • 运行单个 Maven 插件执行?

    我以为我是一个经验丰富的 Maven 用户 但我对如何做到这一点有一个心理障碍 我已经能够使用 Maven sql 插件通过我定义并绑定到的插件执行在数据库中删除 创建和安装模式pre integration test phase 然而 现
  • 在公式栏中隐藏公式

    当我在 Visual Basic 中使用下面所示的代码时 HYPERLINK公式中出现的部分bar 在工作表中 我只想 TextHere 显示在公式栏中 我可以添加哪些额外代码 我尝试通过在保护选项卡中更改其属性来隐藏它 但它不允许我再编辑
  • 以编程方式 Fling ListView Android

    有没有一种方法可以以编程方式在列表视图上执行 Fling 我知道有猴子可以做所有这些事情 但这需要计算机与 adb 等连接 我想在任何手机上使用我的应用程序来完成此操作 而不需要猴子 谢谢 费萨尔 有两种方法可以 平滑滚动 而不是跳转到某个
  • 多个强制参数集

    我正在开发一个包含多个参数集的函数 其中一些是强制性的 一些是可选的 这只是一个例子 但想象一下以下情况 从 AD 组中添加或删除用户或计算机的功能 由于某种原因 您需要区分用户和计算机 请记住这只是一个例子 在这种情况下 添加 删除单个内
  • 在Java cacerts中导入根证书和中间证书的正确方法

    我公司有自己的ROOT证书 使用他们签署的这个证书intermediate证书 然后我们发布了CSRserver证书并签署intermediate证书 正确的导入方式是什么ROOT证书和intermediate在Java cacerts文件
  • 如何使用 d3.time.scale() 生成均匀间隔的日期数组?

    这看起来应该是微不足道的 我想用d3 time scale 获取涵盖特定时间范围的均匀间隔的日期数组 例如 年 2012 01 01 2013 01 01 2014 01 01 或几个月 2012 01 01 2012 02 01 2012
  • Ruby on Rails:安装捆绑包时验证 SSL 证书的问题

    我是 ruby on Rails 的新手 在使用此命令创建我的第一个项目时rails new n project 我收到这个错误 run bundle install Fetching source index from https rub
  • C 中的隐式函数声明

    术语 函数的隐式声明 是什么意思 在不包含适当头文件的情况下调用标准库函数会产生警告 如下所示 int main printf How is this not an error return 0 难道不应该在没有声明错误的情况下使用函数吗
  • 获得干净的机器友好的 Maven 行/xml/json 输出,可通过 STDOUT 中的脚本进行解析?

    例如 对于 Maven 项目运行以下命令 mvn dependency list 我需要 Maven 提供的是only这两行 从下面的输出中截取 com example code samples maven dependencies dir
  • getPayloadJSON 返回一个空对象

    我正在做一些非常简单的脚本中介作为测试 看看是否可以更改服务器返回的有效负载 我的无中介有效负载如下 origin 202 37 75 130 然后我尝试做一个非常简单的检查 看看 get 和 set 是否适用于有效负载 我的结果是 jso
  • UITextfield 不能作为 iOS 7 中 UISearchBar 的子视图?

    这段代码在 iOS 6 中工作得很好 但在 iOS 7 中 导航栏中的文本字段是灰色的 并且不可点击 看看这张图片的区别 可能出了什么问题 我不知道 iOS 7 中到底发生了什么变化 也不知道从哪里开始寻找解决这个问题的方法 Regards
  • 无法加载资源:net::ERR_FILE_NOT_FOUND 离子错误

    我已经安装了白名单插件并在 config xml 中
  • 静脉中的端到端延迟

    我想计算静脉示例场景中的端到端延迟 我已经阅读了与此主题相关的旧邮件 但它们没有提供问题的真正解决方案 I used getCreationTime and simTime 功能 由此产生的延迟约为1 70 10 4 这种延迟对我来说没有意
  • 从命令行向远程服务器执行 DB2 命令

    我有两台运行 Workgroup 的 DB2 服务器 例如 服务器 1 和服务器 2 在 Server2 的命令提示符处 我想对 Server1 上的已知数据库运行 SQL 命令 有人可以向我准确解释实现此目标所需执行的步骤吗 我是否只需使
  • 使用 python 将字符串拆分为多个空格

    我想将字符串拆分为多个空格 而不是单个空格 我尝试过 string split 但它会在每个空格上分割 这是我的代码 string hi i am kaveer and i am a student string split 我期待结果 h
  • 更改 SaveFileDialog 中“保存”和“取消”按钮的默认排列

    我正在使用 c 进行编码 我想更改 SaveFileDialog 中 保存 和 取消 按钮的默认排列 默认排列是 保存 按钮位于 取消 按钮上方 我想要的是将 取消 按钮放在 保存 按钮的右侧 我在网上搜索 发现这些按钮上的文本可以更改 答
  • C++ 移位运算符优先级怪异

    考虑以下代码 typedef vector