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++ 移位运算符优先级怪异 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • 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