C中单引号和双引号之间的差异

时间:2015-06-27 12:33:16

标签: c

我已经看到,如果我使用printf和' foo'我收到警告。

printf('numero');
  

警告:字符常量太长,类型[默认启用]   警告:传递'printf'的参数1使得指针来自整数   没有演员。 /usr/include/stdio.h:362:12:注意:预期'const   char * restrict '但参数的类型为'int'extern int printf   (const char * __ restrict __format,...);警告:格式不是字符串   文字和无格式参数[-Wformat-security]

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

那么,''""之间的区别是什么?

5 个答案:

答案 0 :(得分:6)

在字符串分隔符为"的情况下,'用于字符常量。

双引号"将生成一个字符串,一个带有终止'\0'字节的字节序列。

示例:

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

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

示例:

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

多字符串字符串也会生成一个整数,但它的值会根据c实现/编译器而改变。

答案 1 :(得分:5)

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

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

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

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

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

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

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

函数printf的第一个参数类型为const char *。因此,可以在函数printf中使用用作参数的字符串文字。

例如

printf( "A" );

相同
printf( p );

其中p的定义如上所示。

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

printf( 'A' );

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

答案 2 :(得分:4)

中,''用于字符常量,""用于字符串,与不同,两者都可以互换使用。

答案 3 :(得分:3)

''用于表示字符,而""用于表示字符串。

printf期望const char*(一个字符串)作为其第一个参数。您需要使用""。如果您使用'',编译器会抱怨,并会告诉您printf期望const char*作为其第一个参数,而不是char

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

答案 4 :(得分:1)

在c中,$array[$count]['pr'] = $offerta['prezzo']用于字符常量,其中'用于字符串

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

相反,请使用printf('numero');

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