使用字符常量而不是字符串文字,反之亦然

在 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;
}

在几乎所有情况下,编译器都会抱怨这些混淆。如果没有,则需要使用更多编译器警告选项,或者建议你使用更好的编译器。