C - 引号和撇号之间的区别 (" vs ')
C - Difference between quotation and apostrophe ( " vs ' )
在 C 中,注意到这两种指定语法之间存在差异。观察
char test[5] = {"c", "o", "o", "l", "[=10=]"}; // 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', '[=12=]'}; // with apostrophe
编译得很好。这是什么原因?
在 C 中,当您使用单引号时,它表示一个字符,双引号表示字符串文字。并且由于您将数组声明为 char 因此它不能在其中存储字符串。
"x" 不是一个字符,它是一个字符串文字。它与两个字符 'x'
和 '[=12=]'
的数组相同。
我是这样想的:
_ _ _ _ _
"x" => |'x'|'[=10=]'|
- - - - -
这个数组中的元素是个字符(每个1字节):
char test[5] = {'c', 'o', 'o', 'l', '[=10=]'};
这是一个以 null 结尾的 C 字符串。它在内存中的表示方式完全相同。它正好由 5 个字节组成:字母 "cool" 和终止空字符:
char test2[5] = {"cool"};
这由两个字节组成:
char test3[] = "c";
您的原始示例是一个 2 字节字符串数组。与前面的示例不同,它实际上是一个 2 级数组。您必须这样声明它:
char *test[] = {"c", "o", "o", "l", "[=13=]"};
char test[5] = {'c', 'o', 'o', 'l', '[=10=]'}; // with apostrophe
是正确的语法,因为正如您声明的那样,test 是一个字符数组,可以存储 5 个字符。
char* test[5] = {"c", "o", "o", "l", "\0"}; // 带引号
这是可以接受的,因为您声明测试是一个指向字符串的指针数组。
运行下面的代码在ideone.com里看。
#include <stdio.h>
int main(void) {
// your code goes here
char* teststring[5] = {"c", "o", "o", "l", "[=11=]"}; // with quotation
char testchar[5] = {'c', 'o', 'o', 'l', '[=11=]'};
printf("%s\n", teststring[2]);
printf("%c\n", testchar[2]);
return 0;
}
在 C 中,
两个单引号,'
,用来表示一个字符常量。
两个双引号 "
用于表示字符串文字。
一个字符常量只能表示一个字符。 'ab'
不是有效的字符常量。
一个字符串文字可以包含多个字符。
在 C 中,注意到这两种指定语法之间存在差异。观察
char test[5] = {"c", "o", "o", "l", "[=10=]"}; // 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', '[=12=]'}; // with apostrophe
编译得很好。这是什么原因?
在 C 中,当您使用单引号时,它表示一个字符,双引号表示字符串文字。并且由于您将数组声明为 char 因此它不能在其中存储字符串。
"x" 不是一个字符,它是一个字符串文字。它与两个字符 'x'
和 '[=12=]'
的数组相同。
我是这样想的:
_ _ _ _ _
"x" => |'x'|'[=10=]'|
- - - - -
这个数组中的元素是个字符(每个1字节):
char test[5] = {'c', 'o', 'o', 'l', '[=10=]'};
这是一个以 null 结尾的 C 字符串。它在内存中的表示方式完全相同。它正好由 5 个字节组成:字母 "cool" 和终止空字符:
char test2[5] = {"cool"};
这由两个字节组成:
char test3[] = "c";
您的原始示例是一个 2 字节字符串数组。与前面的示例不同,它实际上是一个 2 级数组。您必须这样声明它:
char *test[] = {"c", "o", "o", "l", "[=13=]"};
char test[5] = {'c', 'o', 'o', 'l', '[=10=]'}; // with apostrophe
是正确的语法,因为正如您声明的那样,test 是一个字符数组,可以存储 5 个字符。
char* test[5] = {"c", "o", "o", "l", "\0"}; // 带引号
这是可以接受的,因为您声明测试是一个指向字符串的指针数组。
运行下面的代码在ideone.com里看。
#include <stdio.h>
int main(void) {
// your code goes here
char* teststring[5] = {"c", "o", "o", "l", "[=11=]"}; // with quotation
char testchar[5] = {'c', 'o', 'o', 'l', '[=11=]'};
printf("%s\n", teststring[2]);
printf("%c\n", testchar[2]);
return 0;
}
在 C 中,
两个单引号,'
,用来表示一个字符常量。
两个双引号 "
用于表示字符串文字。
一个字符常量只能表示一个字符。 'ab'
不是有效的字符常量。
一个字符串文字可以包含多个字符。