首页 > 后端开发 > C++ > C 最令人烦恼的解析是什么?为什么它将 `A a(A());` 解释为函数声明?

C 最令人烦恼的解析是什么?为什么它将 `A a(A());` 解释为函数声明?

Barbara Streisand
发布: 2024-12-21 05:40:09
原创
930 人浏览过

What is the C   Most Vexing Parse and Why Does It Interpret `A a(A());` as a Function Declaration?

最令人烦恼的解析:C 语法之谜

在迷宫般的 C 语法世界中,有一个神秘的难题脱颖而出:令人烦恼的解析(MVP)。这种语法上的特殊性给程序员带来了挑战,让很多人感到困惑。

MVP 的症结在于对某种语法的模糊解释:

A a( A() );
登录后复制

这行令人困惑的代码可以解释为两种相互冲突的方式:

  1. 变量定义:定义了类'A'的变量'a',以类'A'的匿名实例作为其值。
  2. 函数声明:函数'a ' 被声明,它返回一个类型为 'A' 的对象,并接受一个未命名的参数,该参数是一个返回 'A' 且不接受任何参数的函数。

令人惊讶的是,尽管程序员普遍期望第一种解释是正确的,但 C 标准强制要求第二种解释。这让许多人摸不着头脑,想知道为什么会做出这样一个意想不到且可能令人困惑的选择。

为了理解 MVP 背后的基本原理,让我们考虑一个它不存在的假设场景。在这种替代现实中,如何在 C 中声明函数?

A foo();
登录后复制

不幸的是,使用此语法会导致变量定义而不是方法声明。为了适应函数声明,需要一个新的关键字或尴尬的语法。

为了避免这种复杂性,C 标准选择了一个更简单的规则:“所有可以被解释为声明的东西都将被解释为宣言。”这包括变量定义和函数声明。因此,语法

A a;
登录后复制

定义一个变量,而

A a();
登录后复制

声明一个函数。

采用此规则可确保语法的一致性,从而无需特殊情况。虽然这最初可能会让程序员感到迷惑,但它最终会促进语言的清晰度和一致性。

以上是C 最令人烦恼的解析是什么?为什么它将 `A a(A());` 解释为函数声明?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板