C语言程序设计(第二版)学习笔记——第三章

第三章 基本数据类型及数据的输入输出

3.1 C语言的基本数据类型简介

要在C环境下实现运算必须首先定义变量,并确定变量的数据类型,然后才能对数据进行操作。

C语言的数据类型分为四大类:基本类型、构造类型、指针类型和空类型(无值类型)。

3.2 标识符、常量和变量

3.2.1 标识符

1、标识符

标识符是指标识常量、变量、语句标号及用户自定义的数据类型名或函数名等的字符序列,用于表示常量、变量、语句标号及用户自定义的数据类型或函数等的名称

标识符由字母、数字和下画线组成,且第一个位置只能取字母或下画线。

Turbo C标识符的定义十分灵活。标识符在使用时要注意以下规则:
(1)标识符必须由字母(a~z,A~Z)或下画线(_)开头。
(2)标识符的其他部分可以用字母、下画线或数字(0~9)组成。
(3)大小写字母表示不同意义,即代表不同的标识符。
(4)在不同的系统中标识符字符的有效位数不同。
(5)标识符不能使用Turbo C2.0的关键字(关键字是系统保留的)。

2、标识符种类

(1)关键字:

关键字就是已被 Turbo C 2.0本身使用,不能作其他用途使用的字。

系统保留的关键字有特定的含义,不能用作变量名、函数名等。

由ANSI标准定义的Turbo C 2.0关键字有以下32个。
auto            double        int              struct          break          else              switch          extern  unsigned     goto           static          case           return         continue       sizeof           enum         union          for              volatile       typedef       float            void              if                  long   register     char             const          short          signed         default         do                while

在系统中这些关键字都有相应的意义

定义数据类型的,如 auto、double、int、struct、long、char、short、enum和register等;

表示控制语句的,如for、switch、do、if、while、case、break、else和return等

(2)编译预处理的命令单词:

如#include、# define等。当程序要调用系统函数或定义常量时,要使用预处理命令。

(3)用户标识符:

用户自己定义的变量名、常量名和函数名等。

起名时一般最好是用表示标识符意义的英文字母或汉语拼音来表示

3.2.2 常量

1、常量是指程序运行过程中不能变化的量,分为数值常量和字符常量。

(1)数值常量

数值常量包括整型常量和实型常量两种,分别表示整数和实数。

①整型常量:

在计算机中有不同进制的常整数,如十进制、八进制和十六进制等。表示不同进制数在标识时有所不同,要引起注意。

整型常量的3种形式如下:

十进制整数:和通常表示的数在形式上一致,如200、508等。

八进制整数:在表示时第一位数字添加0,如012、070等,它们表示的是八进制数。如果换算成十进制数,012为10,070为56。

十六进制整数:一个数如果表示成十六进制数,前两位应为0x,如0x20、0x701和0x10等,它们表示的是十六进制数。如果将它们转换为十进制的数,0x20为32、0x701为1793、0x10为16。

整型常量的定义形式:其中常量名是用标识符来表示的,也称符号常量。

#define 常量名  整常数值

//例如
#define M 30
//表示定义了一个符号常量M,它的值为30。

//注意:在符号常量定义时不能在常数值后面加任何符号,否则会出现错误。

②实型常量表示的是通常数学中表示的实数,可以表示带小数点的数。

有小数形式和指数形式两种形式。


实数常量的定义形式与整数常量的定义形式相同:

#define 常量名 实数常数值

//例如
#define PI 3.1415926
//定义了一个常数PI,它的值为3.1415926
//注意定义的结尾处不要有符号

(2)字符常量

字符常量是由字符构成,如'A'、'X'和'a'等是常见的字符常量。除了熟悉的字符常量外,Turbo C还定义了一些专门的控制字符(转义字符),这些字符已经不是表面字符的含义,需要大家记住。

2、C语言中的常量也可分为以下几种:

字面常量

const 修饰的常变量

