C语言字符变量的一些猜想

今天偶尔碰到这么一个题目:已知c是字符型变量,下面不正确的赋值语句是:(B)

A. c=2+3;     B. c= '2+3'   C.c='\2'+3;  D c='2'+'3'

很明显,答案应该是B,因为该选项没有出现分号,所以不能算一个赋值语句。但是这就完事了吗?

我无聊的时候,上机检测了一下ABCD的四个选项,发现假如B加上了分号以后,也是对的。然后我就百思不得其解,因为其他三个选项都很好说明原因。但是唯独B加了分号后是对的这个我无法理解。然后各种百度都跟我说“经过上机验证,B这种类型的赋值方式肯定是不对的”,但是自己测试的结果告诉我,明显是可以通过编译的。

于是我就在IDE当中就重新为c赋值‘1234’,发现结果是'4',而如果我给c赋值‘12345’,编译器却提示我字符常量中的字符过多。

这个提示引起了我的好奇:首先,为什么字符常量不是字符串也可以有‘1234’这样的值呢?其次,为什么字符变量可以使用‘1234’这样的字符常量来赋值呢?第三,为什么字符常量的长度只能是4个呢?经过若干次测试,我有了如下的猜测,由于没有知识上的支持,所以先记录出来吧,日后看看能否解答。

因为刚好是4个字符,而每一个字符常量的应该都是8bits的,所以,4*8=32,刚好是int类型的长度。所以我就尝试着把'0000'赋给一个整形数,结果发现居然是可以的,并且,编译器还提示了'0000'对应的int类型的数值是多少:

很明显,这就是说把'0000'的四个'0',分别存储到4个字节的空间当中,(00110000)转换成十进制就是48,按照ASCII 的规则,48刚好是字符'0'对应的十进制数。即,'0000'可以用于整形数的赋值,并且本质上,应当可以把'0000'这个字符常量理解成为是一个整形数。如果这么一说,那问题就很好解决了:因为char类型和int类型其实是可以通过隐式或者显式的方式进行类型转换,并且int转char就是把前3个高字节的部分丢弃。

这样就可以解释,为什么字符常量不是字符串也可以有‘1234’这样的值呢?为什么字符变量可以使用‘1234’这样的字符常量来赋值呢?为什么字符常量的长度只能是4个呢?这3个问题了。猜想如下:由于可以把'0000'这样的字符常量看做是int类型,而字符常量本身可以被int类型强制转换,所以把'0000'这样的“int类型数据”赋给字符常量的初值,那就说得过去了,只不过它就选择了最低字节的值而已。既然'0000'这种类型的字符常量本质上也可以看做是int类型的常量,那么自然就不能够超出int类型数据的长度,也就是4字节了,所以最多就是4个字符了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值