Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型限定符出现在多项声明中(显示指针的奇怪行为)_C++ - Fatal编程技术网

C++ 类型限定符出现在多项声明中(显示指针的奇怪行为)

C++ 类型限定符出现在多项声明中(显示指针的奇怪行为),c++,C++,当我尝试这样做时: int Var_1 =3, const Var_2 =34; 它抛出了一个错误,我理解(any)类型限定符const不能出现在多项声明(如上所述)的第一个逗号之后,但当用指针引发限定符时,它会改变其行为” 这有人能解释一下吗?< /P> < P>这与C++P>中声明C++的奇怪方式有关。 问题中所示的声明的一般结构如下:您有一个说明符序列,后跟一个或多个逗号分隔的声明符,其中每个声明符可能有一个可选的初始值设定项 关键字const和int是说明符,因此它们位于开头。每

当我尝试这样做时:

   int Var_1 =3, const Var_2 =34;
它抛出了一个错误,我理解(any)类型限定符
const
不能出现在多项声明(如上所述)的第一个逗号之后,但当用指针引发限定符时,它会改变其行为”


这有人能解释一下吗?< /P> < P>这与C++P>中声明C++的奇怪方式有关。 问题中所示的声明的一般结构如下:您有一个说明符序列,后跟一个或多个逗号分隔的声明符,其中每个声明符可能有一个可选的初始值设定项

关键字
const
int
是说明符,因此它们位于开头。每个说明符修改所有声明符。例如:

const int *x, y[10];
在这个声明中有两个说明符,即
const
int
,还有两个说明符,即
*x
y[10]
。这两个说明符分别修改这两个说明符

说明符描述的类型信息只能出现在开头,因为所有说明符必须位于所有声明符之前。这是语言的规则

但是,一些类型信息由声明符携带。显然,
x
y
在上述声明中具有不同的类型,即使它们被相同的说明符修改;
x
是指针类型,
y
是数组类型。声明符可以被认为是由正在声明的实体,以及一些运算符。
*
运算符创建指针,
[]
运算符创建数组。这些运算符可以组合和嵌套,并且可以使用括号更改其优先级


我们可以将
*const Var_2
解释为一个声明符,将
*const
视为一个生成
const
限定指针的运算符。之所以需要这种语法,是因为
const int*p
生成指向
const int
的指针,而不是指向
int
const
指针。因此,
const
*const Var_2
中,它的作用不同于它在说明符中的作用,并且在语法上是允许的,因为它是
*const
运算符的一部分。但是,
const
本身不是可以出现在声明符中的有效运算符,当您将它放在逗号之后时,它就不能再作为说明符了。

在不涉及太多细节的情况下,声明的语法是decl说明符seq,后跟init声明符list,后跟分号

在您的声明中,
int
是decl说明符seq,
Var1=3,*const Var_2=34
是初始声明器列表。后一个术语表示可能具有初始值设定项的声明器的逗号分隔列表

declarator的定义涉及它必须是以下之一:

  • 括号中的另一个声明符
  • 另一个声明符前面有可选属性和限定符,前面都有
    *
    &
    &&
    T:*
  • 另一个声明符,后跟各种限定符/属性等
  • 标识符,可选后跟属性
所以
Var1
是一个声明符,因为它是一个标识符。
*const Var2
是第二个项目符号下的声明符。但是
const Var2
与上述任何规则都不匹配


为什么规则是这样的?我不能确切地说,但我假设添加一个“限定符声明器”也是声明器的规则会带来一些问题,例如对当前有效的声明进行不明确的解析

例如
int-const x,y;
。如果
const x
是一个声明符,那么可以用两种不同的方式来解析它——其中一种
y
是一个
int
,另一种
y
a
const-int


<>但在实际的规则中,由于 const x/COD>不是一个声明器,唯一的解析是<代码> int const <代码>是DECL指定符SEQ,而<代码> x,y < /> >是声明者列表。

简短回答:因为标准是这样的。长回答:认真的,因为标准说soThis仅仅是因为C++的语法。不允许这样做。只是不要用<代码>、<代码>进行多次声明,很多人并不认为它是好的编码风格。在后者中,<代码> const <代码>限定了<代码> */代码>,而不是<代码> int >代码>。您在寻找什么样的答案?换句话说,没有其他说明符可以修改基类型说明符,即int变量。_1,const Var_1;基类型说明符int(对所有声明符都是通用的)正在被修改/限制,这在语法上是不正确的,而当*const修改(指针不是基类型说明符)时,它是声明符的一部分,因此它是允许的?
const int *x, y[10];