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”相比,这些“转义”字符是“未知/未定义”,还是其他原因?