C - 字符串字面量
基本概念 0结尾的
字符数组 不需要讲了
说点冷知识
====================================================================
L前缀表示 wchar_t元素组成
L"1235" 是wchar_t[6]类型的数组
C11开始加了另外3种前缀 u8/u/U
分别表示 UTF-8字符串字面量/16位宽字符串字面量/32位宽字符串字面量
注意小u大U分别表示不同的类型
嗯 听一下就好 很少看到有人用过
====================================================================
预编译阶段会把连续2个字符串字面量连接起来
"123"
"456"
会被组成
"123456"
需要注意 不同前缀的字符串不能摆在一起
====================================================================
转义字符中 八进制转义最多3位
十六进制转义不限制位数//简直有病
所以
"\1234"表示 '\123' '4' 0 一共3个字节组成的字符串
"\x00000000000000000000000000000000000000000000000000000000000000FF" 表示'\xFF' 0 一共2个字节组成的字符串
====================================================================
静态存储 也就是说生存期是整个进程运行期
所以
char* foo()
{
return "123";
}
是合法的
====================================================================
不保证字符串字面量占用相同地址 但也不限制
"123" == "123"
可以是 1 也可以是0
还有比较特别的
"123" + 1 == "23"
这个表达式
有可能是 1
这种东西一般是说给编译器作者听的
编译器优化代码的时候 后缀相同的字符串字面量重叠存储 节省内存占用
一般人听听就好 没什么用
====================================================================
"1023" 是 char[5]类型 不是 signed char[5] 也不是 unsigned char[5]
这个属于历史包袱 需要注意使用字符串的时候
不要假设数组元素是有符号 也不要假设数组元素是无符号
如果使用场景需要明确有符号/无符号
需要专门使用 signed char [N]/ unsigned char [N]
====================================================================
字符串字面量可以是多个字符串 "123\0132" 占用8个字节 有2个字符串在里面
====================================================================
不是常量
所以
case (int)123.4:; 是正确的
case (int)"132":; 是错误的
====================================================================
大概是这些了
C++字符串字面量
基本内容和C一样 但有2点和C不同 需要注意
1 全部字符串字面量类型都带const
2 C++字符串字面量 原始字符前缀R 分隔符()里面的字符不转义
R"(\123)" 表示 "\\123"
比较特别的是 换行都会保留
R"(
1231
)"
表示 "\n1231\n"