#define 定义的标识符常量

枚举常量

#include <stdio.h>
 //举例
enum Sex
 {
 MALE,
 FEMALE,
 SECRET
 };
 //括号中的MALE,FEMALE,SECRET是枚举常量
int main()
 {
 //字面常量演示
3.14;//字面常量
1000;//字面常量
//const 修饰的常变量
const float pai = 3.14f;   //这里的pai是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define MAX 100
 printf("max = %d\n", MAX);
 //枚举常量演示
printf("%d\n", MALE);
 printf("%d\n", FEMALE);
 printf("%d\n", SECRET);
 //注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
 }
//注:上面例子上的pai 被称为const 修饰的常变量,const 修饰的常变量在C语言中只是在语法层面限制了
//变量pai不能直接被改变,但是pai 本质上还是一个变量的,所以叫常变量。

3.2.3 变量

变量是程序在运行中可以改变的量。每个变量都有名字,在内存中占一定的存储空间,用来存放数据。在编写程序时有很多需要变化的量,这时就需要使用变量。

1、变量定义

Turbo C2.0规定所有变量在使用前都必须加以说明。一条变量说明语句由数据类型和其后的一个或多个变量名组成。

变量根据作用范围可分为全局变量与局部变量。

#include <stdio.h>
 int global = 2019;//全局变量
int main()
 {
 int local = 2018;//局部变量
//下面定义的global会不会有问题?
int global = 2020;//局部变量
printf("global = %d\n", global);
 return 0;
 }

当局部变量和全局变量同名的时候,局部变量优先使用。

变量定义的形式如下:

类型<变量表>;
//这里类型是指Turbo C 2.0的有效数据类型。
//变量表由一个或多个标识符命名的多个变量组成,每个标识符之间用","分隔。

//例如:
int i,j,k;//说明三个变量i,j,k都是整型变量
unsigned long c;//说明一个变量c是无符号长整型变量

2、变量的作用域和生命周期

(1)作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

①局部变量的作用域是变量所在的局部范围。

② 全局变量的作用域是整个工程。

(2)变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

①局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

②全局变量的生命周期是:整个程序的生命周期。

3、变量说明

(1)像其他一些语言一样,Turbo C的变量在使用之前必须先定义其数据类型,未经定义的变量不能使用。定义变量类型应在可执行语句前面。

(2)变量的名称只能由字母、数字和下画线组成,且数字不能打头。在Turbo C中,大、小写字母是有区别的,相同字母的大、小写代表不同的变量。

(3)Turbo C程序的书写格式非常灵活,没有严格限制。

3.3 基本数据类型

Turbo C提供以下几种基本数据类型:整型(int)、实型(float或double)和字符型(char).

3.3.1 整型

整型数由整型常数和整型变量组成。整型常量的形式及定义前面已经描述过,下面来看整型变量。

1、整型变量定义

整型变量的定义格式:

<整数类型><变量名>;

//例如
int a,b,c;//数值范围-32768~32767
unsigned int d,e;//0~65535

整数类型可以按有无符号和数据长短分类

按有无符号分:有符号整数、无符号整数

按数据长短分:长整数、短整数

2.整型数的存储形式

(1)整数存储在存储单元时,有符号(signed)和无符号(unsigned)的整型量的区别在于它们的最高位的定义不同。

如果定义的是有符号的整型(signed int),C编译程序所产生的代码就设定整型数的最高位为符号位,其余位表示数值大小。如最高位为0,则该整数为正;如最高位为1,则该整数为负。

有符号整数对于许多运算都是很重要的。但是他所能表达的最大数的绝对值只是无符号数的一半。

例如用16位二进制表示时(在下述几个数中左数第1位都是符号位):
[+1]原码=0000000000000001

[-1]原码=1000000000000001

[+127]原码=0000000001111111

[-127]原码=1000000001111111

(2)补码:大部分计算机表示有符号数时都使用二进制补码。

