文章目录
数据类型
(了解一下就行了,后面会慢慢讲)
-
基本数据类型:最主要的特点是其值不可以再分解为其他类型。
-
构造数据类型:是根据已定义的一个或多个数据类型用构造的方法来定义的数据类型。一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。
-
指针类型:是一种特殊的数据类型,其值用来表示某个变量在内存储器中的地址。
-
空类型:在调用函数时,通常应向调用者返回一个函数值。这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明。但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型”,其类型说明符为void。
-
定义类型:自定义数据类型就是用户可以随时在程序中自行定义新的数据类型。
1.标识符
在C语言中,所谓标识符,是指用来标识程序中用到的变量名、函数名、类型名、数组名、文件名及符号常量名等的有效字符序列。
标识符的命名规则是:由字母、数字及下划线组成,且第一个字符必须是字母或下划线。
(和第一节的定义变量,的变量名差不多)
例题
下面的标识符名是合法的:
name , x1 , _name , NAME
标识符名不合法的:
3s //以数字开头 s*t //出现非法字符 -3x //以减号开头 bowy-1 //出现非法字符-(减号)
(1)C语言不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受具体机器的限制。例如,在有些版本中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中,大小写是有区别的。例如,标识符name、Name和NAME分别表示3个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于阅读及理解。
关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。
关键字还分为几类:
(1)类型说明符:用于定义变量、函数或其他数据结构的类型,如程序中用于定义变量的int,double等。
(2)语句定义符:用于表示一个语句的功能,如程序中常用到的if,else( 就是条件语句定义符。
(3)预处理命令字:用于表示一个预处理命令,如程序开头用到的include。
(先了解一下,后面会慢慢学习)
2. 常量和变量
对于基本数据类型变量,按其取值是否可改变又分为常量和变量。
在程序执行过程中,值不发生改变的量称为常量,其值可变的量称为变量。
它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量等。
例如
int a=10;
int b;
int c=0;
a是个整型常量
b,c是整型变量
1.常量
常量又可以分为以下两种:
(1)直接常量:
整型常量:16,0,-1;
实型常量:4.6,-1.23;
字符常量:‘a’,b’。
(2)符号常量:用标识符代表一个常量。在C语言中,可以用一个标识符来表示一个常量,称为符号常量。
符号型常量在使用之前必须先定义,其一般形式为;
#define 标识量 常量
其中“#define”是一条预处理命令,称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代表该常量值。
符号常量的值是不能改变的,也不能被重新赋值。
例如
打印 PI
#include<stdio.h>//编译预处理指令
#define PI 3.14159//预定义符号常量
int main()
{
printf("%f\n", PI);//输出
return 0;
}
“#define”预处理命令定义了一个符号常量PI,它的值为3.14159,此后凡在本文件中出现的PI都代表3.14159。
2. 变量
变量可以按数据类型进行分类,如整型变量、浮点型变量、字符型变量等。
每个变量都有一个名字,这个名字称为变量名。变量名必须是合法的C语言标识符,它代表了某个存储空间及其所存储的数据,这个空间所存储的数据称为该变量的值。
变量声明的一般格式为:
类型说明符 变量 名标识符
例如
int a;
进行定义变量时,应注意以下几点:
(1)允许在一个类型标识符后说明多个相同类型的变量,各变量名之间用逗号隔开,具体格式为:
(2)类型说明符与变量名之间至少用一个空格隔开。
(3)最后一个变量名之后必须以“;”结尾。
(4)变量说明必须放在变量使用之前,一般放在函数体的开始部分。
例如
int a,b,c,d ;
例题
#include <stdio.h >
int main()
{
int m;//定义变量
m = 30;//给变量m赋值
printf("the first value is:%d\n", m);//输出此时m的值
m = -16;//给变量m赋值
printf("the second value is:%d\n", m);//输出此时m的值
return 0;
}
3.整型类型
1. 整型数据在内存中的存储形式
在内存中存储整型数据时,一般以其最高位(即最左边一位)表示数据的符号,以0表示正,以1表示负。
数值是用补码形式存放的,一个正数的补码就是该数的二进制数。一个负数的补码是由该数绝对数的二进制数按位取反后加后加1得到。
正整数的原码、反码、补码一样
例如
-1的补码可以求解如下:
(1)先取该数的绝对值1。
(2)然后以二进制数的形式表示,-1的二进制码为
100000000000000000000000000000001 原码
(3)再对其按位取反——反码
11111111111111111111111111111110
(4)然后加1得-10的补码为
11111111111111111111111111111111
即-1的16位存储形式为
11111111111111111111111111111111.
2. 整型常量
整型常量就是整常数。在C语言中,使用的整常数有十进制、八进制和十六进制3种。
(1)十进制整数,如16,-275。
(2)八进制整数。C语言中八进制以数字0开头,只能用0~7这8个数字组合表达,如
0154对应的十进制数为1×8²+5×8¹+4×8º=108
(3)十六进制整数。C语言中十六进制以Ox或0X开头,只能用0~9这十个数字及字母A~F组合表达。其中,A代表数值10,B代表数值11,(在十六进制中,字母A~F可以使用大写形式,也可以使用a~f小写形式。)依此类推。例如,
Ox15F对应的十进制数为1×16²+5×16¹+15×16°=351
3.整型变量
整型变量可分为以下几类:
(1)基本型:类型说明符为int,在内存中占4个字节。
(2)短整型:类型说明符为short int或short,在内存中占2个字节。
(3)长整型:类型说明符为long int或long,在内存中占4个字节。
(4)无符号型:类型说明符为unsigned,无符号型又可与上述3种类型匹配而构成:
1.无符号基本型,类型说明符为unsigned int或unsigned;
2.无符号短整型,类型说明符为unsigned short;
3 无符号长整型,类型说明符为unsigned long。
各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。各类整型量所分配的内存字节数及数的表示范围如
计算各类整型量所分配的内存字节
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
4.整型变量的定义
整型变量可按照变量定义格式进行定义,例如:
int a,b,c; //a,b,c为整型变量 long x,y; //x,y 为长整型变量 unsigned p,q; //p,q为无符号整型变量
整型变量的定义和使用
例如
#include <stdio.h>
int main()
{
int a = 100;//定义变量,变量赋值
int b = 200;
int sum;
sum = a + b;//计算
printf("sun=%d\n", sum);//输出
return 0;
}
各种整型变量都有其特定的表示范围,当一个数据超出了其类型所
能表示的范围时,称为数据溢出。例如,一个short int型变量的最大允许值为32767,如果再加1,则会出现数据溢出。
例题
整型数据的溢出。
#include <stdio.h>//编译预处理指令
int main()
{
short int a, b;//定义短整型变量
a = 32767;
b = a + 1;//计算
printf("%d,%d\n", a, b);//输出
return 0;
}
分析程序可知,变量a在内存中的存储为01111111 11111111,加1后变成1000000000000000,而这个数是-32768的补码形式,所以输出变量的值为-32768。因为一个短整型变量只能容纳-32768~32767范围内的数,无法表示大于32767的数。遇此情况就发生溢出,但运行时并不报错。它好像汽车的里程表一样,达到最大值以后,又从最小值开始计数。所以,32767加1得不到32768,而得到-32768。
本程序中将变量a和b改成long型,并按“%d”格式输出,就可以得到预期的结果32768。
4. 实型数据
1.实型常量的表示方法
实型数据也称为浮点型数据,是带有小数点或指数符号的数值数据。在C语言中,实型数据的表示只采用十进制形式。它有两种形式:十进制小数形式和指数形式。
(1)十进制小数形式:由数码0~9和小数点组成。例如:0.0,25.0,5.789,0.13,5.0,300.,-267.8230等均为合法的实数。注意,必须有小数点。
(2)指数形式:由十进制数、阶码标志e或E及阶码(只能为整数,可以带符号)组成。其一般形式为:
a E n (a为十进制,n为十进制整数)
其值为a*10ⁿ
例如
2.1E5(等于2.110⁵)
-3.7E-4(等于-3.710¯²)
以下不是合法的实数:
E7(阶码标志E之前无数字)
53.-E3(负号位置不对)
2.7E(无阶码)
C语言允许浮点数使用后缀。后缀为f或F即表示该数为浮点数。例如,42.f和42.是等价的。
例如
输入一个实型数据。
#include <stdio.h>//编译预处理指令
int main()
{
printf("%f\n", 42.f);//输出42.f
printf("%f\n", 42.);//输出42.
return 0;
}
2. 实型数据在内存中的存放形式
一个实型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分分别存放。
例如,实数3.14159在内存中的存放形式如图
图中是用十进制数来示意的,实际上在计算机中是用二进制数来表示小数部分以及用2的幂次来表示指数部分的。
在4个字节中,究竟用多少位来表示小数部分,多少位来表示指数部分,C语言并无具体规定,而由各C编译系统自定。不少C编译系统以24位表示小数部分(包括符号),以8位表示指数部分(包括指数的符号)。小数部分占的位数越多,数据的有效数字越多,精度越高。指数部分占的位数越多,则能表示的数值范围越大。
3. 实型变量
实型变量按其数值范围大小和精度不同分成以下3种。
(1)单精度型;用float标记。
(2)双精度型:用double标记。
(3)长双精度型:用long double标记。
各类实型量所占内存字节数及数的表示范围如表
一个实型常量可以赋给一个单精度型和双精度型变量,根据变量的类型截取实型常量中相应的有效位数字。
例如
a已指定为单精度实型变量:
float a;
a=12345.6789;
由于float型变量只能接收7位有效数字,因此最后两位小数不起作用,为无效数字。
如果a改为double 型,则能全部接收上述9位数字并存储在变量a中,因为double型数据的有效位为16位。但同时Turbo C规定小数后最多保留六位,其余部分四舍五入。
例题
实型数据的舍入误差
#include <stdio.h>//编译预处理指令
int main()
{
float a;//定义单精度型变量a
double b;//定义双精度型变量b
a = 12345.6789;//赋值
b = 3.33333333333333333;//赋值
printf("a=%f\n", a);//输出a的值
printf("b=%f\n", b);//输出b的值
return 0;
}
5.字符型数据
1.字符常量
对于可显示的字符常量可用单引号直接括起来,且单引号中只能有单个字符。
例如:a’、b’、=’、’+’、?都是合法字符常量。
它们在内存中各占一个字节,存放该字符的ASCII码值,同时也可用字符的ASCII码值表示字符。
例如,十进制数85表示大写字母U’,八进制数0102表示大写字母B’,如’x’的十进制ASCII码是120,'y的十进制ASCII码是121。
ASCII表如图
字符‘8’和整数 8是不同的概念,字符“8’只代表一个符号,在内存中以ASCII码(对应ASCII码值为56)形式存储,而整数8在内存中存储的就是数值8.
例如
对字符变量a,b赋予’x’和y’值的代码为:
a=‘x’;
b=‘y’;
实际上是在a,b两个单元内存放120和121的二进制代码:
a:01111000
b:01111001
因此,字符常量也可以看成是整型量。C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。
但必须注意的是,整型量为两字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。
例题
向字符变量赋以整数。
#include <stdio.h>//编译预处理指令
int main()
{
char a, b;//定义字符
a = 120;//赋值
b = 121;
printf("%c,%c\n", a, b);//按字符常量输出
printf("%d,%d\n", a, b);//按整型量输出
return 0;
}
本程序中定义a,b为字符型,但在赋值语句中赋了整型值。从结果看,a,b值的输出形式取决于printf)函数格式串中的格式符,当格式符为“%c”时,对应输出的变量值为字符;当格式符为“%d”时,对应输出的变量值为整数。
对于不能显示的字符(主要指控制字符,如回车符、换行符、制表符等)和一些在C 语言中有特殊含义和用途的字符(如单引号、双引号、反斜杠线等),只能用转义字符表示。
转义字符是一种特殊的字符常量,以反斜杠线“\”开头,后面跟一个或几个字符。转义字符具有特定的含义,它不同于字符原有的意义,所以称转义字符。常用的转义字符及其含义如表
实际上,任何一个字符都可以用转义字符/ddd或/xhh来表示,ddd和hh分别为八进制和十六进制的ASCII码。
例如,\101’(8进制转换为十进制为65)表示字母’A’
"134’(8进制转换为十进制为92,可以早ASCII码表找到)表示右斜杠
“X0A”(16进制转换为十进制为10)表示换行等。
在C语言中,字符常量有以下特点:
(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符,不能是字符串。
(3)C语言对字符型和整型是不加区分的,字符型常量被视为1字节的整数,其值就是该字符的ASCII码,可以像整数一样参加数值运算。例如,‘C的ASCII码为67,'C-2的值为65,即字符’A’的ASCII码。
例题
字符常量的使用。
#include <stdio.h>//编译预处理指令
int main()
{
//c的ASCII码为99
//a的ASCII码为97
printf("%d\n",'c' - 2);//输出'c'-2的整型形式
printf("%c\n", 'c'-2);//输出'c'-2的字符常量
return 0;
}
例题
转义字符的使用。
#include <stdio.h>//编译预处理指令
int main()
{
printf("a\tb\nc");//输出
return 0;
}
程序中没有定义字符变量,用printf函数直接输出双引号内的各个字符。
首先输出字符a,然后遇到“\t”,它的作用是跳格,即跳到下一个制表位置,在我们所用系统中,一个制表区占8列,所以字符b在字符a后面的第8列输出。
接下来遇到“\n”,它的作用是使当前位置移到下一行的开头,所以字符c在下一行的开头输出。
2. 字符变量
字符变量用来存储字符常量,即单个字符。
字符变量的类型说明符是char,字符变量
类型定义的格式和书写规则都与整型变量相同。
例如:
char c1,c2;
表示cl和c2为字符型变量,各可以存放一个字符。因此,可以用下面语句对c1和c2赋值:
cl=‘a’;
c2=‘b’;
3. 字符串常量
C语言除了允许使用字符常量外,还允许使用字符串常量。
字符串常量是一对双引号括起来的字符序列。例如,“I am a student”,“WORD”,“a”,"¥100.10"都是字符串常量。可以用printf函数输出一个字符串,例如:
printf(“I am a student”);
字符串常量在机器内存储时,系统自动在字符串的末尾加一个“字符串结束标志”,它是转义字符“\0”。
例如,字符串"hello”在内存中存储为:
即字符串在存储时要多占用一个字节以存储“\0”。
注意
字符’A’和字符串"A”是不同的。C语言中规定字符串必须有结束标志"\0’(其ASCII值为0)。因此,字符串"A"实际上包含两个字符:‘A’与\O’,占2个字节,而字符’A’只占1个字节。