初识c语言:字符常量用int储存,整型常量用char储存会怎样

本文探讨了C语言中常量与变量的区别,特别是整型字符常量的存储行为。通过sizeof和printf函数解析,解释了字符常量在不同情况下的字节占用,以及整型提升和截断的概念。同时介绍了左值和右值的区别,为初学者解答了C语言基础疑惑。
摘要由CSDN通过智能技术生成

2024年1月4日

上一个月,基本在准备期末考试,就没怎么写博客,现在考完了重头,开始我的第一篇c语言博客

2024年2月17日回来修改。

类似于'a','?'等字符常量用int类型来储存会发生什么,又为什么会这样?整型用char呢

现在就让我们来学习一下(学习c语言不久,主要以printf函数的打印结果为依据,如有考虑不周或错误的地方,还望大佬指正):

一、常量与变量

1.常量

常量,是一种在程序中保持类型和值不变的数据,按照类型有以下几种常量:整型常量,实型常,字符常量,字符串常量,枚举常量。作为初学者,我们先尤其关注字符常量和整型常量。

整型自然不必说,我们要尤其注意的是整型字符常量‘a’。sizeof是作为计算所占字节的关键字,通过sizeof可以更好的帮助我们理解'a'.

// 小心, char和'a'在被=动作前, 是两个独立类型, 没关联
char c = 'a';  
printf("%ld", sizeof(c));      // 结果:1, char类型是1字节
printf("%ld", sizeof('a');    // C结果:4,C++结果:1
                               // C99的标准,    'a'是整型字符常量,常量!常量!常量!被看成是int型, 所以占4字节。
                               // ISO C++的标准,'a'是字符字面量  ,被看成是char型,所以占1字节。
 

2.变量

变量命名不能以数字开头,不能是关键字,严格区分大小写。

因此一个a可能表示一个变量,也有可能表示一个字符,或是表示一个整型的97,最后也有可能是未定义标识符。其中,当a表示变量时,其实在编译时,代表的是一个地址。我们通过打印字符串才能更好的理解。

char a[] = {'a','b','c'};
printf("%s",a);     // 打印abc
printf("%c",a[0]):  //  打印a

其实,最根本的还是printf的函数的参数类型

类型合格的输入参数的类型
%a、%A读入一个浮点值(仅 C99 有效)。float *
%c单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。char *
%d十进制整数:数字前面的 + 或 - 号是可选的。int *
%e、%E、%f、%F、%g、%G浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4float *
%i读入十进制,八进制,十六进制整数 。int *
%o八进制整数。int *
%s字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。char *
%u无符号的十进制整数。unsigned int *
%x、%X十六进制整数。int *
%p读入一个指针 。
%[]扫描字符集合 。
%%读 % 符号。

我们可以看到大多参数类型都是指针,也就是说,参数要求的就是一个char*的指针了,代表的肯定是地址。 

二,截断与整型提升

所谓截断,就是int类型你用char来储存时,由于char是一个字节,而int是int类型,舍弃掉高字节,只保留低字节的数据就是截断。

所谓整型提升,就是char类型你用int类型来储存时,由于高字节缺少数据,就会在高字节中自动补充数据,无符号数直接补0,有符号数补充符号数的0或1(二进制)

整型常量97的值自然是他本身,对于整型字符常量的值'97','9m!'等,请参考从二进制和内存的底层来探究同一数据在不同类型下的调用-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qiulingfeng123/article/details/135407395?spm=1001.2014.3001.5502

第一发的,原来想删的,想了一下,留个纪念。

1.int a = 97;最基础的,打印结果大家应该都能理解

2.int a = ’97‘;

’97‘为int类型时,7对应的ASCII值为55,9对应的是57,即%d=14647,%c时表达的是字符,一个字符一个字节,取值是256,由于1个字节存储不了那么多信息,计算机只能保留刚读写的7,’7‘对应的ASCII值是55,又对应回来,自然打印的就是字符7了

’97‘对应的值为55+57*256=14647,相当于是256进制的运算,再比如'6f!'的值为33+102*256+54*256*256=3565089,由于一个字节是-128~127,256个数字,故进制为256

3.char a = 97;97为char类型时,数字仍然是97,字符为’a‘,与int一致。但其实又不一样,如当char a = 14674时,表示将’97‘赋值给char a,由上截断,%d=55,%c=7

4.char a = ’97‘,与3.char a = 14674,同理

5与6以及综上所述:int,char与%d,%c,类似,将数字或字符传给他时,int——%d——数字,char——%c——字符,

三.左值右值问题

1.左值

左值是一个表示数据的表达式,比如:变量名、解引用的指针变量。一般地,我们可以获取它的地址对它赋值,但被 const 修饰后的左值,不能给它赋值,但是仍然可以取它的地址。

总体而言,可以取地址的对象就是左值。初学者理解为变量即可。

2.右值

右值也是一个表示数据的表达式,比如:字面常量、表达式返回值,传值返回函数的返回值(是传值返回,而非传引用返回)右值不能出现在赋值符号的左边且不能取地址

总体而言,不可以取地址的对象就是右值。初学者就理解成表达式就行了。

好了,以上就是我分享的有关c语言学习中可能会遇到的困惑,希望能够帮助到大家。谢谢 

  • 37
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值