目录
3.1 C语言的基本数据类型简介
C 语言的数据类型可以分为四大类:基本类型,构造类型,指针类型及空类型。
3.2 标识符,常量和变量
1、标识符
1)、标识符的概念
标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、常量、数组等。标识符由字母,数字,下划线组成,且第一个位置只能取字母或下划线。
标识符在使用时要注意以下规则:
(1)标识符必须由字母(a~z,A~Z)或下划线开头。
(2)标识符的其他部分可以用字母,下划线或数字(0~9)组成。
(3)大小写字母表示不同意义,即代表不同的标识符。
(4)在不同的系统中标识符字符的有效位数不同。
(5)标识符不能使用Turbo C2.0的关键字。
2)、标识符的种类
(1)关键字:所谓关键字就是已被Turbo C 2.0 本身使用,不能作其他用途使用的字。系统保留的关键字有特定的含义,不能用作变量名,函数名等。C语言有以下32个关键字。
auto | double | int | struct | break | else |
long | switch | case | enum | register | typedef |
char | extern | return | union | const | float |
short | unsigned | continue | for | signed | void |
default | goto | sizeof | valatile | do | if |
while | static |
(2)编译预处理的命令单词:如#include,#define等。
(3) 用户标识符:用户自己定义的变量名,常量名和函数名等。
2、常量
常量是指程序运行过程中不能变化的量,分为数值常量和字符常量两种。
1)、数值常量
(1)整型常量(整数)
如207,30和181都是整型常量。整型常量有以下三种形式:十进制整数,八进制整数,十六进制整数。
(2)实型常量(实数)
实型常量表示的是通常数学中表示的实数,可以表示带小数点的数。有小数形式和指数形式两种形式。
小数的两种形式:①小数形式 如 2.14 ②指数形式 如 2.31e10表示2.31✕e¹⁰
小数的两种形式:①单精度 ②双精度 双精度比单精度有效位数多。
常量的定义形式:
#define 常量名 常数值
例如:
#define PI 3.1415926
2)、字符常量
字符常量是由字符构成,如 'A' , 'X' 和 'a' 等常见的字符常量。除了熟悉的字符常量外,Turbo C 还定义了一些专门的控制字符。
\n | 换行 |
\t | 横向跳格 |
\v | 纵向跳格 |
\b | 退格 |
\r | 回车 |
\f | 走纸换页 |
\\ | 反斜杠字符 |
\' | 单引号字符 |
\? | 问号字符 |
\" | 双引号字符 |
\0 | 空 |
\ddd | 1~3位八进制数所代表的字符 |
\xhh | 1~2位十六进制数代表的字符 |
3、变量
变量是程序在运行中可以改变的量。每个变量都有名字,在内存中占一定的存储空间,用来存放数据。
1)、变量的定义
Turbo C 2.0 规定所有变量在使用之前都必须加以说明。一条变量说明语句由数据类型和其后的一个或多个变量名组成。变量定义的形式如下:
类型<变量名>;
例如:
int a,b,c; //说明三个变量a,b,c都是整型变量
unsigned long d; //说明一个变量d是无符号长整型变量
2)、变量的说明
(1)像其他语言一样,Turbo C的变量在使用之前必须先定义其数据类型,未经定义的变量不能使用。
(2)变量的名称只能由字母,数字和下划线组成,且数字不能打头。
(3)Turbo C 程序的书写格式非常灵活,没有严格限制。
3.3 基本数据类型
Turbo C 提供以下几种基本数据类型:整型( int ),实型( float 或 double )和字符型( char)。
1、整型
整型数由整型常数和整型变量组成。
1)、整型变量的定义
整型变量定义格式:
<整数类型><变量名>;
整数类型可以按有无符号和数据长短分类:
按有无符号分:① 有符号 ②无符号
按数据长短分:①长整数 ②短整数
类型 | 简写 | 字长 | 说明 | 数的范围 |
signed short int | short 或 int | 2字节 | 有符号短整型数 | -32768~32767 |
signed long int | long | 4字节 | 有符号长整型数 | -2147483648~2147483647 |
unsigned short int | unsigned int | 2字节 | 无符号短整型数 | 0~65535 |
unsigned long int | unsigned long | 4字节 | 无符号长整型数 | 0~4294967295 |
2)、整型数的存储形式
整数存储在存储单元时,有符号(signed)和无符号(unsigned)的整型量的区别在于它们的最高位的定义不同。如果定义的是有符号的整型(signed int),C编译程序所产生的代码就设定整型数的最高位为符号位,其余位表示数值大小。如最高位为0,则该整数为正;如最高位为1,则该整数为负。例如用16位二进制表示时:
[+1]源码=0000000000000001
[-1]源码=1000000000000001
[+127]源码=0000000001111111
[-127]源码=1000000001111111
在上述几个数中左数第一位都是符号位。
大部分计算机-表示有符号数时都使用二进制补码。正数的补码,反码和源码都一样都等于源码。负数的补码是反码加1,反码是将其对应数的绝对值的源码的各位按位求反,再反码上加1得到补码。上述4个数用8位二进制表示有符号数时计算机内反码,补码值为:
[+1]源码=0000000000000001=反码=补码
[-1]源码=1000000000000001
[-1]反码=1111111111111110
[-1]补码=反码+1=1111111111111111
有符号整数对于许多运算都是很重要的。但是它所能表达的最大数的绝对值只是无符号数的一半。例如,32767 的有符号整数表示为 0111111111111111。因为有符号,最高位表示符号,所以 32767 是 int 有符号整型数的最大数。如果最高位为 1,则该数就会被当作负数一1(因为 1111111111111111 是-1 的补码)。然而,如将该数定义为无符号整型(unsigned int),那么当最高位设置为 1 时,它就变成了 65 535。
3) 、整型变量赋值及其说明
(1)可以在定义整型变量的同时给变量赋初值,称为变量的初始化。
例如
int a=3,b=100; //a,b被定义为有符号短整型变量,并且a的初值为3,b的初值为100
unsigned long c=65535; //c被定义为无符号长整型变量,并且c的初值为65535
(2)在赋初值时八进制数、十六进制数整型常数需要特定的符号表示。
例如
int f=022; //f的值是八进制数22,按十进制数输出时值为18
(3)在整型常数后添加一个字母 L或 l 表示该数为长整型数,如 22L、773L等,
例如
#define G 22L //G的值定义为长整型数22
#define H 0773L //H的值定义为八进制的长整型数。
2 、实型
1)、实型变量的定义
实型变量的定义形式如下:
<实型><变量列表>
实型数据因小数点后的位数不同分为不同的精度。C语言中,实型类型有3种:单精度实数,双精度实数,长双精度实数。这 3 种数据类型存储在计算机内存中,占用的单元数不同,表示出来的数的精度也不同。具体内容如表所示。
类型 | 字长 | 说明 | 有效字数 | 数的范围 |
float | 4字节 | 单精度实型数 | 6~7 | -3.4✕10⁻³⁸ ~ 3.4✕10³⁸ |
double | 8字节 | 双精度实型数 | 15~16 | -1.7✕10⁻³⁰⁸~ 1.7✕10³⁰⁸ |
long double | 16字节 | 长双精度实型数 | 18~19 | -1.2✕10⁻⁴⁹³² ~ 1.2✕10⁴⁹³² |
可以用以下语句定义实型变量:
float a,b; //a,b被定义为单精度实型变量
double c; //c被定义为双精度实型变量
2)、实型数据的存储形式
float 是单精度实数类型,字长占 4 字节,共有 32 位二进制位,数的取值范围是-3.4✕10⁻³⁸ ~ 3.4✕10³⁸ 。内存形式为以高 24位表示小数部分,最高位表示符号位;低 8 位代表指数部分。实数类型数 3.141 592 6 的存储形式如图所示。
对于 double 型数据类型,共占 64 位,有的系统中将其中的 56 位用于存放小数部分,指数部分8 位。这样存储的双精度实数类型有效位数多,可以减少数值运算误差。有一点说明:所有实型数均为有符号实型数,没有无符号实型数。
3)、实型变量赋值及其说明
对实型变量赋初值可以在定义的同时赋值。例如:
float a=23.562
实数类型说明如下:
(1)实数类型常数只有十进制。
(2)所有实数类型常数都被默认为 double 型
(3)绝对值小于 1 的实型数,其小数点前面的 0 可以省略。如 0.22 可写为.22,
—0.0015E—3 可写为一.0015E-3。
(4)Turbo C 默认格式输出实型数时,最多只保留小数点后 6 位。
3 、字符型
1)、字符型变量的定义
字符型变量的定义形式如下:
<字符类型><变量列表>;
字符类型有两种:有符号和无符号;
例如:
char a; //a被定义为有符号字符变量
unsigned char c; //c被定义为无符号字符变量
字符型数据类型
类型 | 字长 | 说明 | 数的范围 |
char | 1字节 | 有符号字符型 | -128 ~ 127 |
unsigned char | 1字节 | 无符号字符型 | 0 ~ 255 |
2)、字符变量的赋值及字符常数表示
字符变量可以在定义时直接赋初值。
char a='A'; //a被定义为有符号字符变量,并且将a变量赋初值为'A',这时a变量中存储A的 ASCII 码值为十进制数 65。
在赋初值时,可直接用单引号括起来表示字符,如'a'、9'和'Z',也可用该字符的 ASCII码值表示。
char a='A';
char a= 65;
上面两个赋初值是等效的。
C 语言允许使用的字符串常量是一对用双引号括起来的字符序列,如"Hello TurboC 2.0"。需注意 'a‘ 和 "a" 是不同的,前者是一个字符,可以赋给一个变量;后者是一个字符串,不能赋给一个字符变量 。C 规定在每一个字符串的结尾加一个字符串结束标志\0',在 C 语言中没有专门的字符串变量 。
3.4 数据的输入与输出
输入与输出的概念是相对计算机而言的,当数据从外部设备(如键盘)送给计算机时,称为“输人”;当数据从计算机中送出到外部设备(如显示器或打印机)时,称为“输出”。
在 C 语言中,没有提供专门的输人输出语句,输人或输出操作是通过调用输入输出库函数来实现的,如 printf()就是库函数。C语言函数库中有一批标准输入输出函数,包括 printf() , scanf() , putchar() , getchar() , puts() 和 gets() 等。
1、字符输出函数
函数的格式:
putchar(ch)
函数的功能:将变量 ch 中的内容以一个字符形式输出到屏幕上。其中 ch 可以是字
符型变量,也可以是整型变量,还可以是字符型常量或整型常量。
putchar()函数,不仅可以输出普通可显示的字符,还可以输出转义控制字符。如 putchar(\n); 表示输出换行符,即控制输出位置换到下一行的开头。
【例1】putchar() 函数的使用。
#include<stdio.h>
int main()
{
char x='A',y='B';
int z=97;
putchar(x);
putchar(y);
putchar('\n');
putchar(z);
}
//运行结果为:
AB
a
2、字符输入函数
函数的调用格式:
c=getchar()
函数的功能:接收从标准输入设备(键盘)输人的一个字符,并将该字符作为函数的值赋给变量 c。
该函数的执行是等待从键盘输入一个字符,当用户输入一个字符后,函数的值就是所输入的字符的 ASCII 码值。所以常用赋值语句的形式,将键盘输人的字符,赋给一个变量。
使用getchar()函数应注意以下两点:
(1)getchar()函数可以作为 putchar()函数的参数,如语句 putchar(getchar()); 是正确的。其功能是显示键盘输人的字符。
(2)使用 getchar()函数时,回车键也会作为输入字符的一部分。尤其在连续使用
getchar()函数时要注意回车键将会作为换行符被下一个 getchar()所接受。
【例2】getchar() 函数的使用。
#include<stdio.h>
int main()
{
putchar(getchar());
}
//运行结果为:
A //输入
A
3、格式输出函数
函数的调用格式:
printf("格式控制",输入项列表);
函数的功能:按某种格式,向输出设备输出若干指定类型的数据。
printf() 函数的参数包括格式控制和输出项列表两部分。格式控制部分又可分为普通字符和格式说明两部分。
(1)普通字符,将原样式输出。例如:
printf("China");
输出结构如下:
China
(2)格式说明部分,以%开头,以”格式说明符“结束。例如:%d,%f 等。
在 printf("sum=%d",a); 中:
sum-->普通字符
%d-->格式说明
a-->输出项列表
输出格式说明符及其含义
格式说明符 | 含义 |
d | 按十进制有符号整型数输出 |
o | 按八进制无符号整型数输出 |
x | 按十六进制无符号整型数输出 |
u | 按十进制无符号整型数输出 |
c | 以字符格式输出,只输出一个字符 |
s | 输出字符串 |
f | 以小数形式输出单,双精度数,输出6位小数 |
e | 以标准指数形式输出单,双精度数 |
g | 按 f 和 e 格式中较短的一种输出 |
l | 用于输出 long 型数据,如 %ld , %lu等 |
m.n | 指定输出域宽及精度, m 和 n 都是正整数 |
- | 左对齐输出数据 |
1)、整型格式说明符
(1)十进制形式输出
① %md:控制输出项按十进制有符号整数形式输出。m 是一个整数,用于指定输出数据的最小占位宽度,若所输出数据的位数小于 m,左端(高位)将以空格占位;若输出数据的位数大于 m,则按数据的实际宽度输出;若省略 m 则按所要输出数据的实际长度
输出。如;
#include<stdio.h>
int main()
{
int a=123,b=123456;
printf("a=%5d\nb=%5d",a,b);
}
//运行结果为:
a= 123
b=123456
② % mld:格式中的 l 符号用于输出 long 型数据,m 指定输出数据的占位宽度,long 型数不能用%d 格式输出。如:
#include<stdio.h>
int main()
{
long a=123456;
printf("%ld\n",a);
printf("%9ld",a);
}
//运行结果为:
123456
123456
③ %一md 或%一mld:格式中的一修饰符表示输出数据左对齐。当输出数据的位
数小于 m 时,数据将左对齐,右边以空格占位,如:
#include<stdio.h>
int main()
{
int a=123;
printf("%5d+%5d=%6d\n",a,a,a+a);
printf("%-5d+%-5d=%-6d\n",a,a,a+a);
}
//运行结果为:
123+ 123= 246
123 +123 =246
④ %mu 或 %mlu:控制输出项按十进制无符号整型数输出。其中 m 和 l 的含义如前所述。
(2)八进制形式
① %mo:控制输出项按八进制整数形式输出。
② %mlo:控制输出项按八进制长整数形式输出。
(3)十六进制形式
① %mx:控制输出项按十六进制整数形式脸出。
② %mlx:控制输出项按十六进制长整数形式输出。
2)、实型格式说明符
用于输出单精度或双精度数的格式说明符是相同的。实型格式说明符有以下两种。
(1)%f 或 %m.nf:以小数形式输出单、双精度数据。格式中的 m 表示输出的整个数据所占的列数(注意小数点占一列),含义如前所述;n 表示输出数据的小数部分的位数,如果不指定 n,则默认输出 6 位小数。
(2)%e 或 %m.ne:以标准指数形式输出单、双精度数。m 的含义如前所述,注意此格式中,实际输出的小数部分的位数为 n一 1 位。若不指定 n ,则默认输出 5 位小数。
3)、字符型格式说明符
该格式用于输出一个字符,字符型数据的格式说明符为%c或%mc。其中 m 表示输出的单个字符占的列数,即在输出的字符前要有m一1个空格占倍。
4)、字符串格式说明符
该格式用于输出一个字符串,字符串型数据的格式说明符为 %-m.ns。格式中的 m 指输出字符串占 m 列。若要输出的字符串长度大于 m,则不受 m 限制,全部输出;若要输出的字符串长度小于 m,则左边以空格占位补齐 m 位。n 用于指定输出字符串左端截取 n 个字符。一表示当输出的字符个数小于 m 时,输出左对齐,右边以空格占位补齐 m 位。
请看下面程序段的运行结果:
#include<stdio.h>
int main()
{
printf("%3s\n%5.2s\n%.4s\n%-5.3s\n","china","china","china","china");
}
//运行结果为:
china
ch
chin
chi
4、格式输入函数
函数的调用格式:
scanf("格式控制",输出项列表);
函数的功能:接收键盘输人的信息,按指定格式转换后,存放到地址列表所对应的变量中。
1)、地址列表
地址列表由若干地址组成,它们可以是变量的地址也可以是字符串的首地址。变量的地址可以通过取地址运算符 & 得到。例如,变量 a的地址表示为&a。
2)、格式控制说明
与 printf类似,格式控制说明以%开头,以格式说明符结束,中间可加入附加说明
符。
输入格式说明符及其含义
格式说明符 | 含义 |
d | 输入十进制整型数 |
o | 输入八进制整型数 |
x | 输入十六进制整型数 |
c | 输入一个字符 |
s | 输入字符串 |
f | 输入十进制的小数形式或指数形式的实数 |
e | 输入一个实数,与 f 相同 |
l | 用于输入 long 型数据,如 %ld , %lu ,或输入double型数据,如%lf |
h | 用于输入short型数据,如 %hd |
m | 域宽说明,是一个正整数,指出输入数据所占列数 |
* | 表示本输入项不赋给变量 |
使用格式输入函数时,需要注意以下几点:
(1)当输入一串数据时,要考虑分隔各个数据。
scanf("%d %d %d",&a,&b,&c); 执行该输入时,要连续输入3个整数,可以用以下几种分隔方法。
① 可以用空格分隔各个数。
② 可以用 Enter 键分隔。
③ 可以用Tab 键分隔
④ 根据格式控制说明中指定的域宽来分隔数据
#include<stdio.h>
int main()
{
int a,b;
scanf("%4d%3d",&a,&b);
printf("a=%d b=%d",a,b);
}
//运行结果为:
1234567 //输入
a=1234 b=567
⑤ 根据格式字符的含义来分隔数据。
#include<stdio.h>
int main()
{
int a;
char b;
float c;
scanf("%d%c%f",&a,&b,&c);
printf("a=%d b=%c c=%f",a,b,c);
}
//运行结果为:
123D3.12 //输入
a=123 b=D c=3.120000
⑥ 使用自定义的分隔符
比如逗号分隔:
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
printf("a=%d b=%d c=%d",a,b,c);
}
//运行结果为:
12,13,14 //输入
a=12 b=13 c=14
(2)附加说明符 * 号的作用是抑制输入,即用 * 说明的输入项不给任何变量。
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%3d%*2d%2d",&a,&b,&c);
printf("a=%d b=%d c=%d",a,b,c);
}
//运行结果为:
1234567 //输入
a=123 b=67 c=0