"和"之间的差异

-6 c

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

printf('numero');
Run Code Online (Sandbox Code Playgroud)

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

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

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

Iha*_*imi 6

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

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

例:

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

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

例:

char A = 'A'; /* the ascii value of 'A', 0x41 or 65 decimal */
Run Code Online (Sandbox Code Playgroud)

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


hac*_*cks 5

''用于字符常量和""字符串,不像,两者可以互换使用。

  • 不仅仅是python,许多其他高级语言都有这个错误……对不起,我的意思是,功能。我知道证明这一点的唯一原因是,如果将其中一种 qoute 类型与另一种一起包装,则不需要转义其中一种,这是一个很好的理由吗? (3认同)
  • @iharob 我认为原因是这些语言没有单个字符的类型,只有字符串。那么为什么不使用单引号呢? (3认同)

Vla*_*cow 5

字符文字和字符串文字之间有区别。

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

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

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

char s[2] = { 'A', '\0' };
Run Code Online (Sandbox Code Playgroud)

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

char s[2] = { 'A', '\0' };
char *p = s;
Run Code Online (Sandbox Code Playgroud)

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

例如

printf( "A" );
Run Code Online (Sandbox Code Playgroud)

与...相同

printf( p );
Run Code Online (Sandbox Code Playgroud)

其中p定义如上所示。

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

printf( 'A' );
Run Code Online (Sandbox Code Playgroud)

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