非 void 函数中的空返回是未定义的行为吗?

2023-11-26

阅读有关该主题的答案后控制到达非 void 函数的末尾我没有看到任何专门针对以空退出非 void 函数的情况的答案return陈述:

int return_integer() { return; }  // empty return in non-void function

到目前为止我发现了什么C标准 is:

6.8.6.4 返回语句

约束条件

  1. A return带有表达式的语句不得出现在返回类型为void. A return不带表达式的语句只能出现在返回类型为void.

标准报价说明了什么should我们用我们的return的陈述void和非void函数,当我们忽略约束时会发生什么,文档的其他部分提到了:

6.9.1 函数定义

  1. If the }到达终止函数,并且函数调用的值由调用者使用,行为是未定义的。

之前的标准引用指出,如果我们使用函数的返回值,该函数在到达右花括号后结束,就会发生 UB (}),所以我们在下面的代码中有UB:

int UB(int x) { if (x) return x; }

printf("%d", UB(1)); // Correct
printf("%d", UB(0)); // Undefined behavior

In the UB(1)调用函数返回1通过return x;根据指示if (x);在里面UB(0)打电话给if (x)条件未通过,因此函数结束到达},在这种情况下使用返回值是 UB (但不在UB(1))。但是,在这种情况下会发生什么呢?

int UB(int x) { if (x) return; } // empty return statement

printf("%d", UB(1)); // Undefined behavior?
printf("%d", UB(0)); // Undefined behavior

在上面的代码中,调用了UB(1)不满足§6.9.1/12因为函数结束而导致 UB 的要求没有达到}并且也不返回任何值。

C 标准的哪一部分描述了这种情况?


int UB(int x) { if (x) return; } 

这甚至不是未定义的行为,它是违反约束。引用的文本

不带表达式的 return 语句只能出现在 返回类型为 void 的函数

6.8.6.4 中的内容是规范性的,这意味着编译器不允许在不给出诊断消息的情况下让它溜走。如果编译时没有给出诊断,则编译器不是合格的实现(不遵循语言标准)。

用简单的英语来说,这意味着:该代码甚至不应该编译。

现在,如果编译器确实生成了二进制可执行文件,即使代码违反了约束,那么所有的赌注都将落空。它不再是一个 C 程序,而是某种非标准程序,任何语言标准都无法保证其行为。

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

