字符串字面量

字符串字面量

所谓字符串字面量,就是我们在代码里面写的 "asdf" 这种东西。在代码中直接可以看见的,直接表达数值的,就是字面量,就像它名字一样,字面量。

而字符串字面量是字面量里面非常特殊的一类,字符串的字面量,本质是就是一个 char 字符数组,而 "asdf" 就是它的数组名,我们之间使用字符串字面量,就相当于创建一个临时的已经赋好值的字符数组。

因为它本质上是一个数组名,而我们却把它当成了真正的字符串,因此导致了很多 “想当然” 的错误,下面列举几个常见的错误:

  1. 字符串字面量 + 字符导致无法输出或者输出乱码,即 "asdf" + 'a'。我们可能认为这是对的但是在 C++ 看来,这就相当于 "asdf" + 97,从数组名的角度看,这就是给字符串位移了 \(97\) 位,然后输出,这一方面是容易导致数组越界,另一方面导致输出字符串不正确。
  2. 字符串字面量 + 字符串字面量,无法输出,以前我们会认为,这是 C++ 太懒,没加入这个特性,然而当做数组名看,这是很可笑的数组名 + 数组名,自然不会正常链接。(这里特别说一下,字符串字面量是有一个特性的,即字符串字面量 字符串字面量,即 "asdf" "asdf" 这样可以直接拼接成一个字符串)。

这里说一下,像 string 的 substr 函数切割下来的字符串都 string 类,天生带有加号拼接的方法。能看出,string 更符合时代。对比起来,char 数组离散的字符表示字符串的方法,有些落伍了。

这里顺便说一下,除了上述的 char 型字符串字面量以外,还有 string 型字符串字面量,即 "asdf"s,它和 char 型的区别是字符串后面多了个 s, 但拥有 string 一样的性质,从实现原理上看,它是个重载函数即:inline std::string std::literals::string_literals::operator ""s(const char *__str, std::size_t __len) 也就是说,这玩意本质上输出的是一个临时 string 变量,因此,无法读取地址,但是 char 型是真实创造了一个字符串是正常的变量,这算是一些区别。在复杂字符串处理时,可以尝试使用 string 字面量,可能有奇效。

posted @ 2026-03-07 11:26  blind5883  阅读(1)  评论(0)    收藏  举报