c - 字符串终止符 '\0' 与整数常量 0 的值如何相同?

标签 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;
}

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

输出是

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

此处在 while() 循环中使用了 *pc != '\0' 而不是 *pc != 0

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

最佳答案

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

C 语言允许使用 escapes 插入任意整数(可以放入 char)。有两种方法可以使用 octal 来转义此类任意值。数字,或使用 hexadecimal .例如,A 的 ASCII 值是 65,可以表示为 'A',八进制的 '\101''\x41' 为十六进制,普通65

有了这些信息,应该很容易看出字 rune 字 '\0' 是整数 0 的八进制表示。即,'\0' == 0

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

printf("'\\0' = %d\n", '\0');

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

关于c - 字符串终止符 '\0' 与整数常量 0 的值如何相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47827888/

相关文章:

c - 在 c99 中使用 __thread

java - 如何提示用户直到程序得到有效答案,如何做到N次?

string - [Char] 和 [Word8] 之间转换的最佳方式?

无法使用 ICU 库进行编译 - 对 'u_strlen_3_6' 的 undefined reference

c - 使用 PIC32 的定时器 2 设置延迟

c++ - 如何在 C++ 中将数组中的所有元素初始化为相同的数字

java - HTTP 请求传递要搜索的关键字

如果字符串包含任何单词列表,则 R 每行返回 true 或 false

c - 在嵌入式系统中存储字符数组

javascript - 为什么 Object.keys(this).map(key => (this as any)[key])?