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.12e4 | float * |
%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博客https://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语言学习中可能会遇到的困惑,希望能够帮助到大家。谢谢