C编程语言通过对字符使用单引号和为字符串使用双引号来区分字符常量和字符串常量。
因此,'c'
是字符c,而"c"
是长度为1的字符串,由单个字符c组成。
为什么要做出这种区分?它有用吗?
另一方面,Python对字符和字符串使用双引号。这两种方法(C和Python)有哪些优点和缺点?
答案 0 :(得分:7)
你说错了
而“c”是长度为1的字符串,由单个字符c
组成
“c”是由两个具有静态存储持续时间的字符组成的字符数组。您可以通过以下方式想象它的定义
char s[] = { 'c', '\0' };
标准C函数strlen
通过搜索终止零并计算终止零之前的字符数来确定字符串文字的长度。
如果字符串文字定义为""
,则字符串文字只能容纳一个字符(终止为零)。对于这个“空”字符串文字函数strlen
将返回值0。
字符整数常量或所谓的字符文字具有类型int
。它们不是与字符串文字相对的字符数组。甚至像例如'AB'
那样的多字节字符常量也会转换为int
类型的对象,并且这种转换是实现定义的。 (在C ++中,由一个字符组成的字符文字具有类型char
,例如sizeof( 'A' )
等于1,而多字节字符文字具有与C中相同的类型int
)
由于字符文字的类型为int
,因此其大小固定且等于sizeof( int )
。
比较这些陈述的输出
printf( "%zu\n", sizeof( 'A' ) );
printf( "%zu\n", sizeof( 'AB' ) );
printf( "%zu\n", sizeof( "A" ) );
printf( "%zu\n", sizeof( "AB" ) );
如果sizeof( int )
等于4,那么你将获得
4
4
2
3
注意:编译器可以为语句
发出警告或错误printf( "%zu\n", sizeof( 'AB' ) );
答案 1 :(得分:7)
使用'c'
将告诉编译器您需要单个字符,而使用"c"
将创建一个空终止字符串(与说{'c', '\0'}
相同),例如,如果您想要修复没有零终止符的字符数组结束字符串你将使用带单引号的字符数组,如果你想要一个零终止的字符数组 - 因此适合在strlen()
中使用,{{1}和其他人你会使用双引号。
答案 2 :(得分:3)
C 是[相对]低级静态类型编程语言。
char c = 'c';
const char* s = "s";
上述语句不仅在文字常量的值上有所不同(c:单字节存储; s:两个字节存储+ 4/8字节指针),而且在变量类型中也是如此(c:单字节,某些算术运算; s:4/8字节指针,不同算术)。
我认为后者的差异更为重要;文字常量可以更容易地使用变量,函数参数,结构成员等。
此外,C中解决的典型问题属于低级性质,您对单个字符和字符串之间的逻辑差异感兴趣。例如gpio,串口,子串搜索算法。
[当然C也用于其他领域,在glib
或enlightenment
等高级项目中,您不太可能看到很多字符与字符串的区别。]
Python 是一种高级动态语言。
c = 'c'
s = "s"
在上面的语句中,locals / labels c
和s
指向对象,并且在运行时动态确定类型。因此,根本不需要区分“字符”和“字符串”。
Python中解决的问题通常要高得多,通常你会处理JSON blob,HTTP请求,数据库查询,虚拟机等;即使您需要处理单个字符,长度为1的字符串也是可接受的近似值。
[如果你使用numpy
或cffi
,你会担心存储字符和字符串,而这些模块提供了这样做的机制。]
答案 3 :(得分:2)
这是他们的设计决定。 “c”是'c'+'\ 0'而'c'只是'c'。大多数字符串操作函数将基于尾随'\ 0'
工作因为你试图将它与python联系起来。在python中,一切都是对象。在python中创建字符串时,此对象还会存储字符串长度以及字符串的字符。所有字符串方法都将使用字符串对象中存在的此长度信息。字符只是python中长度为1的字符串。
由于C是一种非常古老的系统编程语言,它应该在非常低的内存设备上运行,因此它们无法为它们创建的每个字符串创建一个具有长度和其他内容的对象。这是一种记忆浪费。相反,他们使用单个尾随'\ 0'字符来表示字符串