C中单引号和双引号的区别

Differences between single-quotes and double-quotes in C

最近我看到,如果我将 printf 与 'foo' 一起使用,我会收到警告。

printf('numero');

warning: character constant too long for its type [enabled by default] warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast. /usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ extern int printf (const char *__restrict __format, ...); warning: format not a string literal and no format arguments [-Wformat-security]

当我使用 "" 时,我没有收到任何警告 printf("numero");

那么,''"" 有什么区别?

, '' is used for character constants and "" for string, unlike 中,两者可以互换使用。

在c中,字符串分隔符是"'用于字符常量。

双引号 " 将生成一个字符串,一个以 '[=15=]' 字节结尾的字节序列。

示例:

const char *string = "Example";
/* the sequence -> ['E', 'x', 'a', 'm', 'p', 'l', 'e', '[=10=]'] is generated */

' 将生成一个整数,在单个字符的情况下它是它表示的 ascii 值,在多个字符的情况下它是实现定义的。

示例:

char A = 'A'; /* the ascii value of 'A', 0x41 or 65 decimal */

多字符字符串,也会生成一个整数,但它的值会根据c implementation/compiler.

''表示字符,""表示字符串。

printf 期望 const char*(一个字符串)作为它的第一个参数。为此,您需要使用 ""。如果你使用 '',编译器会报错并告诉你 printf 期望 const char* 作为它的第一个参数而不是 char.

仅供参考,向 '' 添加多个字符(如 'numero')将生成一个多字符文字,其值由实现定义。

字符文字和字符串文字之间存在差异。

要定义字符文字,您需要使用单引号。例如

'A' 是一个字符文字。在 C 中,它的类型为 int,甚至被称为整型字符常量。它的值是字符内部表示的数值。您也可以使用多字节字符常量,例如 'AB' 但其值是实现定义的。

要定义字符串文字,您需要使用双引号。例如 "A" 是一个字符串文字。它具有两个字符(包括终止零)char[2] 的字符数组类型。你可以想象成

char s[2] = { 'A', '[=10=]' };

在表达式中,字符数组被转换为指向其第一个元素的指针。因此,在表达式中,字符串文字被转换为类型 char *。你可以想象成

char s[2] = { 'A', '[=11=]' };
char *p = s;

函数 printf 的第一个参数的类型为 const char *。因此,可以在函数 printf.

中使用用作参数的字符串文字

例如

printf( "A" );

相同
printf( p );

其中 p 的定义如上所示。

整型字符常量的类型为 int。将它用作参数可能会导致未定义的行为,因为它的值将被函数 printf 解释为字符串的地址。所以这个声明

printf( 'A' );

无效。 printf 会将常量的内部值,例如 65(如果考虑 ASCII table)视为某个内存地址,并会尝试输出存储在该地址的内容。

在c中,'用于字符常量,而"用于字符串

c 中的 printf 函数需要一个字符串,因此您的代码 printf('numero'); 将导致意外行为。

而是使用 printf("numero");

您可以阅读 this small tutorial 以获得更多帮助