c - 为什么八进制序列 '\0101' 不等于十进制 65?
问题描述
考虑这个 C 程序:
unsigned char c2 = '\0101';
printf("%c, %d\n", c2, c2);
我相信输出应该是:A 65但实际输出是1 49。
推理: 0 作为字符常量中的前缀以八进制格式声明,101 的八进制值是 65。那么 65 对应的 ASCII 值是 A。有人能告诉我哪里出错了吗?我尝试了与 '\x41' 相同的十六进制代码,它给出了所需的输出。
解决方案
八进制格式字符的转义序列是一个反斜杠,后跟最多三位数字,这意味着最后一个数字不是转义序列的一部分。这在C 标准关于“字符常量”的第 6.4.4.4p1 节中指定:
octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit
所以'\0101'
实际上是一个多字节字符常量:第一个是\010
值 8,第二个是字符'1'
。
前导0
用于指定数字八进制常量,而不是字符八进制常量,因此在这种情况下您不需要前导 0:
unsigned char c2 = '\101';
如果您确实想使用数字八进制常量,您可以这样做:
unsigned char c2 = 0101;
推荐阅读
- azure - 访问 Azure 资源上的个人用户
- java - 如何使用 selenium 和 java 中的属性搜索元素
- xpath - XPATH 获取 glyphicon glyphicon-star
- sql - Oracle sql 检查模式的依赖关系
- regex - Ansible 从 stdout 行提取子字符串导致空字符串
- batch-file - 一个人可以通过 GOTO 传递一个变量,还是可以一个 CALL 但结束而没有返回?
- python - 从 Mega.nz 存档中抓取文本(Python)
- c# - 在 MySQL 数据库上运行迁移时出现实体框架错误。“空间/全文/哈希索引和显式索引顺序的错误使用”
- java - java命令行,无法从代码中检索命令行参数
- python - python3 kivy BoxLayout 超过另一个