admin管理员组文章数量:1794759
详解C语言的数据类型和变量(上)
1.数据类型介绍
在讲数据类型之前,先探讨一下,为什么会用数据类型这个东西的存在?
C语言作为一门编译型的计算机语言,而计算机语言是被我们用来编写出程序,去命令计算机帮助我们完成特定任务。而这个特定任务必然是我们在日常生活中所面临到的一些难题。那我们有问题需要交给计算机解决,那是不是得把问题描述给计算机听,就像人与人之间的对话一样。而这个问题以及问题解决步骤的描述,就得用到计算机语言中的数据类型。我想这就是数据类型存在的理由之一。
C语言给我们提供了丰富的数据类型来描述生活中的各种数据。
代码语言:javascript代码运行次数:0运行复制//举个例子
//如果不懂什么叫做变量的读者,别着急,后面会讲解。这里感知数据类型的存在即可
int score; //用int类型(整型)来描述“成绩”这个变量
char ch; //用char类型(字符型)来描述“ch”这个变量
float average; //用float类型(浮点数类型)来描述“average”这个变量
使用整型类型来描述整数,使用字符类型来描述字符,使用浮点数类型来描述小数。 所谓的“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据类型,才能懂得如何操作接下来的数据。
C语言中的类型分为内置类型和自定义类型,本节主要解决C语言数据类型中的内置类型。
1.1 字符型
代码语言:javascript代码运行次数:0运行复制//字符类型
char //由character这个单词演变过来的
[signed] char //有符号的
unsigned char //无符号的
注:[]里面的内容可以省略的。其实就是,char 与 signed char一个意思。 如果读者们还未学到 signed 和 unsigned这两个关键字是什么意思,可以先掠过这个知识点(后面会详细讲解这两个关键字的作用)。 这里你只需要了解到“如果我想描述一个字符,就得用char(字符型)”
1.2 整型
代码语言:javascript代码运行次数:0运行复制注:在你的IDE(集成开发环境)编写C语言时,[]里面的内容可以省略的。
//短整型
short [int]
[signed] short int //有符号的
unsigned short int //无符号的
//整型
int
[signed] int //有符号的
unsigned int //无符号的
//长整型
long [int]
[signed] long [int] //有符号的
unsigned long [int] //无符号的
//更长的整型
//在C99中引入的。之前版本的编译器是不支持此类型的。
long long [int]
[signed] long long [int] //有符号的
unsigned long long [int] //无符号的
1.3 浮点型
代码语言:javascript代码运行次数:0运行复制float //单精度浮点型
double //双精度浮点型
long double //长双精度浮点型
这里为了解决读者心中的一些疑惑,解释一下单精度与双精度浮点型的一些差别。
在计算机底层,浮点数的存储方式有一个标准,这个标准是由IEEE来规定的。顾名思义,双精度肯定是要比单精度的小数点后位数更多的。换句话说,双精度类型更适合一些对精度要求严格场景,但这不是我们不使用它的原因,在日常的开发中,double和float类型是非常常用的。
1.4 布尔类型
C语言本来是没有布尔类型的。在没有布尔类型之前,在C语言内部是以“0”表示“假”,“非0”表示“真”。 在C99中,布尔类型就被使用了,功能:专门表示真假的。
代码语言:javascript代码运行次数:0运行复制_Bool //布尔类型
读者们在使用布尔类型时,一定要包含头文件<stdbool.h>。
为了让读者们加强对头文件<stdbool.h>的包含。下面,对包含<stdbool.h>简要解释(主要目的是,别忘了包含头文件!!!)。 解释:在上面讲过,布尔类型是在C99中引入的,那是不是就意味着在C语言创建之初,就没有想到过,把布尔类型作为C语言的数据类型(但现在是了)。那既然是创建之初没有的,是后面才引入,那我们使用它时,肯定不能像int、char、float、double这样,因为它们在C语言创建之初就被造出来了。为此,它需要一个媒介融入到这个数据类型的大家庭中,而这个媒介正是头文件<stdbool.h>。
相信解释到这里,读者们在使用布尔类型时就不会忘记包含头文件这件事了。
加强对布尔类型的理解: 下面这幅图是头文件<stdbool.h>里面的部分内容:
有一定的C语言基础的读者,不难看出_Bool也可以写成bool。同时在这里可以清晰地看到“0”代表“false”, “1”代表“true”。其实实际上,只要是“非0”都可以表示“true”,只不过在C语言编译器上为了统一,都将“真”用“1” 来表示。希望读者能理解这个逻辑。
代码演示:
在上述的例子,就展示布尔类型的魅力了。当然,希望读者们能用试试为“flag = 0"或者是非0时,会出现什么情况。(动手才是编程的正解!!!)
2.各种数据类型的长度
在上面我们讲到了整型、字符型、浮点类型以及布尔类型,并分别讲了它们的应用场景、使用格式以及一些需要注意的点。那这个小节,我将带大家学习数据类型更加基础的东西——数据长度。
为了在计算机描述生活中的问题,数据类型的正确使用是关键。那么,我们无限制的使用数据类型吗? 答案肯定是不行的,每个人都有极限,更何况是计算机呢!
那为什么是会是样子呢? 请看图解:
如果我们无限地占用内存空间,那总有一天内存会被我们占满的,那为什么会出现这种情况呢? 原因是数据类型是有大小的。用官方的语言来说,数据类型是有长度的。
相信读到这里,你会对数据长度有一定的认知了!
每一种数据类型都有自己的长度,使用不同的数据类型,能够在内存中创建不同的空间以容纳这些不同数据长度。变更量的长度不同存储的数据范围就会有所差异。
2.1 sizeof操作符
sizeof是一个关键字,也是操作符,是专门用来计算sizeof的操作符的数据类型长度的,单位是字节。 sizeof的操作数可以是类型,也可以是变量或者表达式。
代码语言:javascript代码运行次数:0运行复制sizeof(类型)
sizeof 表达式
使用sizeof的小tips:
- sizeof 的操作数如果不是类型,是表达式的时候,可以省略后面的括号。
- sizeof 后面的表达式是不参与运算的,根据表达式的类型得出来的大小(也就是,“=”左边变量的类型大小)。
- sizeof 的计算结果是 size_t 类型的。
代码演示:
可以看到,打印的时候我在printf 函数用的占位符是%zd而不是%d,原因是sizeof 的返回值是size_t类型。 如果强行使用%d打印,编译器会发出警报,当仍会输出正确的结果。
2.2 数据类型的长度
在x64的环境下:
在x86的环境下:
2.3 sizeof 中的表达式不计算
再次说明这个点。sizeof在代码编译时,就根据表达式的类型确定计算结果了。而表达式执行却要在程序运行期间才能运行,在编译期间已经将sizeof 给处理掉了,所以运行期间就不会执行表达式的值。
代码语言:javascript代码运行次数:0运行复制也就是说明了,sizeof 语句执行的顺序是高于其括号里面表达式的执行顺序,而且sizeof 是执行在编译时期的,当执行完后,sizeof 就会被嘎掉。当进入到执行时期,编译器根本就找不到sizeof 这个东西了,那自然就执行不了过好里面的表达式了,因为已经找不到了。
//测试:sizeof中表达式不计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 66;
printf("%d\n", sizeof(s = b+1));
printf("s = %d\n", s);
return 0;
}
读者可自行测试这段代码。
3.小结
在本次,我们讲了数据类型、数据类型的长度以及如何查看数据类型的长度。
- 数据类型的种类、使用、实际意义
- 数据类型长度的重要性
- 数据长度的大小 – sizeof 运算符
剩下的知识,会在详解C语言的数据类型和变量(下)中继续分享给大家!
望大家能够
- 支持
- 转发
- 有讲的不好的地方希望能够指正。
本文标签: 详解C语言的数据类型和变量(上)
版权声明:本文标题:详解C语言的数据类型和变量(上) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1754772599a1706219.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论