C 函数调用中的默认参数提升

2023-11-24

Setup

我对在 C 中调用函数时的默认参数提升有几个问题。这是第 6.5.2.2 节“函数调用”第 6、7 和 8 段C99 标准 (pdf)(为了便于阅读,添加了重点并分成列表):

第 6 段

  1. 如果表示被调用函数的表达式的类型为不包括原型,对每个参数以及具有类型的参数执行整数提升float被提升为double。这些被称为默认参数促销.
  2. 如果参数的数量不等于参数的数量,则行为未定义。
  3. 如果函数定义的类型为包括一个原型,并且原型以省略号结尾 (, ...) 或者提升后参数的类型与参数的类型不兼容,行为未定义。
  4. If the function is defined with a type that does not include a prototype, and the types of the arguments after promotion are not compatible with those of the parameters after promotion, the behavior is undefined, except for the following cases:
    • 一种提升类型是有符号整数类型,另一种提升类型是相应的无符号整数类型,并且该值可以用两种类型表示;
    • 两种类型都是指向字符类型的限定或非限定版本的指针,或者void.

第 7 段

  1. 如果表示被调用函数的表达式的类型为确实包括原型,参数像通过赋值一样隐式转换为相应参数的类型,将每个参数的类型视为其声明类型的非限定版本。
  2. 函数原型声明符中的省略号表示法会导致参数类型转换在最后一个声明的参数之后停止。默认参数提升是对尾随参数执行的。

第 8 段

  1. 没有隐式执行其他转换;特别是,参数的数量和类型不会与函数定义中的参数进行比较不包含函数原型声明符.

我知道的

  • The 默认参数促销 are char and short to int/unsigned int and float to double
  • 可变参数函数的可选参数(例如printf) 受到默认参数促销的影响

作为记录,我的理解函数原型这是:

void func(int a, char b, float c);  // Function prototype
void func(int a, char b, float c) { /* ... */ }  // Function definition

Question

我真的很难理解这一切。我有一些问题:

  • 原型函数和非原型函数的行为真的有如此大的差异吗,例如在默认升级和隐式转换方面?
  • 默认参数提升何时发生?总是这样吗?或者只是在特殊情况下(比如可变参数函数)?这是否取决于函数是否原型化?

支持程序员的回答——这才是真货。

对于那些想知道的人why事情是这样的:在 1988 年之前的黑暗时代,经典的“K&R”C 中不存在函数原型之类的东西,并且建立了默认参数提升,因为 (a) 本质上是“免费”的,因为它不需要任何成本。在寄存器中放入一个字节比在寄存器中放入一个字更多,并且 (b) 减少参数传递中的潜在错误。第二个原因从来没有完全解决这个问题,这就是为什么 ANSI C 中函数原型的引入是 C 语言有史以来最重要的变化。

至于默认促销活动何时开始:当参数的预期类型为unknown,也就是说,当没有原型或参数是可变参数时。

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

C 函数调用中的默认参数提升 的相关文章

  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 为类型列表创建别名并将其作为模板参数传递

    我正在使用可变参数模板来实现访问者模式 template
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 我应该使用字节还是int?

    我记得曾在某处读到 即使您只需要字节 使用 Int32 更好 就性能而言 它 据说 仅适用于您不关心存储的情况 这是有效的吗 例如 我需要一个保存一周中某一天的变量 我是吗 int dayOfWeek or byte dayOfWeek E
  • .Net 支持柯里化泛型吗?

    假设我们有一个嵌套的泛型类 public class A
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 对 Action 方法的两个并行 ajax 请求排队,为什么?

    我正在使用 ASP NET MVC 开发一个视频网站 我希望在我的应用程序中拥有的一项功能是转码视频 但由于转码过程可能非常耗时 我想向客户端用户展示该过程的进度 因此 我的架构是使用一个控制器操作来处理整个转码过程 并将其进度写入存储在服
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE
  • 将二进制长字符串转换为十六进制 C#

    我正在寻找一种将长二进制字符串转换为十六进制字符串的方法 二进制字符串看起来像这样 0110011010010111001001110101011100110100001101101000011001010110001101101011 我

