首先,您可能知道它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中的情况,然后我假设?
为什么有两种正确的const数据指定方式?在什么情况下,如果有的话,您更喜欢或需要其中一种方式?
从本质上讲,inside 说明符在星号之前的位置const无关紧要的原因是 C 语法是由 Kernighan 和 Ritchie 以这种方式定义的。
他们以这种方式定义语法的原因很可能是他们的 C 编译器从左到右解析输入,并在消耗每个标记时完成处理。使用*令牌会将当前声明的状态更改为指针类型。遇到constafter*意味着const限定符应用于指针声明;*在限定符应用于指向的数据之前遇到它。
*
因为如果限定符出现在类型说明符之前或之后,语义不会改变const,所以无论哪种方式都可以接受。
声明函数指针时会出现类似的情况,其中:
void * function1(void)声明一个返回的函数void *,
void * function1(void)
void *
void (* function2)(void)声明一个指向返回的函数的 函数指针void。
void (* function2)(void)
void
再次需要注意的是语言语法支持从左到右的解析器。