我正在尝试执行以下程序.
#?include? "stdio.h"
#include "string.h"
void main()
{
char c='\08';
printf("%d",c);
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出56.但对于除此之外的任何数字8,输出都是数字本身,但8答案是56.
有人可以解释一下吗?
Mar*_*oun 18
与开头的字符\0代表八进制数,是基-8号系统,并使用该数字0 to 7.因此\08是无效的表示八进制数,因为8∉[0,7] ,因此,你要实现定义的行为.
也许你的编译器识别多字节字符 '\08'作为'\0' 一个字符,而'8'另一个并解释为'\08'为'\0'+ '8'这使得它'8'.查看ASCII表后,您会注意到十进制值为'8'56.
感谢@DarkDust,@ GrijeshChauhan和@EricPostpischil.
该值'\08'被认为是一个多字符常量,由\0(计算结果为0)和ASCII字符8(计算结果为十进制数56)组成.如何解释是实现定义的.C99标准说:
整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.包含多个字符(例如,'ab')的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的.如果整数字符常量包含单个字符或转义序列,则其值是当char类型的对象(单值字符或转义序列的值)转换为int类型时生成的值.
因此,如果您要分配'\08'比a更大的东西char,比如int或long,它甚至会有效.但是,既然你把它分配给char你"切断"某些部分.哪个部分可能还依赖于实现/机器.在你的情况下,碰巧给你的值8(ASCII字符,其值为56).
GCC和Clang都用"警告:多字符字符常量"来警告这个问题.
| 归档时间: |
|
| 查看次数: |
843 次 |
| 最近记录: |