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

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

在幾乎所有情況下,編譯器都會抱怨這些混淆。如果沒有,則需要使用更多編譯器警告選項,或者建議你使用更好的編譯器。