补码的求法:

①正数补码、反码和原码都一样等于原码,

②负数的补码是反码加1,反码是将其对应数的绝对值的原码各位按位求反,在反码上加1得到补码。

3.整型变量赋值及其说明

(1)可以在定义整型变量的同时给变量赋初值,称为变量的初始化。

(2)在赋初值时八进制数、十六进制数整型常数需要特定的符号表示。

(3)在整型常数后添加一个字母1.或1表示该数为长整型数,如22L、773L等。

3.3.2 实型

实型数据因小数点后地位是不同分为不同的精度,主要有float和double类型。

1、实型变量的定义形式如下

<实型><变量列表>;

//例如
float a,f;//a,f被定义为单精度实型变量
double b;//b被定义为双精度实型变量

//在定义时,可以将变量同时赋初值
float a=12.3,f=2.98301;

在C语言中,实数类型有三种:单精度实数、双精度实数和长双精度实数

2、实型数据的存储形式

实型数据在内存中以指数形式存储

float是单精度实数类型,字长占4字节,共有32位二进制位,数的取值范围是-3.4×10^(-38)~3.4×10^38,内存形式以高24位表示小数部分,最高位表示符号位;低8位代表指数部分。

double类型共占64位,有的系统将其中的56位用于存放小数部分,指数部分存8位。这样存储有效位数多,减小数值运算误差。

所有实型数均为有符号实型数,没有无符号实型数

3、实型变量赋初值及其说明

对实型变量赋初值可以在定义的同时赋值

//例如

float a=1.65,f=-9.8e-16;
//这里a、b被定义位单精度实型变量,将变量a赋值1.65,变量b赋值为-9.8e-16(指数形式)

实数类型说明如下:

(1)实数类型常数只有十进制

(2)所有实数类型常数都默认为double型

(3)绝对值小于1的实型数,其小数点前面的0可以省略。如0.22可写为.22。

(4)Turbo C默认格式输出实型数时,最多保留小数点后6位。

3.3.3 字符型

1、字符型变量的定义及存储

字符型变量的定义形式为:

<字符类型><变量列表>;

//例如
char a; //a被定义为有符号字符变量,它的值为-128~127
unsigned char c; //c被定义为无符号字符变量,它的值为0~255

字符型数据如下图所示

字符在计算机中以其ASCⅡ码方式表示,其长度占存储单元的1字节,有符号字符型数取值范围为-128~127,无符号字符型数取值范围是0~255。

在Turbo C语言中,字符型数据在操作时按整型数处理,如果某个变量定义成char,则表明该变量是有符号的,即它将转换成有符号的整型数。

Turbo C中规定对ASCⅡ码值大于0x80的字符被认为负数。

一般汉字均定义为unsigned char。

可以定义一个字符型数组表示一个字符串,char str[10](计算机在编译时,将留出连续10个字符的空间,即str[0]~str[9]共10个变量,但只有前9个供用户使用,第10个即str[9]用来存放字符串终止符NULL,即"\0",但终止符为程序自动添加。

2、字符变量的赋值即字符常数表示

字符变量可以在定义时直接赋初值。

char a='A': a被定义为有符号字符变量,并且将a变量赋初值为'A',这时a变量存储'A'的ASCII码值为十进制数65。在赋初值时,可直接用单引号括起来表示字符,如'a'、9'和'Z',也可用该字符的ASCK 码值表示。
char a= 'A':
char a=65;
上面两个赋初值是等效的。

十进制数85表示大写字母U,十六进制数0x5d表示],八进制数0102表示大写字母 B,知道了一些符号的ASCII码值后,在赋值时可以选择不同的方法。

一些不能用符号表示的控制符,只能用ASCII码值来表示,如十进制数10表示校行,十六进制数0x0d表示回车,八进制数033表示Esc。

