C 没那么难: void ( *( *f[] ) () ) ()

2024-04-23

我今天刚看到一张照片,希望得到解释。所以这是图片:

抄写:“C 并不那么难:void (*(*f[])())()定义f作为未指定大小的数组,包含指向函数的指针,该函数返回指向返回的函数的指针void."

我发现这令人困惑,并想知道这样的代码是否实用。我用谷歌搜索了这张照片,发现了另一张照片this https://www.reddit.com/r/ProgrammerHumor/comments/3yfpub/c_isnt_that_hard/cyd5f8dreddit 条目,这是该图片:

抄写:“所以这些符号可以读作:f [] * () * () void. f是一个指针数组,不带参数并返回一个不带参数并返回的指针void".

那么这种“螺旋式阅读”是有效的吗? C编译器是这样解析的吗?
如果对这个奇怪的代码有更简单的解释那就太好了。
抛开这些,这样的代码能有用吗?如果是的话,地点和时间?

一个问题 https://stackoverflow.com/questions/3707096/spiral-rule-and-declaration-follows-usage-for-parsing-c-and-c-declarations关于“螺旋规则”,但我不仅仅是问它如何应用或如何用该规则读取表达式。我也质疑此类表达式的使用和螺旋规则的有效性。关于这些,已经发布了一些很好的答案。


有一条规则叫做“顺时针/螺旋规则” http://c-faq.com/decl/spiral.anderson.html帮助找到复杂声明的含义。

From c-faq http://c-faq.com/decl/spiral.anderson.html:

需要遵循三个简单的步骤:

  1. 从未知元素开始,沿螺旋/顺时针方向移动;遇到以下内容时用相应的英文语句替换:

    [X] or []
    => 数组 X 大小...或数组未定义大小...

    (type1, type2)
    => 函数传递 type1 和 type2 返回...

    *
    => 指向...的指针

  2. 继续以螺旋/顺时针方向执行此操作,直到覆盖所有标记。

  3. 始终首先解决括号中的任何问题!

您可以查看上面的链接以获取示例。

另请注意,为了帮助您,还有一个名为:

http://www.cdecl.org http://www.cdecl.org

你可以输入一个C声明,它会给出它的英文含义。为了

void (*(*f[])())()

它输出:

将 f 声明为指向函数的指针数组,返回指向返回 void 的函数的指针

EDIT:

正如评论中指出的随机832 https://stackoverflow.com/users/691884/random832,螺旋规则不处理数组数组,并且会导致(大多数)这些声明中出现错误结果。例如对于int **x[1][2];螺旋法则忽略了这样一个事实[]优先于*.

当在数组数组前面时,可以在应用螺旋规则之前先添加显式括号。例如:int **x[1][2];是相同的int **(x[1][2]);(也是有效的 C)由于优先级和螺旋规则,然后将其正确读取为“x 是指向 int 的指针的数组 2 的数组 1”,这是正确的英语声明。

请注意,这个问题也已在本文中讨论过answer https://stackoverflow.com/questions/16260417/the-spiral-rule-about-declarations-when-is-it-in-error/16265389#16265389 by 詹姆斯·坎泽 https://stackoverflow.com/users/649665/james-kanze(指出由haccks https://stackoverflow.com/users/2455888/haccks在评论中)。

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

