C - 引号和撇号之间的差异(“vs”)

时间:2015-09-23 04:55:54

标签: c syntax

在C中,已经注意到这两个指定语法之间存在差异。观察

 char test[5] = {"c", "o", "o", "l", "\0"}; // with quotation

带来错误:

error: (near initialization for 'test')
error: excess elements in char array initializer
error: (near initialization for 'test')
error: excess elements in char array initializer
error: (near initialization for 'test')
error: excess elements in char array initializer
error: (near initialization for 'test')

在哪里

char test[5] = {'c', 'o', 'o', 'l', '\0'}; // with apostrophe

精细编译。造成这种情况的原因是什么?

5 个答案:

答案 0 :(得分:2)

在C中,当您使用单引号时,它表示字符,双引号表示字符串文字。因为你将数组声明为char,所以它不能存储字符串。

答案 1 :(得分:2)

“x”不是字符,它是字符串文字。它与两个字符'x''\0'的数组相同。

我想起来就像这样:

       _ _ _ _ _
"x" => |'x'|'\0'| 
       - - - - -  

答案 2 :(得分:2)

此数组中的元素是字符(每个1个字节):

char test[5] = {'c', 'o', 'o', 'l', '\0'};

这是一个以null结尾的C字符串。它在内存中的表现方式完全相同。它由5个字节组成:字母“cool”和终止空字符:

char test2[5] = {"cool"};

这包含两个字节:

char test3[] = "c";

您的原始示例是一个2字节字符串数组。与前面的示例不同,它实际上是一个2级数组。你必须这样声明:

char *test[] = {"c", "o", "o", "l", "\0"};

答案 3 :(得分:2)

char test[5] = {'c', 'o', 'o', 'l', '\0'}; // with apostrophe

是正确的语法,因为正如您声明的那样,test是一个可以存储5个字符的字符数组。

char * test [5] = {" c"," o"," o"," l",&#34 ; \ 0"}; //带引号

这是可以接受的,因为你声明测试是一个指向字符串的指针数组。

在ideone.com中运行以下代码并查看。

#include <stdio.h>

int main(void) {
// your code goes here

char* teststring[5] = {"c", "o", "o", "l", "\0"}; // with quotation

char testchar[5] = {'c', 'o', 'o', 'l', '\0'};
printf("%s\n", teststring[2]);

printf("%c\n", testchar[2]);

return 0;
}

答案 4 :(得分:1)

在C中,

两个单引号'用于表示字符常量 两个双引号"用于表示字符串文字。

字符常量只能代表一个字符。 'ab'不是有效的字符常量。

字符串文字可以包含多个字符。