C语言中“文字”'\1'的定义是什么?

kit*_*kat 2 c printf escaping literals format-string

我想知道c语言中字符/文字'\1'的定义。或者更一般地说,'\x' 的定义,其中 Latex{x\in\N} (是自然数 0,1,2,3,4,5,6,...等)

我写这篇文章是为了试图弄清楚它,但我想要一个“权威”的定义。或者更好地如何/在哪里找到这个“权威”定义。这会在c标准中吗?还是依赖于编译器?或者是其他东西?

#include <stdio.h>

int main(void) {
        printf("test###_%c_###test\n", '\0');
        printf("test###_%c_###test\n", '\1');
        printf("test###_%c_###test\n", '\2');
        printf("test###_%c_###test\n", '\3');
        printf("test###_\1\2\3_###test\n");
        // printf("tetest###_\0_###test\n"); ###this will cause a compiler warning
        return 0;
}

Run Code Online (Sandbox Code Playgroud)

注:使用gcc版本编译:gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 无特殊选项(即gcc test.c)

该程序输出以下内容:

test###__###test
test###__###test
test###__###test
test###__###test
test###__###test
Run Code Online (Sandbox Code Playgroud)

我知道 '\0' 是空字符,所以这对我来说很有意义。但下一行似乎也被视为“空字符”,但不完全是。更准确地说,它们似乎只是被忽略了。它们不像空字符那样表示字符串的结尾。例如,在 printf 的格式字符串中取消注释带有 '\0' 的行,并忽略编译器错误,会在 test###_ 处停止行打印,这是有意义的,因为它是字符串的“结尾”。但是如果“\0”被“传递”到格式字符串中,它就会被忽略吗?我是否需要更多地了解 printf 的实现细节才能理解这种 '\0' 行为?

抱歉,我知道这是几个问题合而为一的问题。如果我可以让我的问题更清楚或解释更多,请告诉我。

我尝试了其他“字符”,如“\a”并得到相同的结果,这是因为与“\n”相比,这些“转义”字符是“未知/未定义”,还是其他原因?

dbu*_*ush 5

A\后跟 0 到 7 之间最多三位数字的序列表示字符的八进制代码。

因此,\0值为 0、\1值为 1、\10值为 8。假设采用 ASCII 编码,小于 32 的值是控制字符。