随机推荐

  • 非阻塞 API 是如何工作的?

    我一直在读Play 框架文档并发现这句话令人困惑 请注意 您可能会因此将阻塞代码包装在 期货 这并不意味着它是非阻塞的 它只是意味着 阻塞将发生在不同的线程中 你还需要做 确保您使用的线程池有足够的线程 处理阻塞 我的印象是所有这些非阻塞库
  • Swift 语言多播委托

    我正在尝试在 Swift 中实现多播委托功能 在 Objective C 中 我们有这个优秀的实现 https github com robbiehanson XMPPFramework blob master Utilities GCDM
  • 非托管内存未显示在任务管理器中

    我写了以下测试 实际上在更广泛的上下文中使用 IntPtr x Marshal AllocHGlobal 100000000 Console Write Press any key to continue Console ReadKey t
  • 关于配置首选项和js

    我想知道是否可以使用 javascript 获取 about config 中设置的某些首选项的值 动机是当用户登陆插件前端时获取我创建的 Firefox 插件中设置的首选项的值 基本上 我试图识别登陆 FE 的用户 而不要求他们明确登录
  • 如何通过 web.config 将 http 重定向到 https,将 www 重定向到非 www? [复制]

    这个问题在这里已经有答案了 我想使用 web config 将我的 ASP NET 站点上的所有请求重定向到 https 不含 www 那是 http http www https www 都应该去 https 到目前为止 我的 web c
  • 角度 - 垫子滑动切换不可见

    problem mat slide toggle 不可见 我正在尝试从下面的网址实现这个示例https material angular io components autocomplete examples 测试组件 html
  • 如何在客户端将自定义 ValidationAttribute 呈现为“da​​ta-val-xx”属性?

    给定一个如下所示的 ViewModel public class Login Required public string Username get set Required CustomValidator public string Pa
  • Angular 2滚动到底部(聊天风格)

    我有一组单细胞组件ng for loop 我已经一切就绪 但我似乎无法找出正确的 目前我有 setTimeout gt scrollToBottom 但这并不总是有效 因为图像异步地将视口向下推 在 Angular 2 中滚动到聊天窗口底部
  • 缩放存储在 S3 中的图像

    我面临的情况是 我需要将多个网站的图像存储推送到可以无限扩展的服务 S3 CloudFiles 等 到目前为止 我们已经能够允许用户在 Python 的图像库的帮助下动态生成自定义缩略图大小sorl 缩略图在姜戈 通过将我们的图像移动到 S
  • Backbone.js:过滤集合的正确方法?

    我当前使用的方法是过滤一个集合 它返回一个数组 然后使用 collection reset array 重新填充它 但是 这会修改原始集合 因此我添加了一个名为 originalCollectionArray 的数组 它跟踪集合的初始数组状
  • 为什么将 ArrayList 的泛型转换为超类不起作用?

    有人可以向我解释一下为什么标记该行吗 this line gives a compile error why 在下面的代码示例中不起作用 import java util ArrayList public class GenericCast
  • NLTK 正则表达式标记生成器在正则表达式中不能很好地处理小数点

    我正在尝试编写一个文本规范化器 需要处理的基本情况之一是像3 14 to three point one four or three point fourteen 我目前正在使用该模式 d d with nltk regexp tokeni
  • 查找两个字符串之间的相似度度量

    在Python中如何获得一个字符串与另一个字符串相似的概率 我想要得到一个十进制值 如 0 9 意味着 90 等 最好使用标准 Python 和库 e g similar Apple Appel would have a high prob
  • 使用 Ruby 将大文件上传到 S3 失败并出现内存不足错误,如何分块读取和上传?

    我们通过 Ruby AWS SDK v2 从 Windows 计算机将各种文件上传到 S3 我们已经使用 Ruby 1 9 进行了测试 我们的代码工作正常 除非遇到大文件 抛出内存不足错误 首先 我们使用以下代码将整个文件读入内存 body
  • 是否有用于双精度倒数平方根的快速 C 或 C++ 标准库函数?

    我发现自己打字 double foo 1 0 sqrt 很多 而且我听说现代处理器具有内置的反平方根操作码 是否有 C 或 C 标准库的反平方根函数 使用双精度浮点数 准确度为1 0 sqrt 与结果一样快或更快1 0 sqrt 不 不 没
  • 在经典 ASP 中对集合进行排序

    这是一个非常简单的问题 如何对集合进行排序 我有一个 CSV 文件 其中的行按随机顺序排列 我想根据一列中的日期对行进行排序 我是否将行添加到记录集中 我可以使用 Scripting Dictionary 进行排序吗 显然我已经被 NET
  • 字体大小的默认单位?

    网上的各种文本声称 pt 是默认的字体大小单位 当没有提供时 但是 我自己的测试似乎证明并非如此 我读过许多关于 W3C 的文档 涵盖 CSS 1 3 的字体大小 但我似乎无法在任何规范中找到对默认单位的实际引用 我在 Chrome 和 I
  • 阻止 PHP 解析非 PHP 文件,例如 someFile.php.txt

    我刚刚安装了 phpdocumentor 但收到了奇怪的错误 我终于找到了问题所在 Phpdocumentor 创建各种文件 例如 someFile php txt 其中包含 PHP 代码 但不打算进行解析 事实证明 我的服务器正在解析它们
  • 如何更改 Bootstrap 4 上的导航栏悬停颜色?

    我需要将导航栏悬停颜色更改为其他颜色 我设法自己更改导航栏文本颜色 但在检查元素的悬停颜色中找不到要更改的正确颜色 然后我在堆栈溢出上查找了以前的答案 但它们对我的代码不起作用 任何投入将不胜感激
  • C 函数调用中的默认参数提升

    Setup 我对在 C 中调用函数时的默认参数提升有几个问题 这是第 6 5 2 2 节 函数调用 第 6 7 和 8 段C99 标准 pdf 为了便于阅读 添加了重点并分成列表 第 6 段 如果表示被调用函数的表达式的类型为不包括原型 对