C 没那么难: void ( *( *f[] ) () ) () 的相关文章

  • C# 中的简单获取字符串(忽略末尾的数字)

    我认为正则表达式太过杀伤力 而且它需要我一些时间来编写一些代码 我想我现在应该学习 因为我知道一些正则表达式 分隔字母数字字符串中的字符串的最简单方法是什么 它将永远是 LLLLDDDDD 我只想要字母 l 通常只有 1 或 2 个字母 T
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • Lambda、封闭变量、显示类、可序列化性和流行层

    我已经为 Compact Framework 实现了一个流行层 包括BinaryFormatter 类似序列化器 我希望能够在适当的情况下序列化编译器生成的类 这些类是由 lambda 和迭代器等产生的 这样如果 例如 lambda 及其封
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 将 CryptoStream 解密为 MemoryStream

    我编写了一个过程 其中文件被加密并上传到 Azure 然后必须解密下载过程 这会失败并出现 填充无效且无法删除 错误 或 要解密的数据长度为无效的 错误 我在网上尝试了很多解决方案 包括C 使用 RijndaelManaged 和 Cryp
  • 有没有一种方法可以在不测试整个应用程序的情况下对类库(通用 Windows)进行单元测试?

    我需要进行单元测试Class Library Universal Windows 但是从 添加新项目 窗口中 我只看到了这一点 该项目使用应用程序容器运行所有测试 它始终打开一个应用程序 由于我不需要所有这些开销 我想知道是否有一种方法可以
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 二叉树实现C++

    二叉树插入 include stdafx h include
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • C# 中的自定义按钮:如何删除悬停背景?

    我正在尝试使用 Visual Studio 2005 对我的表单 其 FormBorderStyle none 执行自定义按钮 我在链接到该按钮的 ImageList 中有我的 3 种状态按钮图像 this btnClose AutoSiz
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • 使用全局 Web API 过滤器属性进行 Unity 依赖注入

    参考这个CodePlex 统一文章 http unity codeplex com discussions 446780我能够使用 WebAPI 控制器获取过滤器属性 如下所示 MyFilterAttribute public class
  • C++ 头文件包含

    我正在开发一个项目 每个头文件都有一个预处理器包含防护 我的包含是这样的 文件 gt 包含 main cpp gt header h 字符 h header h gt 矢量 iostream DataFiles h Character h
  • GridView,在代码中添加标题行第 2 部分

    这是这篇文章的延续 但添加了完整的代码 ASP NET GridView 在代码中添加标题行 https stackoverflow com questions 19119004 asp net gridview adding header
  • 对 MFC UI 应用程序进行单元测试吗?

    如何对大型 MFC UI 应用程序进行单元测试 我们有一些大型 MFC 应用程序已经开发了很多年 我们使用一些标准的自动化 QA 工具来运行基本脚本来检查基础知识 文件打开等 这些由 QA 小组在日常构建后运行 但我们希望引入一些程序 以便
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 如何在 C++ 中打印变量的名称? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中获取变量名称的编程方法 https stackoverflow com questions 1623111 programmatic way to get variable name in c

