1. 数据类型
计算机中运行的程序是为了解决现实世界中的问题,因此撰写程序的代码也必须拥有描述现实事物的能力,比如数字、文字,又比如人的年龄、商品的价格等。
为了实现这种能力,C语言拥有一套类型系统:
- char:字符数据类型。
- short:短整型。
- int:整型,即integer,用于存储整数(包括正负)。
- long:长整型。
- long long:更长的整型。
- float:单精度浮点数,即float-point,可以存储较大的数值,并且可以带小数位。
- double:双精度浮点数。
注:float(和double)进行算术运算时会比int类型慢。且float类型的变量存储的数值往往只是实际数值的一个近似值,如存进0.1,会得到0.099 999 999 999 999 87,这是舍入造成的误差。float类型的数值通常分为两部分存储:小数部分(或称尾数部分)和指数部分。如12.0就可以以1.5×2^3的形式存储,其中1.5是小数部分,而3是指数部分。有些编程语言将其称为real类型。
并且每种类型都在存储的空间中占有一定的大小,我们可以用sizeof
这个操作符来计算类型或变量所占空间的大小。
printf("%d\n", sizeof(char)); // 1
printf("%d\n", sizeof(short)); // 2
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(long)); // 4 C语言标准:sizeof(long) >= sizeof(int)
printf("%d\n", sizeof(long long)); // 8
printf("%d\n", sizeof(float)); // 4
printf("%d\n", sizeof(double)); // 8
注意,char
类型指的是如a、b这样的字符;而不是Hello world这样的字符串。
C语言有没有字符串类型呢?答案是没有,但实际的使用中是存在的,因为可以用一连串的字符来组成一个字符串,可以将其理解为字符的数组。
字符一般用单引号''
括起来,而字符串则用双引号""
括起来。
注1:上面说的类型的大小是以字节为单位的。
注2:在计算机存储中有如下单位及其换算:
- bit - 比特位
- byte - 字节 == 8 bit
- kb - 千字节 == 1024 byte
- mb - 兆字节 == 1024 kb
- gb - 千兆字节 == 1024 mb
- tb - 太字节 == 1024 gb
- pb - 拍字节 == 1024tb
2. 变量和常量
刚刚提到sizeof
可以计算变量的大小,变量是个什么样的概念呢?
在数学题中,我们经常会见到未知数x,在不同的题目x可以被直接赋值,也可以被计算出来再赋值。变量与之含义类似。
我们再思考一下,在现实世界中,有许多数据是不可变的,比如一个人的血型,比如圆周率。但与此同时,有些数据却是不断改变的,比如一个人从出生后不断增长的年龄,又比如一座工厂每年的产量。
在C语言中也有描述这样的变与不变的数据的概念,即变量和常量,它们的功能便是存储数据。
变量和常量同样有自己的数据类型,类型会影响变量的存储方式以及允许对变量进行的操作。
1.变量的分类
C语言中有两种变量,分别是全局变量和局部变量。
简单理解的话,全局变量是在{}
外部定义的,整个工程都能够使用它;而局部变量是在{}
内部定义的,只能在{}
内部使用——但实际上只能在单独的.c文件里使用的静态变量也算是局部变量的一种。
当全局变量与局部变量的名字冲突时,局部优先,但一般不建议把全局变量和局部变量的名字设成相同的。
使用变量前需要先进行声明(为编译器所做的描述),一般流程是指定变量类型,陈述变量名(也称标识符identifier,变量名由程序员自定义)。
//写一个代码求2个整数的和
int main()
{
int a = 0;
int b = 0;
int sum = 0;
scanf("%d %d", &a, &b); //scanf函数是与printf对应的输入函数,f同样是format的意思
//双引号中的格式串用于指定输入的格式
//&运算符是用于读取其后变量的地址的,后续会做更多解释
sum = a + b;
printf("sum = %d\n", sum); return 0;
}
注1:当报错
'scanf': This fu