字符串终结符'\ 0'如何与整数常量0具有相同的值?

Sur*_*raj 1 c arrays string null language-lawyer

我有以下代码 -

#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;
}
Run Code Online (Sandbox Code Playgroud)

它是使用字符串的多个间接的示例.

输出是

Z e r o 
O n e 
T w o 
T h r e e 
F o u r 
Run Code Online (Sandbox Code Playgroud)

在这里,在while()环代替*pc != '\0',*pc != 0被使用.

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

Som*_*ude 6

A char实际上只是一个小整数,因此可以隐式转换为int.此外字符文字(如例如'A')真的由编译器所表示int的值(例如,文字字符'A'由表示int65ASCII编码).

C语言允许char使用转义插入任意整数(可以适合a ).有两种方法可以使用八进制数或使用十六进制来转义此类任意值.例如,对于A中的ASCII值65,可以表示为任一'A','\101'八进制,'\x41'十六进制,平原65.

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

您可以通过打印轻松验证:

printf("'\\0' = %d\n", '\0');
Run Code Online (Sandbox Code Playgroud)

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


Lun*_*din 6

换行符\n,制表符\t等都有自己的转义序列字符,但实际上没有一个用于null终止符.

因此,代表空终止符的行业事实上的标准方法是写入值为零八进制转义序列.八进制转义序列定义为\后跟数字.所以\0简单地表示零,八进制表示.由于这与其他字符转义序列类似,因此它已成为表示空终止符的事实上的标准方式.

这就是为什么小数0一样好,它只是写零值的另一种方式.\x0如果你想要模糊,你也可以写.