gpt4 book ai didi

c++ - C++ 中的声明

转载 作者:IT老高 更新时间:2023-10-28 13:57:38 25 4
gpt4 key购买 nike

据我所知,C++ 中的声明/初始化是带有“基本类型”的语句,后跟逗号分隔的声明符列表。

考虑以下声明:

int i = 0, *const p = &i; // Legal, the so-called base type is 'int'.
// i is an int while p is a const pointer to an int.

int j = 0, const c = 2; // Error: C++ requires a type specifier for all declarations.
// Intention was to declare j as an int and c an as const int.

int *const p1 = nullptr, i1 = 0; // p1 is a const pointer to an int while i1 is just an int.

int const j1 = 0, c1 = 2; // Both j1 and c1 are const int.

const int基本类型还是复合类型?

从上面第二个声明中的错误来看,它似乎是一个基类型。如果是这样,那么第一个声明呢?

换句话说,如果第一个语句是合法的,为什么第二个语句不合法?另外,为什么第三个和第四个语句的行为不同?

最佳答案

好问题,复杂的答案。要真正掌握这一点,您需要非常彻底地了解 C++ 声明的内部结构。

(请注意,在这个答案中,我将完全省略属性的存在以防止过度复杂化)。

声明有两个组成部分:一系列说明符,后跟以逗号分隔的 init-declarators 列表。

说明符是这样的:

  • 存储类说明符(例如 staticextern )
  • 函数说明符(例如 virtualinline )
  • friend , typedef , constexpr
  • 类型说明符 , 其中包括:
  • 简单类型说明符(例如 intshort )
  • 简历限定符 ( const , volatile )
  • 其他东西(例如 decltype )

  • 声明的第二部分是逗号分隔的 init-declarators。每个 init-declarator 由一系列声明符组成,可选地后跟一个初始化程序。

    什么是声明符:
  • 标识符(例如 i 中的 int i; )
  • 类指针运算符( *&&& ,指向成员的语法)
  • 函数参数语法(例如 (int, char) )
  • 数组语法(例如 [2][3] )
  • 简历限定符 , 如果这些跟在一个指针声明符之后。

  • 请注意,声明的结构是严格的:首先是说明符,然后是初始化声明符(每个声明符都可选地后跟初始化程序)。

    规则是:说明符适用于整个声明,而声明符仅适用于一个 init-declarator(适用于逗号分隔列表的一个元素)。

    还要注意上面的 cv 限定符可以用作说明符和声明符。作为声明符,语法限制它们只能在存在指针的情况下使用。

    因此,要处理您发布的四个声明:

    1
    int i = 0, *const p = &i;

    说明符部分只包含一个说明符: int .这是所有声明符都适用的部分。

    有两个初始化声明符: i = 0* const p = &i .

    第一个有一个声明符, i , 和一个初始化器 = 0 .由于没有类型修改声明符, i 的类型由说明符给出, int在这种情况下。

    第二个 init-declarator 有三个声明器: * , const , 和 p .还有一个初始化器, = &i .

    声明符 *const将基类型修改为“指向基类型的常量指针”。由说明符给出的基本类型是 int , 类型为 p将是“指向 int 的常量指针”。

    2
    int j = 0, const c = 2;

    同样,一个说明符: int ,和两个初始化声明符: j = 0const c = 2 .

    对于第二个初始化声明符,声明符是 constc .正如我提到的,如果涉及指针,语法只允许 cv 限定符作为声明符。情况并非如此,因此出现错误。

    3
    int *const p1 = nullptr, i1 = 0;

    一个说明符: int , 两个初始化声明符: * const p1 = nullptri1 = 0 .

    对于第一个 init-declarator,声明符是: * , const , 和 p1 .我们已经处理了这样一个 init-declarator(在 1 中的第二个)。它将“指向基类型的常量指针”添加到说明符定义的基类型(仍然是 int )。

    对于第二个 init-declarator i1 = 0 , 很明显。没有类型修改,按原样使用说明符。所以 i1变成 int .

    4
    int const j1 = 0, c1 = 2;

    在这里,我们的情况与前三项根本不同。我们有两个说明符: intconst .然后是两个初始化声明符, j1 = 0c1 = 2 .

    这些 init-declarators 中没有任何类型修饰声明符,因此它们都使用说明符中的类型,即 const int .

    关于c++ - C++ 中的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722570/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com