【问题标题】:what is difference in type between array of char and string literalchar数组和字符串文字之间的类型有什么区别
【发布时间】:2020-02-04 18:48:21
【问题描述】:

我正在阅读 c++ 编程语言书籍,并且正在学习指向 char 的指针,
我找到了这个代码char s[] = "Gorm";
这提醒我字符串文字被隐式转换为 const char * 。

所以我对 lhs 和 rhs 不是同一类型感到困惑。

我从这里使用了在线编译器和代码:Is it possible to print a variable's type in standard C++?
了解编译器如何查看 lhs 和 rhs 的类型,
然后我发现 lhs 被视为 char[5] 而 rhs 被视为 char[5] const &
我可以解释 lhs ,
但我不明白什么是“对 5 个字符数组的常量左值引用”或
即使在 lhs char s[]char* s 的隐式转换之后,
什么是“对指向非 const char 的非 const 指针的常量左值引用”?

根据定义常量不是左值引用“它仅指初始化它的值”???
那么为什么我们在“&”之前需要 const ???

那不同类型的lhs和rhs怎么分配??????

建议的答案对于理解 char s[] 如何从字符串文字 "it is language rule" 初始化非常有帮助。

但它没有回答关于表达式“char [5] const &”的部分问题???

const &这个奇怪的表达是什么意思?!!!
const 指的是什么???

它是指左值引用本身吗???“根据定义,引用是常量,初始化后我们不能改变引用的值”???

还是引用数组const char的元素所以字符串字面量数组不能改变???
但在这种情况下,const 应该放在 char 之前或 char 之后而不是在 & 之前 ?????!!!

或 const 指的是 char[5] 类型,在这种情况下,它的重要性是什么????
通常数组在定义后不能改变大小或类型????

【问题讨论】:

  • 字符串文字表示为const char 的静态分配数组。该数组的长度是文字中的字符数,加上一个用于 nul 终止符的字符。所以char s[] = "Gorm" 创建s 作为5 个char 的数组,并将该数组的元素初始化为字符串文字的副本,即'G''o''r''m' 和@987654346 @.
  • 您认为const char* 不能变成char* 是正确的。由于 C++ 的古老遗产,从字符串文字初始化 char* 的特定情况在许多编译器中是一个例外。现代编译器至少应该发出警告,您可能希望保留constgodbolt.org/z/_Ycqg3
  • @MaxLanghof :在彼得的评论中,我知道 = 符号不是赋值,而是初始化,因此它采用字符串文字“Gorm”的常量元素并将它们转换为 s 中的非常量字符....但随后在 Max 评论中,他谈到了相同的数组,但它们隐式转换为指针......在初始化期间数组语法是否转换为指针??!!我认为不是......所以指针异常可能只适用于传递数组功能或在数组之间进行逻辑比较...

标签: c++ arrays string pointers char


【解决方案1】:

尽管您的问题尚不清楚,但我认为主要问题是字符串文字与字符数组 char[] 的类型不同。字符串文字不是 c++ 中的数据类型的字符串或字符数组,而是在编译期间定义的语法结构。另一个例子是整数文字 0b00000101 这表示一个等于 5 的整数但不是整数,就像 "gorm" 不是字符串但表示编译器的字符串(更准确地说是 char 数组)一样。当声明一个 char 数组并使用字符串文字对其进行初始化时,就像您在此处所做的那样:char s[] = "Gorm";。这告诉编译器在初始化 char 数组 s 时将字符串字面量视为 char 数组。

我相信研究字面量的概念以及它如何帮助在编程语言中初始化值会有所帮助。 Link to Wikipedia page on Literals

【讨论】:

  • 我认为表达式“语法结构”应该表示某种类型的数组,以便编译器可以找到这个结构并解释它......你对积分结构的类比可以改写为0b00000101和 5 是二进制和十进制形式的整数......所以“Gorm”和 s 是什么形式的数组???
猜你喜欢
  • 2018-11-12
  • 2015-03-12
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多