随机推荐

  • 如何将图标放入自定义对话框的标题中

    我想将一个可绘制对象放入对话框标题栏中 我尝试了以下方法 final Dialog dialog new Dialog this dialog requestWindowFeature Window FEATURE LEFT ICON di
  • 带有身份的 ASP.NET Core 2.0 中的 Cookie 过期

    环境 ASP NET Core 2 0 带有cookie的身份 In Startup ConfigureServices 有这样的 services ConfigureApplicationCookie options gt options
  • TikTok 登录套件:非法重定向链接

    我正在看新的TikTok 登录套件对于网络 我陷入了重定向步骤 与所有基于 oAuth 的服务类似 当您注册应用程序时 它们应该要求提供有效的重定向 URL 对于 TikTok 他们要求重定向域 如下所示 然后根据他们的官方文档 https
  • Laravel 5.1 失败的排队作业在 failed() 方法上失败,阻止调用队列失败事件处理程序

    我正在测试 Laravel 5 1 中的队列功能 我可以让作业在我的数据库表中排队 称为作业 并且可以让它们成功运行 我还创建了一个名为 failed jobs 的队列失败表 为了测试它 在作业表中 我操作有效负载数据以使其失败 然后像这样
  • Swift:递归值类型

    我有一个结构 我想在其中有一个 Struct 类型的全局变量 这个例子本质上是我实际创建的结构的简短版本 struct SplitString splits a string into parts before and after the
  • 正则表达式中的顺序不重要吗?

    我正在查看此 stackoverflow 链接中提出的问题 奇数个 a 的正则表达式 https stackoverflow com questions 28902496 regular expression for odd number
  • ZMQ 模式经销商/路由器心跳

    我在客户端有一个经销商套接字 它连接到服务器端的路由器套接字 我经常看到心跳机制 服务器定期向客户端发送消息 以便客户端知道自己是否正确连接到服务器 以便客户端在一段时间内没有收到消息时可以重新连接 例如这里的偏执海盗模式 http zgu
  • 在 Aurelia 中,我可以绑定包含视图模型中的函数以供自定义元素调用吗?

    我有一个自定义元素 它将接受用户输入 并且在单击 保存 按钮时 我想将信息传递给父视图模型 以便我可以将其发送到服务器并移至下一部分 例如 我将简化这一点 my element js import customElement bindabl
  • 如何从另一个块访问块状态中的数据

    我正在使用 Bloc 模式开发 Flutter 应用程序 认证成功后 UserSate就有了User对象 在所有其他 Bloc 中 我需要访问 UserState 中的 User 对象 我尝试在其他 Bloc 的构造函数参数上获取 User
  • React-testing-library - 屏幕与渲染查询

    有两种使用查询的方法react testing library https testing library com docs react testing library intro 您可以使用返回的查询render https testin
  • 有人有关于 C 语言设计和错误跟踪/控制系统的好指南吗?

    我是 C 开发的软件工程方面的新手 有没有人有关于如何为 C 项目 尤其是嵌入式 设计错误跟踪或错误控制系统的良好指南 谈论 C 库的错误跟踪也会有帮助 根据我的经验 这里的策略分为几个阵营 全局变量ala的使用errno http www
  • 在 pandas 系列上成对应用函数

    我有一个 pandas 系列 其元素构成 freezesets data 0 frozenset apple banana 1 frozenset apple orange 2 frozenset banana 3 frozenset ku
  • 无法通过 Graph API 获取我所属的 Office 365 组

    尝试获取用户所属的所有 Office 365 组 我已在 Azure 上注册了一个 本机客户端应用程序 并仅选择了一项权限 Microsoft Graph 范围下的 读取所有组 问题 其他租户的用户收到 由于缺乏权限 呼叫主体无法同意 错误
  • 根据 .txt 文件中存储的列表复制文件

    我有一个源文件夹 目标文件夹 我想要从源文件夹复制到目标文件夹的文件列表 该文件夹已保存到 txt 文件 listtocopy txt 如下 不确定它是否重要 但它们是 Anabat ZC 文件 S5281925 35 S5282317 2
  • 使用 Python 的 Windows 桌面 GUI 自动化 - 睡眠与紧密循环

    我正在使用 Python 的 PyAutoGUI 库来自动化 GUI 在当前窗口上完成数据输入后 我正在自动化的应用程序会打开一个新窗口 一切都由 python 自动化处理 当前窗口中的数据输入以及打开窗口所需的单击 在当前窗口中执行单击时
  • 如何使用模板模板参数为没有该方法所需的公共接口的 STL 容器实现通用方法

    问题陈述 为教育性的目的 实现适用于STL容器的方法printContainervector stack queue and deque 我提出了一个解决方案 但由于代码量过多 我不喜欢它 我为解决问题所做的事情 1 设计通用函数 期望容器
  • ReadFile() 可能有超时吗?

    while GetExitCodeProcess processInfo hProcess exitCode exitCode STILL ACTIVE ReadFile defaultSTDIN chBuf 1 dwRead 0 Writ
  • 你能让贴纸应用程序有声音吗?

    当你制作一个 iMessage 贴纸应用程序时 是否可以让它在点击时发出声音 示例 您向某人发送了一张贴纸 他们点击它并发出声音 谢谢 是的 您可以使用 iMessage 根据苹果文档here https developer apple c
  • Firebase 与 Swift

    我试图移植firechat ios项目转移到 Swift 并遇到了一些问题 我想这可能只是要求 firebase 人员对其 SDK 进行一些更新 但我想我还是会问 添加 Firebase 及其依赖项后 我无法成功构建我的项目 我收到警告 i
  • C 没那么难: void ( *( *f[] ) () ) ()

    我今天刚看到一张照片 希望得到解释 所以这是图片 抄写 C 并不那么难 void f 定义f作为未指定大小的数组 包含指向函数的指针 该函数返回指向返回的函数的指针void 我发现这令人困惑 并想知道这样的代码是否实用 我用谷歌搜索了这张照