literal constants

最近在工作中引出了一个问题,我需要模拟一个read函数的缓冲区然后将其复制出来转换成string类型显示,我是这么做的:

char a[]={1,2,3,4};

int size=sizeof(a)/sizeof(int);

QSring str=QString::fromLoacl8Bit(a,size);

但是这么做str却显示为空串,我以为是转换过程有问题,但是换了好几种转换方法都是这样,究竟是什么原因?

 

先回答下面几个问题再说:

char a[]="12";
char a[]={1,2};
char a[]="/x01/x02";
char a[]={'1','2'};
char a[]={'1','2','/0'};

以上几种表达方式,有什么区别?

 

前两种怎么看都一样,两个元素,分别是1和2,但是他们的确是不一样的,前者是字符常量,后者是数值常量,在内存中,前者是50,51(1,2的ACSII码),后者才是真正的1,2。我的问题就是出在字符常量和数值常量的混淆上

 

第三种需要注意,因为使用了转义字符,/x跟的数字表示十六进制的数字,/x01表示ASCII码的1,/x02表示ASCII的码的2,还有一个容易忽略的地方就是双引号(“”),如果我用的是大括号({})那是什么情况?情况很复杂,首先反斜杠不能出现在这里,其次,编译器会告诉你x未定义,balabala~~~~,能想出这种方式初始化的人,真的比我还迷糊。

 

第四种方式跟第一种一样,完全一样……完全一样吗?很明显不一样,第一种是字符串,最后有个字符串的结尾符 ‘/0’,其长度是3,不是2

 

第五种才跟第一种一样,没问题,这次真的一样

 

到这个时候我才发现语法不是没学过,而是不知道他怎么用,对C的理解太肤浅,在c中字面值很常见,也很基础,下面总结一下:

 

C中,字面值是一种用来描述整数,小数,字符,字符串的记号,字面值的值决定了他的类型

 

整数常量:一般都是我们常见的二进制,十进制,八进制,和十六进制数字

十进制数字不能以0开头,否则会被认为是八进制,比如047就是一个八进制的数字,以0x或者0X开头的是十六进制的数字

整数常量一般都是int型,如果int不能表示其范围,就会升格为long型,或者longlong型,支持后缀,u,U(unsigned)和l,L(long)

 

浮点常量:一般都是十进制或者十六进制数字,带小数点,也可以使用科学计数法:10.0,  2.34E5,  67e-17, 小数点可以是第一个也可以是最后一个字符:10.   或  .234E6都是合法的,浮点数默认是double,而不是float,可以使用后缀 f 或者 l 表示float或者long

顺便提一下:float数占4个字节,精确度6位数字,double占8个字节,精确度15位数字(精确度都不包括小数点)

 

字符常量:字符常量可以包含一个或者多个字符,用单引号围起来。例如:‘a’,‘xy’,‘0’之类的,所有的源代码字符集都可以表示在字符常量中,但是单引号(‘)反斜线(/),和换行(/n)是例外,因为他的们表示需要转义字符(/)

字符常量默认是int类型,除非前置L,表示宽字符,一个字符常量包含一个可以用单字节表示的字符,那么他的值就是运行字符集中的该字符的ASCII码,比如'a'=ASCII码的97,如果包含多个以上的字符,比如’xy‘,那么在不同的编译器中解释将不同。除非你确切的知道你在干什么,否则不要这么定义。

转义字符:以反斜线开始,表示特殊的字符,下面是一些常见到转义字符表:

单引号:    /'   

双引号:    /"

问号:       /?

反斜线:    //

 

“/xhhh”  hhh是十六进制的数字,表示这个数字在ASCII中对应的字符

“/o、/oo、/ooo”(o为任意一个八进制字符),同上,只不过换成八进制

八进制              十六进制                  描述

  '/0'                   '/x0'                    空字符

'/033'或'/33'       '/x1b'                  ESC符(ASCII:27)

 

字符串字面值常量:一连串的字符,用双引号围起来,同字符常量一样,字符串字面值可以包含源代码字符集中除了特殊字符之外的任意字符,字符串字面值说白了就是一串静态的字符数组,内部包含字符码(ASCII)最后跟一个空字符码('0')结尾,空字符也占用一个字节

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值