GCC中函数调用的参数求值顺序

2024-03-22

当我用谷歌搜索这个时,我总是得到关于评估顺序的线索,一般来说,评估顺序是未指定的。

我知道参数评估顺序未指定C一般来说。

我的问题是参数评估顺序gcc,从左到右还是从右到左?

任何资源链接也将不胜感激......

EDIT:消除问题中的歧义

嗯,我说的是当时的情况

       foo(1+2,2+3,4+9)

首先评估哪个?

is it 1+2 or 4+9... 同样地..

我们可以通过在一个 gcc 编译器中编译它来得出声明吗……?或者不同的 gcc 版本之间也有不同吗?


如果你真的问foo(f1(), f2(), f3())- 这比foo(1+2, 3+4, 5+6),因为无论是先做还是最后做还是以随机顺序添加 1+2 和 3+4 都不会产生影响。

现在,不幸的是,你不能依赖f1() and f2() and f3()以任何特定顺序调用 - 只要每个函数被调用一次,顺序可以是任何顺序:

   f1, f2, f3
   f1, f3, f2
   f2, f3, f1
   f2, f1, f3
   f3, f2, f1
   f3, f1, f2

(涵盖三个参数的所有排列)。

这完全取决于编译器“认为最好的”。

我很久以前写了一些代码,并遇到了这个特殊的问题 - 我有一些类似的事情:

char foo(char a, char b)
 ... 
 if (a =! 'x')
   foo(fgetc(f), foo(fgetc(f))); 
 ...

因为我期待第一个(左)fgetc()第一个被调用,第二个被调用fgetc(),我可以获得正确的行为。而且在学校电脑上运行得很好。然后我把代码带回家并尝试在我的家用计算机上使用它。由于某种原因,它无法正常工作。我花了很长时间才弄清楚foo()只是被无限地调用,因为a从来没有'x',这会停止递归 - 因为'x'永远不会出现在第二次通话中。

那是在两台机器上都使用 gcc,但一台是 sparc(学校计算机),家里一台是 x86(386,运行 OS/2,那是很久以前的事了)。

解决方案是将其分成几行:

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

GCC中函数调用的参数求值顺序 的相关文章

