我们上一篇介绍了C语言的HelloWorld,和C语言算是互相认识了,这篇我们继续对C语言进行了解。
数据类型
任何一门计算机编程语言都是以数据为中心的,因为程序就是要进行计算的。为了能够表示多种不同的数据,c语言提供了以下三种常用的基本数据类型:
- 整型,就是整数
- 浮点型,就是小数
- 字符型,就是文本符号
常量与变量
在C语言中使用的数据按照是否可以修改,分为两大类:常量与变量。
常量
常量就是固定不变的数据,根据类型有以下四种:
- 整型常量:所有整数(正整数,负整数,零)。
如:100,12345,-123,02
- 浮点型常量:所有小数。
如:3.14,0.233
- 字符常量:普通字符,用单引号括起来的一个字符。(不包括单引号本身)
如:’A','1'
- 字符串常量:用双引号括起来的若干个字符串。(不包括双引号本身)
如:”hello World"
变量
变量呢,形象的说,是一块能够装数据的小房子,不过大家都是成年人了,本着探求本质的精神来说,变量就是块有名字的内存空间。我们可以通过变量的名字来为其背后的内存空间填充数据,或者使用内存空间中的数据进行计算。
如何定义变量呢?就是如下的形式:
变量类型 变量名= 初始值;
例如下面的代码
int main(void)
{
int nNum = 10;
nNum = 200;
printf("%d",nNum=100);
}
其中int就是整数类型,nNum就是变量名,10就是变量的初始值。变量可以被修改,可以参与运算。当变量被定义之后,自动就开辟出了空间,变量名代表这个片空间了。
对于变量来说, 有各种各样的数据类型, 根据数据的不同,开辟的内存空间也不同。例如刚才的代码,定义一个int型的变量,那么编译器会为他开辟4个字节的空间。(int类型占4个字节)
变量类型
变量的类型有很多中,根据数据类型大致可以分为三大类:
- 整数:
int short long
- 小数:
float double
- 字符:
char wchar_t
另外还有一个关键字: unsi gned可以修饰整数和字符,可以表示无符号数(就是正数)。下面是不同变量类型的取值范围:
项目 | 价格 | 数量 | 取值范围 |
---|---|---|---|
char | 1 | 8 | -128~127 |
unsigned char | 1 | 8 | 0~255 |
short [int] | 2 | 16 | -32768~32767 |
unsigned short [int] | 2 | 16 | 0~65535 |
int | 4 | 32 | -2147483648~2147483647 |
unsigned [int] | 4 | 32 | 0~4296947295 |
long[int] | 4 | 32 | -2147483648~2147483647 |
unsigned long[int] | 4 | 32 | 0~4296947295 |
long long [int] | 8 | 64 | -9223372036854775808~-9223372036854775807 |
unsigned long long [int] | 8 | 64 | 0~18446744073709551615 |
float | 4 | 32 | 7位十进制有效数字±(3.4*10^(-38)~3.4*10^38) |
double | 8 | 64 | 16位十进制有效数字±(1,7*10^(-308)~3.4*10^308) |
变量类型的选用
在编写c语言代码的时候,经常会面临定义变量的时候该选用什么类型。比如,存储一个人的年龄,应该选int还是short等问题。一般原则如下:
- 如果没有特殊需要,整数一般采用int类型,它是每个C系统里的最基本类型,必定能得到硬件的基本支持。
- 如果没有特殊需要,浮点数一般采用double类型,因为它的精度和表示范围能满足-般要求。
- 如果没有特殊需要,字符一般采用char 类型。对于特殊字符使用wchar_ t。
字符类型概述
开始之前,先在心中问自己一个问题: 1 和''1'是一个东西吗?
字符类型本质上来说,也是数字。这是必然,因为计算机只能存储数字嘛。有一个美国国家标准协会指定了一个标准,用0~127之间的数字代表不同的字符。所以每一个字符都和一个数字一一对应的。美国人制定的这个标准称之为ASCII。
一个字节能表示 0 255,所以存储一个普通的英文字符只需要一个字节,故而char也就是1个字节大小。
悲催的是,由于编程语言是歪果人发明的,使用广泛的ASCII表中也就没有非英文使用国家的文字字符。比如像我们中国,汉字字符好几万。于是新的编码规范应运而生,就像我们常见的unicode。
在我们这里,wchar _t 就是用来存储复杂字符的,而且他是两个字节,共有65536个状态,基本就够用了。
现在我们就能够回答刚才的问题了,1 就是数字1,而字符‘1’就可以看成ASCII十进制的49。
字符型数据变量
定义char
型字符变量,直接使用char
即可,赋值的单字符需要用''
起来
char ch = 'A'; //这个字符占用1字节
定义wchar _t
型字符变量,直接使用wchar_t
,需要注意的是字符要用这种格式L'':
wchar_t ch = L'A';//这个字符占2字节。
字符型与数字
字符类型与整数类型没有本质的区别,都表示数字,只是,字符类型所能表示的数字被人为设计成与不同的字符一一对应。所以字符类型的变量也可以用于数学计算,只是它表示的数据范围很有限。有符 号的情况下(char -128 127, wchar_ t -32768 32767)
。
字符串
C语言中还有一种类型叫做字符串常量, 但是没有一个变量能够存储字符串常量。需要借助于字符数组或指针,这个我们后面再讲。
字符串的表示方式:使用双引号扩起来例如: char szCh[] = "adfadf4546545";
关于常量、变量、赋值问题
常量就是不可以改变的量
变量是背后有一块内存,变量名代表那一块空间,我们使用&符号能够得到变量的地址。
关于赋值符号的左值和右值。
对于一个变量来说,放在赋值左边的时候,使用的是背后内存,放在右边的时候,使用的是内存中的数值。
int main()
{
int a = 0;
int b = 0;
a = 100;//复制符号左边的量,需要有内存
//左边使用的也是内存
b = a; //右边,只要有数值就可以了。
//100 = a;//错误 左边如果是一个常量是不行的,
//因为常量背后没有内存
return 0;
}
关于赋值时的类型转换
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 10;
short b = 0;
a = b;
int c = 100;
short d = 20;
d = c;
int e = 65538;
short f = 0;
f = e; //这里丢失数据了
return 0;
}
我们在赋值的时候,如果赋值符号左右两边的类型不一致,会自动的将右边的类型,给转换为左边的类型,然后再赋值。这个叫做隐式转换。
缺点就是,当右边的类型范围大,左边的类型范围小的时候,有可能会丢失数据。
关于显式类型转换
#include <stdlib.h>
int main()
{
double a = 3.14;
int b = 0;
b = (int)a;
//当我明确知道他俩类型不一样的时候,应该写显示转换,表示我是故意这么做的。
return 0;
}
标识符
编程的时候,我们经常会碰到需要命名的对象。比如函数名,变量名,这些名字都叫做标识符。
标识符也有一套自己的命名规则,规则如下:
- 只能由字母
(A~Z,a~z)
、数字(0~9)
、下划线(_)
组成。例如:int $abc = 0,!cde = 0;
错误!- 数字不能开头,例如:
int 2abc = 0,345num = 1;
错误!- 不可以使用关键字,例如:
int if = 0,for = 1;
错误!- C语言中的标识符区分大小写,例如:
int nNum = 0;int nnum = 1
正确,为两个不同的变量正确的标识符名称
abcd、NumberA、_2019、alexsel123
关于运算符
算数运算符+ - * / % ++ --
需要注意的:
/ 在C语言中,两个整数相除,得到的只能是整数
如果要得到小数部分,应该有浮点数参与运算
- % 是取模, 进行运算的数,只能是整数
- ++ 自增 自己增加1
-- 自减 自己减小1
课后练习
1. 交换两个数的值
交换两个变量a和b的值 int a = 5;
int b = 6;
交换后,a等于6,b等于5
int main()
{
int a = 5;
int b = 6;
int c = 0;
c = a;
a = b;
b = c;
return 0;
}
不使用中间变量方式
int main()
{
int a = 5;
int b = 6;
a = a + b;
b = a - b;
a = a - b;
return 0;
}
2.从键盘获取两个数,输出和
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数");
scanf_s("%d %d",&a,&b);
printf("%d", a + b);
return 0;
}
3.从控制台中接收一个字符
int main()
{
int a = 0;
int b = 0;
char m = 0;
printf("请输入两个数");
scanf_s("%d %d",&a,&b);
printf("%d", a + b);
printf("请输入一个字符");
scanf_s("%c", &m);//去掉缓冲区中的回车
scanf_s("%c", &m);
printf("获取到的字符为%c",m);
return 0;
}