使用字元常量而不是字串文字,反之亦然
在 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;
}
在幾乎所有情況下,編譯器都會抱怨這些混淆。如果沒有,則需要使用更多編譯器警告選項,或者建議你使用更好的編譯器。