非 void 函数中的空返回是未定义的行为吗? 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 私有模板函数

    我有一堂课 C h class C private template
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • OpenXML 将段落样式(标题 1、标题 2、标题 3 等)添加到字处理文档

    谁能指导我如何使用开放 XML 字处理在段落上添加预定义样式 我尝试过论坛上提供的各种解决方案 但对我来说没有任何作用 这是我想要完成的任务 Create a document by supplying the filepath Wordp
  • 按钮上方滚动文本,按钮固定在底部

    我很难在 Android 应用程序中获得我想要的 GUI 布局结果 我想要的简要描述 GUI 将包括两个 TextView 和四个按钮 四个按钮水平排列 位于同一行 并固定在屏幕右下角 两个 TextView 中的第一个从屏幕顶部开始 文本
  • 如何使用运行时参数在 Scala 中创建单例对象

    我正在尝试使用运行时指定的参数创建一个单例对象 例子 object NetworkPusher val networkAdress 想象一下 networkAdress 参数来自命令行 我该如何制定解决方法来做到这一点 单例是延迟初始化的
  • 使用 Hibernate 处理文本文件

    我在用休眠在 Java 应用程序中访问我的数据库 它与 MS SQL 和 MySQL 配合得很好 但是我必须在某些表单上显示的一些数据必须来自文本文件 我所说的文本文件是指人类可读的文件 它们可以是 CSV 制表符分隔 甚至是每行的键 值对
  • 如何让顶级git跟踪另一个子目录git下的所有文件

    命令序列 mkdir 顶目录mkdir another git directory触摸文件C触摸屏Dgit 添加 git commit m 子目录初始化 cd 触摸文件触摸文件Bgit 添加 git commit m 顶层目录初始化 git
  • Spring事务不回滚

    我们遇到了 Spring 事务回滚问题 回滚似乎不起作用 在我的服务层方法中 注释为 Transactional我叫三个不同的DAOImpl类插入3条记录 中间插入从第四个表中获取数据以填充描述字段 但这失败了 我预计第一个插入会回滚 但似
  • 使用 pip 将 Python 包安装到不同的目录中?

    我知道明显的答案是使用 virtualenv 和 virtualenvwrapper 但由于各种原因我不能 不想这样做 那么如何修改命令 pip install package name to make pip将软件包安装在默认位置以外的位
  • 如何解决 wsdl2java 上 ObjectFactory 中的冲突?

    我在用着CXF and wsdl2java自动生成Web服务类 问题 不知何故 我想要连接的网络服务的某些元素有重复的名称 Two declarations cause a collision in the ObjectFactory cl
  • 获取 java.time.chrono.HijrahDate 实例的月份名称

    HijrahDate hd HijrahChronology INSTANCE date LocalDate of 2014 11 25 如果我们有HijrahDate实例 预计有一个方法UmalquraCalendar API显示月份名称
  • 我可以将 Must_use 应用于函数结果吗?

    我有一个函数返回一个f64 我想确保使用该函数的输出 而不是仅仅忽略它 有什么办法可以做到这一点吗 返回类型不用于错误处理 因此将其包装在Result or Option确实没有意义 我想要类似的东西 must use fn calcula
  • 两个 .net 程序集之间的循环引用

    我有两个程序集 A 和 B A 已存在对 B 的引用 并且必须保持这种状态 现在我对B做了一些修改 需要引用A 所以就出现了循环引用 一些细节 A 有一些属性网格 B 中的对话框需要托管这些属性网格 因此 为了避免这种循环引用问题 我尝试在
  • 交换字符串中的字母

    我需要按照以下规则交换字符串中的字母 A 被 T 取代 T 被替换为 A C 被 G 取代 G 被 C 取代 例如 ACGTA应该成为TGCAT 解决这个问题的最佳方法是什么 正在寻找java A to T T to A 找到了这个建议 S
  • 如何调试/记录 wsgi python 应用程序?

    我试过这个 usr bin python from wsgiref simple server import make server from cgi import parse qs escape import logging import
  • 为什么 object.__new__ 在这两种情况下工作方式不同?

    Python 版本 2 7 3 默认 2013 年 4 月 10 日 06 20 15 n GCC 4 6 3 我有这个 gt gt gt class testclass1 object pass gt gt gt class testcl
  • WPF:ContentPresenter 上的 TextTrimming

    有没有一种简单的方法可以让 TextTrimming 与 ContentPresenter 一起使用 我有 TextBlock 和 AccessText 的隐式样式 其中 TextTrimming 设置为 CharacterEllipsis
  • 具有特征的 Scala 和 Mockito

    我有一个简单的类 它自然地分为两部分 所以我重构为 class Refactored extends PartOne with PartTwo 然后单元测试开始失败 下面是重现该问题的尝试 所有三个示例的功能都是相同的 但第三个测试失败并出
  • 指向结构的指针的大小[重复]

    这个问题在这里已经有答案了 我试图记住 C 编程的基础知识 并且关于结构体指针 我正在执行以下操作 include
  • Google Apps 脚本国际化 (i18n)

    这些文档似乎没有提及任何内容 是否有关于如何在 Google Apps 脚本中执行 i18n 的推荐方法 尤其是作为 WebApp 发布的 有没有办法找出用户的区域设置 Session getActiveUserLocale 应返回区域设置
  • CodeIgniter POST/GET 默认值

    如果 POST GET 数据为空 假 我可以设置默认值吗 this gt input gt post varname value if falsy 所以我不必像这样编码 a this gt input gt post varname thi
  • 非 void 函数中的空返回是未定义的行为吗?

    阅读有关该主题的答案后控制到达非 void 函数的末尾我没有看到任何专门针对以空退出非 void 函数的情况的答案return陈述 int return integer return empty return in non void fun