C语言中的数据类型和变量以及简单的操作符
文章目录
前言
本文将围绕C语言中的多种数据类型,变量和简单的操作符进行介绍,并结合自己的学习过程中的疑惑,来帮助大家更好的理解其内容。本文适用于VS2022,x64配置。
数据类型
C语言中的数据类型可以分为内置类型和自定义类型,其包含的数据类型如图。本文将介绍内置类型中的四种数据类型:字符型、整型、浮点型、布尔类型。自定义类型的数据会在之后讲解。
字符型
字符型变量用 char
来定义,存储大小为1个字节,取值范围为 -128 到 127 或 0 到 255(字符型数据可以分为signed
和unsigned
,分别对应两者的取值范围,文章后面会介绍signed
和susigned
)。
整型
整型变量用int
来定义,存储大小为4个字节,取值范围为 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647(同上)。
整型数据还可以分为短整型、整型、长整型、更长的整型。
浮点型
浮点型变量用float
来定义,存储大小为4个字节,取值范围为1.2E-38 到 3.4E+38。
浮点型数据还可以分为浮点型、双精度浮点型、拓展精度浮点型。
float
类型的数据默认输出6位小数。
C语言中的小数在没有规定数据类型的情况下,会默认为是double
类型。
布尔类型
布尔类型变量用bool
来定义,存储大小为1个字节,取值是:true
或者false
布尔类型的使⽤需要包含头⽂件 <stdbool.h>
布尔类型的数据常用在循环或分支的判断条件中
signed
和unsigned
signed
和unsigned
是两个关键字,用来修饰整型
和字符型
数据或变量。
signed
表示该类型带有正负号,包含负值
unsigned
表示该类型不带负号,只能表示零或正值
对于int
类型来说,默认是带负号的,所以int
等同于signed int
,signed
一般可以省略
如果想表示非负整型,则必须声明unsigned int
,不能省略unsigned
,但是可以省略int
整型数变量声明为unsigned
的好处是,同样⻓度的内存能够表示的最⼤整数值,增大了⼀倍。(如上)
对于char
类型来说,char
类型默认是否带有正负号,由当前系统决定。
所以char
不等同于signed char
,它有可能是signed char
,也有可能是unsigned char
判断数据类型的大小/长度
sizeof的介绍
可以使用sizeof
操作符来计算操作符、变量或表达式的长度,单位是字节。
sizeof
不仅仅是操作符,同时也是关键字。
sizeof
的操作数如果不是类型,是表达式的时候,可以省略掉后边括号。
sizeof
后边的表达式不真实参与运算,根据表达式的类型来得出大小。
sizeof
的计算结果是 size_t 类型,打印时使用%zd
#include<stdio.h>
int main()
{
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
printf("%zd\n", sizeof(int)); //sizeof可以判断数据类型的大小
printf("%zd\n", sizeof(3 + 3.5)); //sizeof可以判断表达式的大小
//sizeof中的表达式不参与运算,在计算 3+3.5 的大小时,
//由于表达式为 整型+双精度浮点型 ,所以结果应该为双精度浮点型
//所以sizeof会计算双精度浮点型数据的大小
return 0;
}
上述代码的输出结果为:4 4 4 8
下面通过一个例子来证明sizeof
中的表达式不计算
//证明:sizeof中表达式不计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));//sizeof根据最终数据会放进变量s中,而s是短整型数据,所以输出2
printf("s = %d\n", s);//如果s仍为2,则表达式未计算,如果s值变为11,则表达式计算。实际输出为2
return 0;
}
上述代码输出结果为:2 s = 2
计算各种数据类型的大小/长度
#include <stdio.h>
#include<stdbool.h>
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool)); //或sizeof(bool)或sizeof(true)
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}
上述代码的输出结果为:1 1 2 4 4 8 4 8 8
变量
变量的创建
知道了数据类型,我们就可以创建变量,因为C语言中创建变量时必须指定变量的类型
变量创建的语法形式如下:
data_type name;
| |
| |
数据类型 变量名
如果在变量创建的时候就给定一个初始值,称为初始化。
变量的分类
变量分为局部变量和全局变量。
局部变量存储在内存的栈区,全局变量存储在内存的静态区。
在大括号内定义的变量就是局部变量,在大括号外定义的变量就是全局变量。
局部变量和全局变量的名字可以相同,使用时局部变量优先。
#include <stdio.h>
int a = 2023;//全局变量
int main()
{
int a = 2018;//局部变量
printf("%d\n", a);
return 0;
}
上述代码的输出结果为:2018
算术操作符
算术操作符包括:+ - * / % 分别为加、减、乘、除、取余
算术操作符都是双目操作符
对于+ - * /来说,如果两个操作数都是整型,则结果为整型,如果想得到浮点型数据,则至少要有一个操作数为浮点型。
取余 % 只能用于两个整数
赋值操作符
C语言中支持连续赋值和复合赋值
如:连续赋值
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。
这样的操作语法上是没有问题的,但是比较乱,不便于调试,所以一般还是分开赋值,连续赋值用的不多。
如:复合赋值
int a = 10;
a += 3; // 等价于 a=a+3
a -= 2; // 等价于 a=a-2
支持符合赋值的复合赋值符还有:
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些以后再介绍,涉及到二进制
单目操作符
单目操作符就是只有一个操作数的操作符
单目操作符包括:++
--
+
-
++
和 --
自增操作符和自减操作符,每次运行后会把操作数据+1
或-1
分为前置和后置,前置先自增(自减),后使用;后置先使用,再自增(自减)
前置:
int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
上述代码的运行结果为:a=11 b=11
后置:
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
上述代码的运行结果为:a=11 b=10
+
和-
这里的+
和-
不是加减,而是正负
`+``一般可以省略
结语
本来还想再介绍一些自己的错例的,不过看了看都不是什么很大的问题,大家如果遇到了应该也能解决,所以就先不写了。等学到后面如果我遇到一些易错点或我认为比较重要或容易搞错的地方,我会在介绍完知识点后,在文章最后给大家看一看,这一章就到这里吧。