C 程序设计教程(03)—— C 语言的数据类型(一):基本数据类型
一、数据类型简介
C 语言提供了丰富的数据类型,每一个常量和变量必须属于某一种数据类型。C 语言中的数据类型如下:
(1)基本类型:整型(int),字符型(char),实型(单精度型:float,双精度型:double)
(2)构造类型:数组类型,结构体类型,共用体类型
(3)指针类型
(4)空类型
C 语言有 4 种基本数据类型,分别是:整型,字符型,单精度型和双精度型。基本类型的前面可以使用修饰符,常用的修饰符如下:
signed(有符号的)
unsigned(无符号的)
long(长型)
short(短型)
二、常量和变量
1、常量
C 语言中的常量是不能被程序修改的固定值,常量可以是任意数据类型。如下表所示:
数据类型 | 常量举例 |
---|---|
char | ‘a’、‘\n’、‘8’ |
int | 21、123、-120、1258 |
long int | 35000、-125870 |
short int | 10、-25、32 |
unsigned int | 1000、888、52 |
float | 125.85、4.2e-4 |
double | 120.65、-12.58、2587.658 |
2、符号常量
C 语言允许将程序中的常量定义为一个标识符,称为符号常量。符号常量一般使用大写英文字母表示,符号常量在使用前必须先定义,定义的格式如下:
#define <符号常量名> <常量>
例如:
#define PAI 3.1415926
#define TRUE 1
#define FALSE 0
说明:#define 是 C 语言的预处理命令,表示定义的符号常量在程序运行前将由其对应的常量替换。
定义符号常量的目的是为了提高程序的可读性,便于程序的调试和修改。因此在定义符号常量名时,应使其尽可能表达它所代表的常量的含义。
此外,若要对一个程序中多次使用的符号常量的值进行修改,只需要对预处理命令中定义的常量值进行修改。
3、变量
其值可以被程序改变的量称为变量。一个变量应该有一个名字(标识符),表示内存中的某个存储单元,在该存储单元中存放变量的值。
所有的变量在使用之前必须定义。定义变量的格式如下:
type 变量列表;
type 必须是有效的数据类型,变量列表可以由一个或多个由逗号分隔的多个标识符构成。例如:
int i,j;
short int s,t;
unsigned int u;
double salary;
三、基本数据类型
1、整型
(1)整型常量
整型常量可以是十进制、八进制和十六进制。默认为十进制,八进制常量以 0 开头(比如:017),十六进制常量以 0x 开头(比如 0x1a)。
在一个常数的后面加上字母 l 或 L,则认为是长整型,比如:10L,79l,012L,0xAL,0x4fL 等。
(2)整型变量
C 语言要求所有用到的变量都必须在程序中指定其类型。输出一个整型数据需要使用 %d。例如:
#include <stdio.h>
int main()
{
int a = 10; //定义一个整形变量a,并0赋值为10
short b = 10; //定义一个短整型变量b,并赋值为10
long c = 10; //定义一个长整型变量c,并赋值为10
printf("a的值为:%d\n", a);
printf("b的值为:%d\n", b);
printf("c的值为:%d\n", c);
return 0;
}
运行结果如下:
短整型、长整型、整型都是表示整型的,输出结果也相同(都为10),它们的主要区别是所占内存空间的大小不同,C 语言规定 short int 类型所占内存空间小于或等于 int,Int 小于或等于 long。使用 sizeof 查看他们所占内存空间大小。
#include <stdio.h>
int main()
{
printf("long:%d\n", sizeof(long));
printf("short:%d\n", sizeof(short));
printf("int:%d\n", sizeof(int));
return 0;
}
运行结果如下:
2、字符型
(1)字符型常量
字符型常量是用一对单引号括起来的一个字符。在 C 语言中,字符是按照其对应的 ASCII 码来存储的,一个字符占一个字节。
C 语言中字符型常量按整型(int)存储,所以字符型常量可以像整数一样参与相关运算。例如:
'a'-32 //结果为:97-32=65
'A'+32 //结果为:65+32=97
'9'-9 //结果为:57-9=48
(2)转义字符
通常使用转义字符表示 ASCII 字符集中不可打印的控制字符和特定功能的字符。例如:单引号( ’ )、双引号( " )、反斜杠( \ )等。C 语言中常用的转义字符如下:
转义字符 | 意义 | ASCII 码 |
---|---|---|
\b | 退格(BS) | 008 |
\f | 换页(FF) | 012 |
\n | 换行(LF) | 010 |
\r | 回车(CR) | 013 |
\t | 水平制表(HT) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 反斜杠 | 092 |
? | 问号字符 | 063 |
\’ | 单引号字符 | 039 |
\" | 双引号字符 | 034 |
\0 | 空字符 | 000 |
(3)字符型变量
字符型变量用来存放字符常量,一个字符型变量只能存放一个字符。字符型变量的定义格式如下:
char c1,c2;
c1='a';
c2='b';
要输出 char 类型变量,使用 %c,例如:
#include<stdio.h>
int main()
{
char c1,c2;
c1 = 97;
c2 = 98;
printf("输出字符型变量的值:%c,%c",c1,c2);
printf("字符型变量占用的字节数:%d",sizeof(char));
return 0;
}
以上程序的输出结果如下:
字符的大小写转换:
#include<stdio.h>
int main()
{
char c1,c2;
c1='A';
c2='b';
printf("大写字母转换为小写字母:%c\n", c1 + 32);
printf("小写字母转换为大写字母:%c", c2 - 32);
return 0;
}
以上程序的输出结果如下:
3、实型
(1)实型常量
实型常量又称浮点数,是一个用十进制表示的数。实数的值包含整数部分、尾数部分和指数部分。小数点之前是整数部分,小数点之后是尾数部分,指数部分用 E 或 e 开头,指数部分可以为负。所有的实型常量均为双精度类型。例如:
15.75
1.575E10
1575E-2
-0.0025
-2.5e-3
25E-4
//实型常量的整数部分为 0 时,可以省略整数部分,如:
.57
.0075e2
-.125
-.175E-2
字母 E 或 e 之前必须有数字,且 E 或 e 后面的指数必须为整数。下面的常量是错误的:
e3
2.1e3.5
(2)实型变量
实型变量分为单精度型(float)和双精度型(double)。float 型数据在内存中占用 4 个字节,double 型数据在内存中占用 8 个字节,单精度型实数具有 7 位有效数字,双精度型实数具有 15~16 位有效数字。
输出 float 类型的数据需要使用 %f ,输出 double 类型的数据需要使用 %lf,例如:
#include<stdio.h>
int main()
{
float f1,f2,f3;
double d1,d2,d3;
f1 = 1.25; f2 = 1.23456789; f3 = 1.2e10;
d1 = 1.25; d2 = 1.23456789; d3 = 1.2e10;
printf("单精度型:f1=%f,f2=%f,f3=%f\n",f1,f2,f3);
printf("双精度型:d1=%lf,d2=%lf,d3=%lf\n",d1,d2,d3);
printf("单精度型占用的字节数:%d\n",sizeof(float));
printf("双精度型占用的字节数:%d",sizeof(double));
return 0;
}
以上程序的输出结果如下:
4、枚举类型
枚举就是把变量可能取到的值一一列举出来,变量的取值只局限于列举出来的值的范围。声明枚举类型使用 enum 保留字,例如:
//定义枚举类型
enum weekday{sun,mon,tus,wed,thu,fri,sat};
//定义枚举类型的变量
enum weekday workday,weekend;
//也可以直接定义枚举类型的变量
enum {sun,mon,tus,wed,thu,fri,sat} workday,weekend;
//为枚举类型的变量赋值
workday = mon;
weekend = sun;
说明:
(1)枚举元素按常量处理,称为枚举常量,不能给枚举元素赋值。例如以下赋值是错误的:
sun = 0;
mon = 1;
(2)枚举元素作为常量,C 语言按枚举元素定义的顺序将他们的值定义为0、1、2、…。在前面的定义中,sun 的值为 0,mon 的值为 1,…,sat 的值为 6。可以改变枚举元素的值,如:
#include<stdio.h>
int main()
{
enum weekday{sun=7,mon=1,tus,wed,thu,fri,sat};
enum weekday workday,weekend;
workday = mon;
weekend = sun;
printf("monday:%d\nsunday:%d",workday,weekend);
return 0;
}
以上程序的输出结果如下:
(3)枚举值可用于构造条件,例如:
if(workday == mon) {...}
if(workday > sun) {...}
(4)整数不能直接赋给枚举变量,因为他们属于不同的类型。需要进行强制类型转换才能赋值。例如:
workday = 2; //错误
workday = (enum weekday)2; //相当于将序号为2的枚举元素赋给workday,等价于下面的语句:
workday = tue;
(5)不能对枚举类型的变量直接读写,只能输出枚举变量的序号。