const 之前还是 const 之后?

新手上路,请多包涵

首先,您可能知道 const 可用于使对象的数据或指针不可修改或两者兼而有之。

 const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer

但是,您也可以使用以下语法:

 Object const *obj; // same as const Object* obj;

似乎唯一重要的是您将 const 关键字放在星号的哪一侧。就我个人而言,我更喜欢将 const 放在类型的左侧,以指定它的数据不可修改,因为我发现它在我从左到右的思维方式中读起来更好,但哪个语法先出现?

更重要的是,为什么有两种正确的方法来指定 const 数据以及在什么情况下您更喜欢或需要其中一种(如果有的话)?

编辑:

因此,在我出生之前很久就起草了编译器应该如何解释事物的标准时,这听起来像是一个武断的决定。由于 const 应用于关键字左侧的内容(默认情况下?)我猜他们认为添加 “快捷方式” 以其他方式应用关键字和类型限定符没有害处至少直到这样通过解析 \* 或 & … 来更改声明的时间

这也是C中的情况,然后我假设?

原文由 AJG85 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 749
2 个回答

为什么有两种正确的方法来指定 const 数据,在什么情况下您更喜欢或需要其中一种?

从本质上讲, const 在说明符中星号之前的位置并不重要,因为 C 语法是由 Kernighan 和 Ritchie 定义的。

他们以这种方式定义语法的原因很可能是他们的 C 编译器从左到右解析输入,并在消耗每个标记时完成处理。使用 * 标记将当前声明的状态更改为指针类型。在 const * 意味着 const 限定符应用于指针声明;在 * 之前遇到它意味着限定符应用于指向的数据。

因为如果 const 限定符出现在类型说明符之前或之后,语义不会改变,因此无论哪种方式都可以接受。

声明函数指针时会出现类似的情况,其中:

  • void * function1(void) 声明一个返回 void * 的函数,

  • void (* function2)(void) 声明一个指向返回 void 的函数的 _函数指针_。

再次需要注意的是语言语法支持从左到右的解析器。

原文由 Heath Hunnicutt 发布,翻译遵循 CC BY-SA 3.0 许可协议

C 使用从右到左的语法。只需从右到左阅读声明:

 int var = 0;

// one is a pointer to a const int
int const * one = &var;
// two is a pointer to an int const (same as "const int")
const int * two = &var;

// three is a constant pointer to an int
int * const three = &var;

留给“const”的第一件事会受到它的影响。

如需更多乐趣,请阅读本指南: http ://cseweb.ucsd.edu/~ricko/rt_lt.rule.html

原文由 MacMark 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题