C语言允许使用的字符串常量是一对用双引号括起来的字符序列,如"Hello Turbo C2.0"。需注意'a'和"a"是不同的,前者是一个字符,可以赋给一个变量;后者是一个字符串,不能赋给一个字符变量。

C规定在每一个字符串的结尾加一个字符串结束标志"\0",在C语言中没有专门的字符串变量。

3.4 数据的输入与输出

在C语言中,没有提供专门的输入输出语句,输入或输出操作是通过调用输入输出库函数来实现的,如printf()就是库函数。C语言函数库中有一批标准输入输出函数,包括printf()、scanf)、putchar()、getchar()、puts()和gets()等

注意,在使用这些库函数之前,要用编译预处理命令中的文件包含命令#include,将与库函数相关的头文件包含到程序中来,因为头文件中包含了定义库函数的有关信息。

头文件的扩展名为h,是head的缩写,所以称为头文件。

在使用标准输入输出库函数时,应包含的头文件是stdio.h,即在程序的开头应该加入以下命令:
#include <stdio.h>
#include "stdio.h"

在Turbo C 2.0版编译系统中使用printf()和scanf()函数可以省略文件包含命令。

3.4.1 字符输出函数

函数的格式:

putchar(ch);

//例如
include<stdio.h>

void main()
{ 
   char x='A',y='B'; //定义并初始化变量x、y
   int i=97; //定义并初始化变量i

   putchar(x) ;//输出字符变量x中的内容A
   putchar(y); //输出字符变量y中的内容B
   putchar('C'); //输出字符常量C
   putchar(i);//将变量i中的97当作ASCII码,转换成对应的字符a输出
   putchar(98); //将整数98当作ASCII码,转换成对应的字符b输出
   putchar('!'); //输出字符常量
}

函数的功能:将变量ch中的内容以一个字符形式输出到屏幕上。其中ch可以是字符型变量,也可以是整型变量,还可以是字符型常量或整型常量。

putchar()函数,不仅可以输出普通可显示的字符,还可以输出转义控制字符。如putchar('\n');表示输出换行符,即控制输出位置换到下一行的开头。

3.4.2 字符输入函数

函数的调用格式:

c = getchar();

//输入一个大写字符,将其转换成小写并输出
#include<stdio.h>
void main()
{
   char c; //定义字符型变量c
   printf("Please input a letter:\n"); //显示一行提示信息
   c = getchar();  //输入一个字符
   c = c+32;  //将字符转换成小写字符
   putchar(c);  //输出c中的字符
}

函数的功能:接收从标准输入设备(键盘)输入的一个字符,并将该字符作为函数的值赋给变量c。

该函数的执行是等待从键盘输入一个字符,当用户输入一个字符后,函数的值就是所输入的字符的ASCII码值。所以常用赋值语句的形式,将键盘输入的字符,赋给一个变量。

使用getchar()函数应注意以下两点:

(1)getchar()函数可以作为putchar()函数的参数,如下面的语句是正确的:putchar (getchar());其功能是显示键盘输入的字符。

(2)使用getchar()函数时,回车键也会作为输入字符的一部分。尤其在连续使用getchar()函数时要注意回车键将会作为换行符被下一个getchar()所接受。

3.4.3 格式输出函数

函数调用格式:

printf("格式控制",输出项列表);

函数的功能:按某种格式,向输出设备输出若干指定类型的数据。

printf()函数可以用于各种类型数据的输出,采用不同的格式控制符,将不同的数据类型输出到标准输出设备(显示器)上。

printf()函数的参数包括格式控制和输出项列表两部分。格式控制部分婴用一对双撇号括起来,用于说明输出项所采用的格式:输出项列表是所要输出的内容,可以是变量、表达式或常量。

格式控制部分又可分为普通字符和格式说明两部分。

(1)普通字符(包括转义控制字符),将原样输出。
例1:
printi("China");
输出普通字符串China。
输出结果如下:China
China

