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");
那么,''
和 ""
有什么区别?
在 c, ''
is used for character constants and ""
for string, unlike python 中,两者可以互换使用。
在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 以获得更多帮助
最近我看到,如果我将 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");
那么,''
和 ""
有什么区别?
在 c, ''
is used for character constants and ""
for string, unlike python 中,两者可以互换使用。
在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 以获得更多帮助