GCC中printf八进制转义字符解析疑问:为何\1011输出A1?
问题描述
给出如下C代码:
#include <stdio.h> int main() { printf("\101\102\103\104\105\12"); return 0; }
在GCC编译器中执行后,输出结果为ABCDE。但将printf的参数改为"\1011\102\103\104\105\12"时,输出结果变为A1BCDE,请问该现象的原因是什么?
原因解析
这是由C语言中八进制转义字符的解析规则导致的:
- 八进制转义序列以反斜杠
\开头,后续可跟随1到3个八进制数字(即0-7范围内的字符)。 - 编译器解析时,会从
\开始尽可能多地读取连续的八进制数字,但最多读取3位;如果遇到非八进制数字,会立即停止当前转义序列的解析,剩余字符按普通文本处理。
在修改后的字符串"\1011\102..."中:
- 开头的
\1011被拆分为两部分处理:- 前三位
101是合法八进制数字,对应十进制65,即ASCII字符A; - 第四个字符
1属于普通字符,直接输出;
- 前三位
- 后续的
\102、\103等仍按正常八进制转义规则解析,分别对应B、C等字符。
最终拼接输出结果就是A1BCDE。
内容的提问来源于stack exchange,提问作者Baranitharan
相关产品推荐
相关产品推荐

