使用字符常量而不是字符串文字,反之亦然
在 C 中,字符常量和字符串文字是不同的东西。
由单引号(如'a'
)包围的字符是字符常量。字符常量是一个整数,其值是代表字符的字符代码。如何解释像'abc'
这样的多个字符的字符常量是实现定义的。
由双引号(如 abc
)包围的零个或多个字符是字符串文字。字符串文字是一个不可修改的数组,其元素的类型为 char
。双引号中的字符串加上终止空字符是内容,因此 abc
有 4 个元素({'a', 'b', 'c', '\0'}
)
在此示例中,使用字符常量,其中应使用字符串文字。此字符常量将以实现定义的方式转换为指针,并且转换的指针几乎没有机会有效,因此此示例将调用未定义的行为。
#include <stdio.h>
int main(void) {
const char *hello = 'hello, world'; /* bad */
puts(hello);
return 0;
}
在此示例中,使用字符串文字,其中应使用字符常量。从字符串文字转换的指针将以实现定义的方式转换为整数,并以实现定义的方式转换为 char
。 (如何将整数转换为无法表示要转换的值的有符号类型是实现定义的,char
是否已签名也是实现定义的。)输出将是一些无意义的事情。
#include <stdio.h>
int main(void) {
char c = "a"; /* bad */
printf("%c\n", c);
return 0;
}
在几乎所有情况下,编译器都会抱怨这些混淆。如果没有,则需要使用更多编译器警告选项,或者建议你使用更好的编译器。