c语言 - 字符串终止符''的值与整数常量 0 的值如何?



我有以下代码 -

#include <stdio.h>
#define LENGTH 5
int main(){
char* ch[LENGTH] = {"Zero", "One", "Two", "Three", "Four"};
char* pc;
char** ppc;
for(int i=0; i<LENGTH; i++){
ppc = ch+i;
pc = *ppc;
while(*pc != 0){
printf("%c ", *pc);
pc = pc +1;
}
printf("n");
}
return 0;
}

这是使用字符串进行多个间接寻址的示例。

输出为

Z e r o 
O n e 
T w o 
T h r e e 
F o u r 

在循环中while()而不是*pc != '',使用*pc != 0

但这两种方法给出相同的输出。为什么会这样?

char实际上只不过是一个小整数,因此可以隐式转换为int。此外,字符文字(例如'A') 实际上由编译器表示为int值(例如,文字字符'A'由 ASCII 编码中65int值表示)。

C语言允许人们使用转义插入任意整数(可以放入char)。有两种方法可以转义此类任意值:使用八进制数或使用十六进制。例如,A 的 ASCII 值是65,可以表示为'A''101'八进制、'x41'十六进制65

有了这些信息,应该很容易看出字符文字''是整数0的八进制表示形式。也就是说,'' == 0.

您可以通过打印它轻松验证这一点:

printf("'\0' = %dn", '');

我提到编译器将所有字符文字视为int值,但也提到使用转义的八进制或十六进制数的任意数字需要适合char。这似乎是一个矛盾,但事实并非如此。字符值必须适合char,但编译器在解析代码时会在内部将其转换为int

换行n、制表符t等都有自己的转义序列字符,但实际上不存在空终止符。

因此,重新发送空终止符的行业事实上的标准方法是编写值为零的八进制转义序列。八进制转义序列定义为后跟一个数字。所以只是意味着零,带有八进制表示。由于这看起来与其他字符转义序列相似,因此它已成为表示 null 终止符的事实上的标准方式。

这就是为什么十进制0同样有效,它只是写值零的另一种方式。如果你想晦涩难懂,你也可以写x0

0''是完全相同的值,在C中,都是int类型。这是由 C 标准修复的,并且与平台上的字符编码无关。换句话说,它们是完全无法区分的。(在C++中,''的类型是char

所以while(*pc != 0)while(*pc != '')while(*pc)都是一回事。

(就我个人而言,我发现最后一个我给出的是最清楚的,但有些人喜欢在处理 C 样式字符串时使用''符号。

在现有答案的基础上,查看哨兵,引用C11,第 §5.2.1 章

在字符常量或字符串文本中,执行字符集的成员应为 由源字符集的相应成员或转义表示 由反斜杠后跟一个或多个字符组成的序列。一个字节 所有设置为 0 的位(称为空字符)应存在于基本执行字符集中;它 用于终止字符串。

以及第 §6.4.4.4/P12 章,

示例 1 构造''通常用于表示空字符。

因此,恒定是满足上述属性的恒定。这是一个八进制转义序列

现在,关于值,引用§6.4.4.4/P5,(强调我的)

八进

制转义序列中反斜杠后面的八进制数字被视为一部分 整数字符常量的单个字符或单个字符的构造 宽字符为宽字符常量。八进制整数的数值,所以 形成 指定所需字符或宽字符的值。

因此,对于八进制转义序列'',该值为0(嗯,八进制,如 §6.4.4.1 中所述,和十进制)。

相关内容

  • 没有找到相关文章

最新更新