首页 / 资讯中心 / 文章详情

C 语言数据类型与变量详解:从类型长度到操作符的完整入门指南

C 语言数据类型与变量详解:从类型长度到操作符的完整入门指南 ★ FEATURED ARTICLE
目录1. 数据类型的介绍2. 计算类型长度的操作符sizeof3. 数据类型长度4. signed 和 unsigned5. 数据类型的取值范围6. 变量7. 算术操作符、-、*、/、%8. 赋值操作符 和复合赋值9. 单目操作符、–、、-1. 数据类型的介绍C 语言提供了丰富的数据类型来描述生活中的各种数据。使用整型类型来描述整数使用字符类型来描述字符使用浮点型类型来描述小数。正所谓类型就是相似的数据所拥有的共同特征编译器只有知道了数据的类型才知道怎么操作数据。下面开始介绍 C 语言提供的各种类型本章节主要探讨内置数据类型。上面这张思维导图展示了 C 语言的数据类型整体分类分为内置类型和自定义类型两大分支。内置类型是语言自带的基础类型包含字符型、整型、浮点型、布尔类型自定义类型由程序员自己创建包含数组、结构体 struct、枚举 enum、联合体 union。整型//整数 - integer//短整型short[int][signed]short[int]unsignedshort[int]//整型int[signed]intunsignedint//长整型long[int][signed]long[int]unsignedlong[int]//更长的整型//C99中引入longlong[int][signed]longlong[int]unsignedlonglong[int]字符型char//character[signed]char//有符号的unsignedchar//无符号的浮点型floatdoublelongdouble布尔型C 语言原来并没有为布尔值单独设置一个类型而是使用整数 0 表示假非零值表示真。在 C99 中也引入了布尔类型是专门表示真假的。_Bool布尔类型的使用得包含头文件stdbool.h布尔类型变量的取值是true或者false。#includestdbool.hintmain(){_Boolntrue;//后面只能是两个值true/falseif(n)printf(I like c\n);//true表示的是真可以打印出来return0;}每一种数据类型都有自己的长度使用不同的数据类型能够创建出长度不同的变量变量长度的不同存储的数据范围就有所差异。说到了计算长度那么有没有计算各种类型长度的操作符呢2. 计算类型长度的操作符sizeofsizeof是一个关键字也是操作符专门是用来计算操作符数的类型长度的单位是字节。sizeof操作符的操作数可以是类型也可以是变量或者表达式。sizeof(类型)sizeof表达式sizeof的操作数如果不是类型是表达式的时候可以省略掉后边的括号。sizeof后边的表达式是不真实参与运算的类型根据表达式的类型来得出大小。sizeof的计算结果是size_t类型的。3. 数据类型长度//sizeof 计算的结果应该使用%zd来打印intmain(){printf(%zd\n,sizeof(char));//打印的结果是1字节printf(%zd\n,sizeof(int));//打印的结果是4字节printf(%zd\n,sizeof(short));//打印的结果是2字节printf(%zd\n,sizeof(long));//打印的结果是4字节printf(%zd\n,sizeof(longlong));//打印的结果是8字节printf(%zd\n,sizeof(float));//打印的结果是4字节printf(%zd\n,sizeof(double));//打印的结果是8字节printf(%zd\n,sizeof(longdouble));//打印的结果是8字节也有可能是16字节sizeof(long double) sizeof(double)return0;}//单位是字节c语言标准sizeoflong sizeof(int)注sizeof在表达式中不计算因为在代码进行编译的时候就根据表达式的类型确定了而表达式的执行却要在程序运行期间才能执行在编译期间已经将sizeof处理掉了所以在运行期间就不会执行表达式了。4. signed 和 unsignedC 语言使用signed和unsigned关键字修饰字符型和整型类型的。signed关键字表示一个类型带有正负号包含负值unsigned关键字表示该类型不带有正负号只能表示零和正整数。对于int类型默认是带有正负号的也就是说int等同于signed int。由于这是默认情况关键字signed一般都省略不写但是写了也不算错。signedinta;// 等同于int a;int 类型也可以不带正负号只表示非负整数。这时就必须使用关键字unsigned声明变量。unsignedinta;整数变量声明为unsigned的好处是同样长度的内存能够表示的最大整数值增大了一倍。比如16 位的signed short int的取值范围是-32768 ~ 32767最大是 32767而unsigned short int的取值范围是0 ~ 65535最大值增大到了 65,535。32 位的signed int的取值范围可以参看limits.h中给出的定义。unsigned int里面的int可以省略所以上面的变量声明也可以写成下面这样。unsigneda;字符类型char也可以设置signed和unsigned。signedchara;unsignedchara;注意C 语言规定char类型默认是否带有正负号由当前系统决定。这就是说char不等同于signed char它有可能是signed char也有可能是unsigned char。这一点与int不同int就是等同于signed int。5. 数据类型的取值范围上述的数据类型很多尤其整型类型就有short、int、long、long long四种为什么呢其实每一种数据类型有自己的取值范围也就是存储的数值的最大值和最小值的区间有了丰富的类型我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值limits.h文件中说明了整型类型的取值范围float.h这个头文件中说明浮点型类型的取值范围。为了代码的可移植性需要知道某种整数类型的极限值时应该尽量使用这些常量。SCHAR_MINSCHAR_MAXsigned char 的最小值和最大值。SHRT_MINSHRT_MAXshort 的最小值和最大值。INT_MININT_MAXint 的最小值和最大值。LONG_MINLONG_MAXlong 的最小值和最大值。LLONG_MINLLONG_MAXlong long 的最小值和最大值。UCHAR_MAXunsigned char 的最大值。USHRT_MAXunsigned short 的最大值。UINT_MAXunsigned int 的最大值。ULONG_MAXunsigned long 的最大值。ULLONG_MAXunsigned long long 的最大值。6. 变量6.1 变量的创建了解清楚了类型我们使用类型做什么呢类型是用来创建变量的。什么是变量呢C 语言中把经常变化的值称为变量不变的值称为常量。变量创建的语法形式是这样的data_type name;||||数据类型 变量名intage;//整型变量charch;//字符变量doubleweight;//浮点型变量变量在创建的时候就给一个初始值就叫初始化。intage18;charchw;doubleweight48.0;unsignedintheight100;6.2 变量的分类全局变量在大括号外部定义的变量就是全局变量全局变量的使用范围更广整个工程中想使用都是有办法使用的。局部变量在大括号内部定义的变量就是局部变量局部变量的使用范围仅限于其所在的代码块。#includestdio.hinta2023;//全局变量intmain(){intb2018;//局部变量printf(%d\n,a);printf(%d\n,b);return0;}如果局部和全局变量名字相同局部变量优先使用如下#includestdio.hintn1000;intmain(){intn10;printf(%d\n,n);//打印的结果是多少呢return0;}全局变量和局部变量在内存中存储在哪里呢一般我们在学习 C/C 语言的时候我们会关注内存中的三个区域栈区、堆区、静态区。局部变量是放在内存的栈区全局变量是放在内存的静态区堆区是用来动态内存管理的7. 算术操作符、-、*、/、%在写代码时候一定会涉及到计算。C 语言中为了方便运算提供了一系列操作符其中有一组操作符叫算术操作符。分别是、-、*、/、%这些操作符都是双目操作符。注意操作符也被叫做运算符是不同的翻译意思是一样的。7.1 和 -和-用来完成加法和减法的都是有两个操作数位于操作符两端的就是它们的操作数这种操作符也叫双目操作符。/*加法*/intmain(){inta10;intb20;printf(%d\n,ab);return0;}/*减法*/intmain(){inta10;intb20;printf(%d\n,b-a);return0;}7.2 * 和 /运算符*用来完成乘法运算符/用来完成除法。除号的两端如果是整数执行的是整数除法得到的结果也是整数。/* 乘法 */intmain(){intnum15;printf(%d\n,num*4);return0;}/* 除法除号的两端如果是整数计算的是整数的除法不会得到小数得到的是整除后的商 */intmain(){printf(%d\n,8/2);printf(%d\n,6/4);//进行的是整数除法得到的结果是 1商如果想得到1.5就必须要有一个小数而且要用%f来打印如下printf(%f\n,6.0/4);//打印的是1.5%f是用来打印小数的这种打印的方式小数点后默认是6位小数的return0;}//除号两端有浮点数计算的是小数除法上面示例中尽管变量 x 的类型是float浮点数但是6 / 4得到的结果是1.0而不是1.5。原因就在于 C 语言里面的整数除法是整除只会返回整数部分丢弃小数部分。如果希望得到浮点数的结果两个运算数必须至少有一个浮点数这时 C 语言就会进行浮点数除法。7.3 %运算符%表示求模余运算即返回两个整数相除的余值。这个运算符只能用于整数不能用于浮点数。/* % --取模余运算符获得整除后的余数 */intmain(){printf(%d\n,10%3);//10/33...1return0;}负数求模的规则是结果的正负号由第一个运算数的正负号决定。#includestdio.hintmain(){printf(%d\n,11%-5);// 1printf(%d\n,-11%-5);// -1printf(%d\n,-11%5);// -1return0;}8. 赋值操作符 和复合赋值在变量创建的时候给一个初始值叫初始化在变量创建好后再给一个值这叫赋值。/*赋值操作符 是一个随时可以给变量赋值的操作符*/inta100;//初始化a200;//赋值这里使用的就是赋值操作符8.1 连续赋值赋值操作符也可以连续赋值如inta3;intb5;intc0;cba3;//连续赋值从右向左依次赋值建议C 语言虽然支持这种连续赋值但是写出的代码不容易理解建议还是拆开来写这样方便观察代码的执行细节。inta3;intb5;intc0;ba3;cb;//这样写在调试的时候每一次赋值的细节可以很方便地观察/* 赋值和连续赋值 */intmain(){inta0;//初始化a10;//赋值c语言里是从右向左intb3;intc5;cba3;//连续赋值从右向左依次赋值c(ba3);//跟上面的一样的ba3;cb;//拆开写便于观察运算过程比较推荐printf(c %d b %d\n,c,b);return0;}8.2 复合赋值符在写代码时我们经常可能对一个数进行自增、自减的操作如下代码inta10;aa3;aa-2;这样代码 C 语言给提供了更加方便的写法inta10;a3;a-2;C 语言中提供了复合赋值符方便我们编写代码这些赋值符有1-2*/%3//下面的操作符后期讲解45|^赋值的完整代码例子/* 复合赋值 */intmain(){inta3;//a a 5;//a 5;//这种写法跟上面一样这是复合赋值 //a a - 5;//a - 5;//* / %printf(%d\n,a);return0;}9. 单目操作符、- -、、-前面介绍的操作符都是双目操作符有 2 个操作数的。C 语言中还有一些操作符只有一个操作数被称为单目操作符。、--、正、-负就是单目操作符。9.1 和 - -是一种自增的操作符又分为前置和后置- -是一种自减的操作符也分为前置- -和后置- -。在介绍之前看一下完整且正确的代码例子/* 单目操作符 */intmain(){inta5;//a a 1;//a 1;复合赋值//自增1操作符//a; //后置a;//前置printf(%d\n,a);return0;}9.1.1 前置 inta10;intba;printf(a %d b %d\n,a,b);计算口诀先加一后使用。a 原来是 10先 1a 变成 11再使用就是赋值给 bb 得到的也是 11所以计算结束后a 和 b 都是 11相当于这样的代码inta10;aa1;ba;printf(a %d b %d\n,a,b);9.1.2 后置 inta10;intba;//的操作数是a是放在a的后面的就是后置printf(a %d b %d\n,a,b);计算口诀先使用后加 1。a 原来是 10先使用就是先赋值给 bb 得到了 10然后再 1a 就变成了 11所以结束后 a 是 11b 是 10相当于这样的代码inta10;intba;aa1;printf(a %d b %d\n,a,b);完整代码前置 和 后置 的区别/* 前置和后置的区别 */intmain(){inta5;//int b a;//后置先使用后加1 打印结果是6 5//b a, a a 1intba;//前置先加1后使用 打印结果是6 6//a a 1, b aprintf(a %d b %d\n,a,b);return0;}9.1.3 前置 –前置--和上面的前置用法一样只是是加 1而--是减 1。计算口诀先减 1后使用。inta10;intb--a;//--的操作数是a是放在a的前面的就是前置--printf(a%d b%d\n,a,b);//输出的结果是9 99.1.4 后置 –后置--类似于后置只是把加 1 换成了减 1。计算口诀先使用后减 1。inta10;intba--;//--的操作数是a是放在a的后面的就是后置--printf(a%d b%d\n,a,b);//输出的结果是9 109.2 和 -这里的是正号-是负号都是单目操作符。运算符对正负值没有影响是一个完全可以省略的运算符但是写了也不会报错。inta10;//等价于 int a 10;运算符-用来改变一个值的正负号负数的前面加上-就会得到正数正数的前面加上-会得到负数。inta10;intb-a;intc-10;printf(b%d c%d\n,b,c);//这里的b和c都是-10inta-10;intb-a;printf(b%d\n,b);//这里的b是1010. 总结到这里C 语言数据类型与变量的基础内容就梳理完了。回顾一下这条主线数据类型决定了数据在内存中的存储方式与占用空间内置类型包括整型、字符型、浮点型和布尔型自定义类型则有数组、结构体、枚举和联合体。sizeof是计算类型或表达式长度的关键字结果类型为size_t打印时推荐使用%zd。signed与unsigned用来修饰字符型和整型前者带正负号后者只能表示零和正整数同样长度的内存下unsigned能表示的最大值翻倍。取值范围可以通过limits.h和float.h中的常量来查询写可移植代码时应尽量使用这些常量而不是硬编码数字。变量是类型的具体落地分为全局变量静态区和局部变量栈区同名时局部变量优先。操作符方面算术操作符 - * / %要注意整数除法与取模的规则赋值操作符支持连续赋值与复合赋值单目操作符 --则要分清前置与后置的先加后用与先用后加。这些内容看似零散实际上环环相扣类型决定长度长度决定取值范围取值范围又影响我们在实际场景中的类型选择。建议在学完每一节后都动手把示例代码敲一遍尤其是sizeof的打印结果和前置/后置的对比亲手跑一遍比看十遍更有效。基础打牢之后就可以继续往下学习分支与循环语句、函数、数组等内容了。数据类型与变量是后续所有语法的地基值得多花一点时间反复练习。
阅读完成 · 觉得有帮助?
咨询建站