例2:
printf("\t China An");
先输出转义控制字符t,控制输出位置跳到下一个输出区(一个输出区为8个西文字管位置),然后输出字符串,最后输出转文控制字符\n',控制换行。
输出结果如下:________China

(2)格式说明部分,以%符号开头,以"格式说明符"结尾。用于控制输出数据的类型和形式。

例如:printf("a=%d b=%c\n",a,b);//普通字符原样输出,%d与%c是格式说明,最后的a、b是输出项列表

有多个输出项时,输出项之间要用逗号分隔(如上例中的输出项为变量a、b两项,用逗号分隔)。格式控制中的各格式说明符与输出项在个数、次序和类型方面必须一一对应(如上例的两个格式说明%d和%c,分别对应说明两个输出项a和b)。

格式说明的一般格式如下:

输出格式说明符:用单一字母表示,用来指定对应输出项的输出格式。

附加说明符及其含义

 1.整型格式说明符
整型格式说明符有十进制、八进制和十六进制3种格式。

(1)十进制形式输出

①%md:控制输出项按十进制有符号整数形式输出。

m是一个整数,用于指定输出数据的最小占位宽度,若所输出数据的位数小于m,左端(高位)将以空格占位;若输出数据的位数大于m,则按数据的实际宽度输出;若省略m则按所要输出数据的实际长度输出。

②%mld:格式中的1符号用于输出long型数据。

m指定输出数据的占位宽度。long型数不能用%d格式输出。

③%-md或%-mld:格式中的一修饰符表示输出数据左对齐。

当输出数据的位数小于m时,数据将左对齐,右边以空格占位。

④%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位。

n用于指定输出字符串左端截取 n个字符。

—表示当输出的字符个数小于m时,输出左对齐,右边以空格占位补齐m位。

5、转义字符

如果要输出某些特殊符号(如\、"和'等),要用转义字符形式输出。

3.4.4 格式输入函数

函数的调用格式:

scanf("格式控制说明",地址列表);

函数的功能:接收键盘输入的信息,按指定格式转换后,存放到地址列表所对应的变量中。

1.地址列表

地址列表由若干地址组成,它们可以是变量的地址也可以是字符串的首地址。变量的地址以通过取地址运算符&得到。例如,变量a的地址表示为&a。

2.格式控制说明
与 printf 类似,格式控制说明以%开头,以格式说明符结束,中间可加入附加说明符。格式式控制说明的一般格式为:

常用的输入格式说明符及其含义

附加说明符及其含义

使用格式输入函数时,需要注意以下几点。 

(1)当输入一串数据时,要考虑分隔各个数据。

可以在一个scanf()函数中输入多个数据。例如,3个scanf()函数,可以用一个scanf()函数完成:scanf("%d %d %d ", &x, &y, &z);

执行该输入时,要连续输入3个整数,那么如何区分哪几位是一个数呢?有以下几种分隔方法。

①可以用空格分隔各个数;

②可以用Enter键分隔;

③可以用Tab键分隔;

注意:以%c格式连续输入字符时,不能采用以上3种方式分隔字符。因为空格、Enter键和 Tab键都会作为有效字符输入给后边的变量。

④根据格式字符的含义来分隔数据。

当输入数据的类型与格式说明符不符时,系统就认为这一数据结束,后边的数据对应下一个输入项。

⑤根据格式控制说明中指定的域宽(即m的值)来分隔数据。

注意:用域宽说明%mf的格式输入,小数点要算一列。

⑥使用自定义的分隔符。

C语言允许输入数据时输入自加的分隔符(注意必须是非格式说明符)。这种情况下,用户输入数据时,必须输入自加的分隔符。

(2)附加说明符*号的作用是抑制输入,即用*说明的输入项不给任何变量。

(3)与格式输出一样,格式输入中的格式说明符与后边的地址列表,在项数、次序和类型方面要一一对应。

(4)格式输入函数的附加说明符中,不能用m.n的形式来试图说明输入数据的宽度和小数位数。

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值