随机推荐

  • 子网站上的 Sharepoint Foundation 母版页

    使用 Sharepoint Foundation 2010 我编辑了 v4 master 添加了对新 CSS 文件的引用 保存了更改 并将它们应用到主站点 没有问题 然而 当我创建一个子网站时 由于某些令人恼火的原因 它使用旧版本的 v4
  • MySQL 存储过程错误处理

    我相信目前 MySQL 中没有任何东西可以允许访问SQLSTATEMySQL 存储过程中最后执行的语句 这意味着当泛型SQLException在存储过程中引发 很难 不可能得出错误的确切性质 有没有人有一个解决方法来派生SQLSTATEMy
  • django 部署到 Heroku:服务器错误(500)

    我正在尝试将我的应用程序部署到heroku 部署已正确完成 但我收到服务器错误 500 当我将 DEBUG 设置为 true 时 不会发生严重错误 所以我认为加载静态文件有问题 我在日志中找不到任何值得注意的严重错误 我已经安装了白噪音 但
  • 如何根据分数标准化评论

    规范评论的最佳方法是什么 IE 假设我们有用户可以从 1 星到 5 星投票的产品 简单地取平均值并不是一个好方法 因为它没有考虑到评论的数量 例如 如果一个产品只有一条 5 星评论 那么它不应该领先于有 10000 条评论的产品 仅仅因为唯
  • 如何将 .xproj 引用到 .csproj 中?

    I have csproj项目 我想参考其他项目 xproj 一切看起来都很好 但是当我尝试构建解决方案时 我却不能 因为 dll 丢失了 当我引用 dll from bin release net452 本身那么一切都好 如何解决这个问题
  • 使用 Cygwin 中的 Windows Python

    我最近在 Windows 上使用 Cygwin 我想使用 Windows 安装的 Python 所以在测试过程中我使用 cygdrive c Python26 python exe myfile py而不是python myfile exe
  • 从 Oracle 函数返回引用游标

    我收到错误 PLS 00382 表达式类型错误 我想将参考光标作为输出 请让我知道我该怎么做 create or replace function test cur return sys refcursor as var ref sys r
  • 在 R 中使用表情符号

    我有一个包含很多表情符号的 csv 文件 Person Message A A How are you B Alright A 我怎么能够read csv 进入 R 以便表情符号不会变黑 我想跟踪一段时间内表情符号的使用情况 我的控制台有一
  • 解释 Merkle 树在最终一致性中的使用

    默克尔树 http en wikipedia org wiki Hash tree在几个分布式 复制的键 值存储中用作反熵机制 Dynamo http www allthingsdistributed com files amazon dy
  • 如何在 RST/阅读文档的代码块中添加复制按钮

    我一直在编写个人 操作方法 指南 记录并保留我的学习日记 我现在有一个几乎太长的代码块 当我自己遇到这么长的代码时 试图仅突出显示该代码块而不突出显示整个页面 或者还不够 总是令人沮丧 所以 我的问题是 对于rst 重构文本 code bl
  • 如何将 PostGIS 添加到 PostgreSQL pgAdmin?

    我已经安装了 PostgreSQL 和 pgAdmin 但我想添加一个 PostGIS 服务器 以便我可以处理地理信息系统项目 我正在跟进本教程 http workshops boundlessgeo com postgis intro c
  • Windows 应用商店应用程序 UI 更新

    我正在为 Windows 8 编写一个 Windows Store App 玩具应用程序 它只有一个 xaml 页面 其中包含TextBlock 该页面的 MyTimer 类为DataContext this DataContext new
  • UITextView从底部开始

    我遇到了问题UI文本视图 我以前见过其他人也遇到过这个问题 但是每当我的应用程序在我的手机上加载时 所有UITextViews从文本的底部开始 我必须向上滚动 我已经尝试了多种解决方案 但我需要一个仅在情节提要上使用的解决方案 因为我有一些
  • dropzone.js 和 jquery 版本兼容性

    我最近在一些项目中使用 dropzone js 并配置选项没有问题 但在一个新项目中我使用的是由 Zend Framework 3 自动安装的最新版本的 jQuery 3 1 0 它似乎会导致一些问题与 dropzone js 版本 4 3
  • 如何在Tomcat(servlet容器)中监听套接字?

    我必须让网络应用程序监听套接字 服务器套接字 并处理套接字流 但该应用程序只是部署在 Tomcat 中 Tomcat 只是一个 servlet 容器 它没有 JCA 支持 并且在servlet线程中建立服务器套接字是不合理的 解决方案1 丑
  • ES6 中符号命名有约定吗?

    我正在摆弄 ES6 查看符号 与 Ruby 不同 例如你会写 symbol ES6符号似乎允许任何 标准 变量名 说实话 我觉得这很令人困惑 var privateProperty Symbol var obj obj privatePro
  • 我们应该在执行某些代码之前还是之后调用超类

    Android Studio 0 4 6 Hello 我这里有一个代码片段 我经常困惑 super 应该是第一行执行还是最后一行 通常 我将其作为第一次调用 以便可以在父类中设置默认属性 但是 我之前看过一些执行此操作的代码 我只是想知道这
  • Try Catch 无法与 PHP 中的 require_once 一起使用?

    我不能做这样的事吗 try require once includes functions php catch Exception e echo Message e gt getMessage echo Code e gt getCode
  • 如何在 Laravel 中使用 paginator::make() 在视图中显示结果集?

    我用过Paginator make对表中的记录进行分页 在视图中 我得到了分页链接 但每个链接都包含其中的所有记录 如何限制它perPage项目 datas Paginator make paginator count paginator
  • GCC中函数调用的参数求值顺序

    当我用谷歌搜索这个时 我总是得到关于评估顺序的线索 一般来说 评估顺序是未指定的 我知道参数评估顺序未指定C一般来说 我的问题是参数评估顺序gcc 从左到右还是从右到左 任何资源链接也将不胜感激 EDIT 消除问题中的歧义 嗯 我说的是当时