r.b*_*waj 3 c octal number-systems
在给定的程序中:
int main() {
char *p = "\0777";
printf("%d %d %d\n",p[0],p[1],p[2]);
printf("--%c-- --%c-- --%c--\n",p[0],p[1],p[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它显示输出为:
63 55 0
--?-- --7-- ----
我可以理解它正在将\0 (\077)之后的前两个字符从八进制转换为十进制,但是谁能解释我为什么是 2 个字符,为什么不是 1 或 3 或任何其他字符?
请解释这背后的逻辑。
这就是语言定义八进制转义序列的方式。
八进制转义序列可以是字符常量或字符串文字的一部分,由\后跟 1、2 或 3 个八进制数字 ( '0'.. '7') 组成。
在 中"\07777",反斜杠后跟 3 个八进制数字 (0, 7, 7),表示具有077八进制或63十进制值的字符。在 ASCII 或 ASCII 派生的编码中,它恰好是一个问号'?'。
所以字面量代表一个长度为3的字符串,由'?', '7', '7' 组成。
但你的问题一定有错别字。当我运行你的程序时,我得到的输出是:
63 55 55
--?-- --7-- --7--
Run Code Online (Sandbox Code Playgroud)
如果我将声明更改p为
char *p = "\0777";
Run Code Online (Sandbox Code Playgroud)
我得到你描述的输出。请注意,最后一个----实际上是两个连字符,后跟一个空字符,然后是两个连字符。如果您使用的是类 Unix 系统,请尝试通过cat -v或管道传输程序的输出cat -A。
当您发布代码时,复制并粘贴它而不是重新输入它非常重要。
(你错过了#include <stdio.h>顶部的。)
char *p = "\07777";
Run Code Online (Sandbox Code Playgroud)
这里分配给指向字符的指针的字符串文字。
"\07777"
Run Code Online (Sandbox Code Playgroud)
在这个字符串中使用了文字八进制转义序列,所以前三位数字代表一个八进制数。因为八进制转义序列的规则是——
您只能在八进制转义序列中使用数字 0 到 7。八进制转义序列的长度永远不能超过三位数,并以第一个不是八进制数字的字符结尾。尽管您不需要使用所有三位数字,但您必须至少使用一位。例如,ASCII 退格字符的八进制表示为 \10,字母 A 的八进制表示为 \101,如 ASCII 图表所示。
所以你的字符串文字存储在内存中
第一个字节是八进制数 077,它只是十进制的 63 和“?” 在性格上
第 2 个和第 3 个字节分别作为字符 '7' 和 '7'
最后是一个终止字符 '\0' 。
所以你的答案是字符串文字的第 1、2、3d 字节。
有关更多解释,您可以访问此网站
http://msdn.microsoft.com/en-us/library/edsza5ck.aspx