编译器是否允许交错计算不同函数参数中的子表达式? [复制]

2023-12-19

我想知道以下情况:

void f(int a, int b) { }

int a(int x) { std::cout << "func a" << std::endl; return 1; }
int b(int x) { std::cout << "func b" << std::endl; return 2; }

int x() { std::cout << "func x" << std::endl; return 3; }
int y() { std::cout << "func y" << std::endl; return 4; }

f(a(x()), b(y()));

看完之后http://en.cppreference.com/w/cpp/language/eval_order http://en.cppreference.com/w/cpp/language/eval_order我仍然很难理解以下评估顺序是否可能:

x() -> y() -> a() -> b()

或者该标准保证a(x()) and b(y())可以这么说,将被评估为单位。

换句话说,这是否有可能打印

func x
func y
func a
func b

在 GCC 5.4.0 上运行这个测试让我觉得更符合逻辑

func y
func b
func x
func a

但这当然并没有告诉我任何有关标准要求的信息。最好能获得该标准的参考。


在 C++14 及更早版本中,x -> y -> a -> b是可能的。这里的先后顺序关系是:

  • Call to x在调用之前排序a.
  • Call to y在调用之前排序b.
  • Call to a在调用之前排序f.
  • Call to b在调用之前排序f.

订单没有其他限制。如果您想强制执行某些特定的顺序,那么您必须将此调用分解为多个完整表达式。

在 C++14 标准中,注释 [expr.call]/8 阐明了这一意图:

[Note:后缀表达式和参数的计算相对于彼此都是无序的。在输入函数之前,参数计算的所有副作用都会被排序。 —end note ]

正如评论中指出的,cpp参考页 http://en.cppreference.com/w/cpp/language/eval_order列出了更多标记为“Since C++17”的排序规则。这是基于n4606 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf,最新发布的 C++17 草案。所以对于C++17来说,这个顺序可能不再被允许。

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

编译器是否允许交错计算不同函数参数中的子表达式? [复制] 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何默认显示连接线?

    你好 我刚刚开始使用这个 jquery 树 并想知道是否有任何属性可以设置以使连接线始终可见 选项中没有可用的属性将连接线设置为始终可见 但您可以使用以下命令向对象添加一个类fancytree container打开连接器的类 如果您希望连
  • 在 jQuery 中一起使用 :visible 和 :first-child

    我试图在 jQuery 中同时使用 visible 和 first child 伪选择器 但似乎没有成功 我有以下 HTML div a class action style display none Item One a a class
  • 如何在 Hadoop 中访问和操作 pdf 文件的数据?

    我想使用hadoop读取PDF文件 这怎么可能 我只知道hadoop只能处理txt文件 那么有没有办法将PDF文件解析为txt 给我一些建议 一个简单的方法是创建一个序列文件 http hadoop apache org common do
  • Android 媒体播放器停止后无法播放

    我有 5 首歌曲的音乐播放列表 我只希望只要我在应用程序中 播放和停止按钮就可以工作 当我想要的时候我可以停止音乐并开始另一个 现在这是如何工作的 音乐在 播放 按钮上播放 当我单击 停止 按钮时 它停止 但后来我想播放其他歌曲 或再次播放
  • 由于构建后步骤,未加载本机 dll 的符号 (pdb)

    我有一个用符号构建的本机发行版 dll 有一个构建后步骤会修改 dll 构建后步骤会进行一些压缩 并可能附加一些数据 pdb 文件仍然有效 但是 WinDbg 和 Visual Studio 2008 在构建后步骤之后都不会加载 dll 的
  • PHP 中的类发生了什么?

    如果我有这段代码 则会回显字符串 test 这是 PHP 5 3 中的内容 这是一些不应该依赖的疏忽 还是在 PHP 中实现多重继承的某种方式 class Test1 function getName return this gt name
  • 反应改变点击时列表项的类别

    我有一个像这样的反应元素 import React PropTypes Component from react class AlbumList extends Component constructor props super props
  • 为什么delete可以对const指针执行,而free却不能?

    我刚刚注意到指针传递给delete can be const合格而通过的人free不能 这对我来说确实是一个惊喜 在 C 中重载为operator delete应该有一个像这样的签名 void operator delete void p
  • 联合类型和额外属性

    当使用可以同时是联合类型情况的参数调用函数时 有没有办法让 TypeScript 编译器产生错误 例子 interface Name name string interface Email email string type NameOrE
  • Sails.js:如何使用水线连接多个模型?

    我有 3 个模型 大陆 国家和城市 我想加入这些模型以获得结果 大陆 js attributes continent Id type string primaryKey true continent Name type string des
  • 对象 Switch 语句的高性能 Objective C 替代方案

    我有一个函数 我想接受一个 NSString 和一个 int 参数 然后使用 switch 语句返回一个计算值 就像将 int 乘以某个常量一样 具体取决于提供的 NSString 内容 显然 switch 语句不适用于 Objective
  • 使用自定义视频编写器库编写音频的错误

    我正在尝试包装一小段方便的 C 代码 旨在使用 VFW 在 Windows 上生成视频 音频 C 库存在here http www farbrausch de 7Efg code aviwriter 描述说 使用 Windows 视频 因此
  • maven命令行如何为单个命令指向特定的settings.xml?

    是否可以指向特定的设置文件以覆盖 maven 用于单个命令的默认 settings xml 例子 mvn clean install Dparam gt pass specific settings file path as param t
  • Isabelle:向量中的最大值

    我想找到自然数向量中的最大值 然而 向量 即 vec 是与集合或列表不同的类型 我考虑了几个行不通的想法 比如调平或提升 vec 的类型或递归函数的定义 您建议采用什么解决方案来获得向量中的最大值 IMPORTS src HOL Algeb
  • 防止背景图像在更改时闪烁

    我正在使用按钮的背景图像并切换到不同的按钮 hover 当第一次鼠标悬停时发生切换时 背景颜色会短暂闪烁 我在这里将其设置为橙色 以便更明显 它与白色背景相同 或者如果我未设置背景颜色 但是 后续鼠标悬停时它不会闪烁 如何防止页面加载和第一
  • NSComparisonResult 和 NSComparator - 它们是什么?

    What is NSComparisonResult and NSComparator 我见过一种类型定义 类似这样 typedef NSComparisonResult NSComparator id obj1 id obj2 它和函数指
  • 如何在 Bootstrap 4 中的插入符下添加下拉箭头?

    我正在使用 Bootstrap 4 下拉选项 我想为左上角的下拉菜单添加一个向上箭头 在 Bootstrap 3 中 我们在按钮上有一个插入标记 因此我们可以将箭头添加到下拉菜单中 但在 Bootstrap 4 中 我们没有插入符号标记 使
  • Rails ORM 是否限制执行聚合的能力?

    我担心 Rails 是否可以处理金融应用程序所需的复杂聚合类型 特别是 ORM 是否可以有效地处理这些类型 在我正在考虑使用它的财务应用程序中 需要对以各种方式汇总的详细财务数据进行大量报告 如果没有 Rails ORM 的支持 我需要直接
  • 使 CSS 网格中的单行跨越所有列

    我怎样才能使 legend 跨越所有行 所以它会弄乱 fieldset 其样式为 3 列 CSS 网格 fieldset legend Personal Details legend fieldset fieldset legend
  • 编译器是否允许交错计算不同函数参数中的子表达式? [复制]

    这个问题在这里已经有答案了 我想知道以下情况 void f int a int b int a int x std cout lt lt func a lt lt std endl return 1 int b int x std cout