目录
2.1引例
1.注释含义
在程序的适当位置插入注释,可以使程序容易被人理解。注释可以出现在程序中任意合适的位置,但必须成对出现注释,出现在某一段代码的前面,使其作用为,说明该段代码的功能出现在一段代码后面,是用于说明该行代码的功能。注意,注释不能出现在语句的中间。
(3)程序中的第二行是
# include < stdio. h>
它是编译预处理命令,因为程序中调用了printf()函数,该函数是C语言提供的标准输出函数,在系统文件stdio. h(称为头文件)中声明,所以在程序开始处要使用include将该文件包含进来。注意C语言有效的预处理命令总是以井开始的,预处理命令的末尾不加分号。关于预处理命令的详细介绍请见第11章。
(4)程序中的第三行是
int main(void)
它是本程序中的“主函数”,在一个C程序中有且仅有一个main()丽数,程序运行时,会首先从main()函数开始执行。该行的关键字int说明main()雨数的返回值是整型数,括号中的void表示main()函数不需要参数。
(5)一对大括号将函数的所有语句括起来,构成了函数体。本程序中的丽数体共有两条语句。第一条语句为
printf("Programming is fun.");.
它由函数调用和分号两部分组成。printf("Programming,isfun.")调用了标准输出雨数,将引号中的内容原样输出到屏幕上(C语言的默认输出设备为屏幕),语句末尾的分号表示该语句结束。注意C语言中除复合语句外的所有语句都必须以分号结束。
main()函数的第二条语句是:
return 0 ;
它结束main()函数的运行,并向系统返回一个整数0,作为程序的结束状态。如果返回0,说明程序运行正常,返回其他值则表示不同的错误情况。系统根据返回值判断程序是否运行成功。
(6)如果需要在两行上输出文字,例2.1可以改写如下:
井include < stdio. h
int main( void)
printf("Programming is fun. \n");1*输出文字后换行
printf("And Programming in Cis even more fun!\n");
retturn 0;
运行结果:
Programming is fun.
And Programming inC is even more fun!
语句printf("Programming is fun. \n")中的\n是换行符,即在输出“Programming isfun.”后换行。\n称为转义字符,关于转义字符的详细介绍请见2.3.1节。
说明:
(1)程序中第2行语句:
#definePI 3.14159
定义了一个符号常量PI,这样程序中凡是需要使用3. 14159的地方,都用PI代替小高了程序的可读性。
(2)main()丽数前面的void表示该函数无返回值。
(3)程序中调用punm数t铺出结果时,将引号内除%f以外的内容原样输出,并第一个%f的位置上输出变量。的值,在第二个位置上输出变量f的值。
由例2.1和例2.2可以看出prinf()丽数不但能够输出固定不变的内容,如例2.1#光的“Programmingis fun. ”,还可以输出变量的值,如例2.2中变量v和f的值。
2.2 C语言的数据类型
C语言程序中所用到的每一个常量、变量和函数等程序的基本操作对象都有种数据类型与之相联系。例如在例2.2中,变量r为整型,变量v和f为单精度浮点型。数据类型决定了数据的取值范围、占用内存的字节数和所能进行的操作。
C语言中可以使用的数据类型如图2.1所示。由图2.1 可知,C语言提供了四种数据类型:基本类型、构造类型、指针类型和空类型。
( 整型
( 基本类型字符型
实型(浮点型)
(数组类型
数据类型3构造类型结构体类型
共用体类型
枚举类型
指针类型
空类型
(1)基本类型还可以分解为其他类型,主要为整型、字符型和浮点型。
(2构造类型是根据已定义的一个或多个数据类型用构造的方法来定义的。可以理解为,一个构造类型的值由若干个“成员"或“分量”构成。每个“成员”都是一个基本类型或一个构造类型。
C语言中构造类型包括:数组类型、结构体类型、共用体类型和枚举类型。
(3)指针是C语言中一种特殊的,同时又具有重要作用的数据类型。
在本章中,首先介绍基本类型中的整型、实型和字符型。其余类型在以后各章中陆续介绍。
2.3 C语言的常量
常量是在程序执行过程中,其值不发生改变的量,分为直接常量和符号常量两种。
2.3.1直接常 量
直接常量又分为整型常量、实型常量、字符型常量和字符串常量。
1.整型常量
整型常量即整数,包括正整数、负整数和零。C语言中,整型常量可以用十进制、八进制和十六进制表示。
十进制表示:由数字0~9,正、负号组成,如369,-663等;
八进制表示:以0(数字0)为前缀,其后由数字0~7组成,如0163,036等;八进制数-一般是无符号数。如0192、-011都是不合法的八进制常量。
十六进制表示:以0x或0X为前缀,其后由数字0≈9和字母A~F(字母大小写均可)组成,如0x12cd,0X6Fa等。十六进制数一-般是无符号数。
注意:
(1)在一个整型常量后面加一个字母u或U,认为是unsigned int型, 如246U。
(2)在一个整型常量后面加一个字母1或L,认为是long int型,如12L。
2.实型常量
实型常量即实数,又称为浮点数。C语言中,实数只能用十进制形式表示,实数的表示方法有两种:小数形式和指数形式
(1)小数形式:由整数部分、小数点和小数部分组成,当整数部分或者小数部分为0时,可以省略不写,但是小数点不可省略。如12. 345,3.,一.123等均为正确的实数。
(2)指数形式:由尾数部分、字母E或e和指数部分组成,格式为:土尾数E指数。如1.23E- 2、3. 14E+3等,它们表示的数值分别为1.23X1072、3. 14X 103
注意:
(1)以小数形式表示实数时,必须有小数点,并且小数点的前、后至少-边要有数字。
(2)以指数形式表示实数时,字母E (成e)的前后必须有数字,并且指数部分只能是整效。如12.-E3、1.5E、E6都是不正确的实数。
在C语言中,实型常量默认为是double型的实数,如果在数的后面加字母f或F(如1.65f、654. 87F),则认为是float 型的实数。
3.字符型常量
宇符常量指单个字符,用对单引号及其括面有以下特点:
$1、?1都是合法的字符常量。在C语言中,字符吊号或其它括号。
(1)字符常量只能用单引号括起来,不能用双宁
(2)字符常量只能是单个字符,不能是字符串。ASCII码白的大小,不同的字符之间衣
按母的ASCII码大于大写字母的
(3)字符可以是ASCII字符集中的任意字符。如小写字
在着次序,以字符的ASCII码值按升序连续排列。
ASCII码,大写字母的ASCI码大于数字字符的ASCII于存储它的ASCII码值。所以C使用字符常量时,每个字符在内存电占用一2
谢中国实行有限工级公作,的收作收祥多加选样,此时相当于对争行的ASTE进行运算。
如4'和4是不同的,4'+1的值是53,因为4的ASCII值是52。字符'a'的ASCIR是97,则一1二8、对,于学相业这是因为小写字母与心”的ASCI码按开序连续排列,字符'a'的ASCII码加1,就是字符b'的ASCI码。
附录1中的ASCII字符集列出了所有可以使用的字符。
另外,对于控制符(如回车、换行等)与不可见字符,在C语言中通过转义字符来表示,转义字符是用开头后面加上二个字符或用八进制、十六进制表示的ASCII码值组成的作用是改变其后面的字符或ASCI码值的原有意义,转义为另外的含义。
4.字符串常量
字符串常量是由一对双引号" "括起来的零个或多个字符序列,如:”HelloWorld".
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号。如:”china"、"你好Visual C"、"\tVisual C"等。字符串中还可以使用空字符,如:"表示空串,即不包含任何字符。
字符串常量在内存中占用一段连续的存储单元,系统自动在每个字符串的尾部加上\0'作为字符串的结束标志,因此,n个字符组成的字符串,在内存中要占用n十1个字节空间。可以使用sizeof运算符(见2.5.4节)来计算字符串占用的内存空间大小。
2.3.2符号常量
在C语言中可以用一个标识符来表示一个常量, 称之为符号常量符号常量在使用之前必须先定义,其一 般形式为:
#define标识符常量值
其中#define是一条编译预处理命令,称为宏定义命令(见11.1节),其功能是把该标识符定义为其后的常量值,该标识符称为符号常量。一个#define命令只能定义一个符号常量,若要定义多个符号常量,需使用多个#define命令。
[例2.4]某程序需要使用一个代表常数3.145的符号常量名xp,分析以下定义正确与否。
A.井define xp 3.145;
B. #define xp(3. 145)
C. #define xp=3.145
D. #define xp 3.145
分析:
入洗项错误,#define是编译预处理命令,个是C语言中的语句,末尾不能加“”B.C选项错误,不符合符号常批定义的语法形式。
D选项正确。
符号常量的使用,可以为编写程序提供很多好处
(1)增加程序的可读性:通过标识符就知道该常量的意思,即见名知义。
(2)提高程序的可维护性:通过符号常量使得修改常量很方便,只需在常量的定义处修改即可。
(3)简化程序代码:通过符号常量可以简化复杂表达式的重复输人。
(4)方便数组的定义:可以将整型符号常量作为数组的长度。
2.4 C语言的变量
变量是指在程序运行期间其值可以发生变化的量。变量用于从外部接收数据、保存一此不断变化的值、保存中间结果及最终结果,而这些都无法用常量来实现。一个变量应该有一个名字 即变量名,在内存中 占据一定的存储单元,在该存储单元中存放变量的值。
变量名实际上是一个符号地址,程序在编译时由系统给变量分配一定的内存空间。程序中对变量进行处理时,,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据,也就是变量的值。
2.4.1 变量的定义与使用
在C语言中,所有的变量必须先定义后使用。
1.变量的定义
其定义格式:
类型说明符变量名表;
其中:
(1)类型说明符必须是C语言中的有效数据类型,如int、float、double、char等,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少。收
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。变量名必须是合法的C语言标识符,变量名一般使用小写字母
(3)变量的定义必须放在变量的使用之前,,一般在函数体的开头部分进行定义。
例如:
Int r;
/*定义r为整型
float v,f;
/*定义vf为单精度浮点型+人
double x,y;
*定义x、y为双精度浮点型*/
char ch;
/*定义ch为字符型*/
在C语言中,基本数据类型包括char(字符型)int(整型)、float(单精度浮点型)及double(双精度浮点型)等。不同的类型用于存放不同的数据、所需的存储空间也不相同。2.变量的初始化
C语言允许在定义变量的同时对变量赋值,这个过程称为变量的初始化。如
int x=2;
*定义一个整型变量x并赋初值2人↓
的
ints=1,t=1;
/*定义两个整型变量s和t,并分别赋初值1*/
float f =3.68;
/*定义一个单精度型变量f并赋初值3.68 */
char ch='x';
/*定义一个字符型变量ch并赋初值字符x */806
2.4.2整型变量
-一个整型变量用来保存整数。在C语言中,整型又可分为:短整型(short int)、整型(int)、长整型(long int)、无符号整型(unsigned int) 、无符号短整型(unsigned short int)和无符号长整型(unsigned long int)六种。
C标准没有规定各类整型数据所占内存的字节数,只要求短整型不长于整型,长整型不短于整型。某种类型的数据所占内存的大小随编译系统的不同而有差异,可以使用sizeof运算符(见2.5.4节)计算某种数据类型占用内存的大小。在Visual C++ 2010环境下,各种整型的关键字及占用内存字节数和取值范围如表2.2所示。
2.4.3实型变量
C语言中实型变量分单精度(float型)和双精度(double型)两类。在VisualC++2010环境下,各种实型的关键字及占用内存字节数和取值范围如表2.3所示。
表2.3实型数据关键字、字节 数和取值范围
关键字
类型
占用字节数 4
取值范围3.4E-38~3.4E+ 38
float
单精度型
double
双精度型
8
只像吗6位小数
1.7E- 308~1.7E+ 308
运行结果:
a=1234. 567871,b= 1234.567896
由于a是单精度浮点型,有效数字位数为了位,其中整数已占4位,故3应小数之后的均为无效数字。b虽然是双精度型,有效数字位数为16位,但VisualC+t十2010规定双精度小数后最多保留6位,其余部分四舍五人。
2.4.4字符型 变量
字符型变量的值是字符常量,即用单引号引起来的单个字符。字符型变量的类型说明符是char,其类型说明的格式和命名规则与整型变量相同。
例如:
char c1,c2;
由王字符常量在内存中占用一个字节,用于存储它的ASCII码值,所以C语言中的字符具有数值特征,可以像整数一样参 加运算,允许对整型变量赋以字符值,也允许对字符变常以整型值,C语言在输出时允许把字符变量按整型量输出,也允许把整型量按字符量输出。
2.5运算符和表达式
C语言中运算符和表达式数量之多,在其他高级语言中是很少见的。正是丰富的运算符和表达式使C语言功能十分完善,这也是C语言的特点之一。
本节介绍其中的一部分运算符,其他的运算符将陆续在后续各章中讲述。
2.5.1 赋值运算符和赋值表达式
C语言中赋值运算符有“一”、“十二”“一片”、“*一”、“/=”和“%=”等。用赋值运算符将运算对象连接而成的表达式称为赋值表达式。
1.简单赋值运算符
最简单的赋值运算符就是“二”,它的作用是将个数值赋给 一个变量。 如r=2的作用是执行一次赋值操作(或称赋值运算)。把常量2赋给变量r。也可以将一个表达式的值赋给一个变量。
下面是给变量赋值的例子:
int a,b,c= 3;
定义a,b,c为整型变量,但只对c进行了赋值操作,c的值为3。
2.复合赋值运算符
等价形式
表2.4
应用举例
a=a+(x)
运算符
a=a* (x)
a/(x)
a/=x
a=a%(x)
a%= x
3.赋值表达式
在C语言中赋值语句属于表达式语句。赋值表达式是由赋值运算符将个变量和个表达式连接起来的式子所组成。它的一般形式为
变量一表达式
由于赋值表达式的作用是将一个表达式的值赋给一个变量,因此赋值表达式具有计算和赋值的双重功能。需要注意!赋值运算符的左侧必须是一个变量。
下面是赋值表达式的例子:
v-4.0*PI*r¥r*r/3.0
a=15十(i-6)
b=(x=3)+(y-4)
而“3=x”和“a+b一4”都是错误的赋值表达式。
赋值表达式的执行过程是:
(1)计算赋值运算符右侧表达式的值。
(2)将所计算出的值赋给赋值运算符左侧的变量。
区分赋值表达式和赋值语句的方法是:
就值表法式的末尾没有分号,而赋值语句的末尾必须有分号,在一个表达式中可以包含一个 或多个赋值表达式,但绝不能包含赋值语句。
注意:(1)如果“一”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型。
(2)赋值表达式的右边也可以是个赋值表达式,如“b-c-6"。由于赋值运算符具
求余运算要求参与运算的两个运算对象都必须是整型,其结果也是整型。如4%3的结果为1。求余运算结果的符号与第一- 个操作数符号相同,如一4%3的值为一1,4%-3的值为1。
2.自增、自减运算符
C语言有两个特殊运算符“++”和“一一”
(1)++自增运算符,为单目运算符,其功能是使变量的值自加1。自增运算符有两种使用形式:
①前缀方式:用于变量前面,如“int a=十十x;”它是“先计算,后使用”,即先将x的值自加1,然后将x的值赋给变量a
②后缀方式:用于变量后面,如“inta=x++ ;”它是“先使用,后计算”,即先将x的值赋给变量a,然后再将x的值自加1。
(2)--自减运算符,为单目运算符,功能是使变量的值自减1,使用方法和自增运算符
D所谓结合性是指在运算对象左右的运算符优先级相同的情况下,先与哪一边结合,分为左结合(自左至右)和右结合(自右至左)。例如结合是自左至右时,对于表达式x-y+z则y应先与“一”号结合,执行x-y运算,然后再执行十2的运算。这种自左至右的结合方向就称为“左结合”。而自右至左的结合方向称为“右结合"。最典型的右结合运算待是赋值运算符。如x=y=z,由于“="是右结合 ,应先执行y=z再执行x≈(y=z)运算。
分析以下各表达式使使用正确与否。C.c十++。B.C选项中进进行自增运算的对象在A.(-x)+十B.y++不能是常量或表达式,B为d是常量,都不能进行自地分析,且地运算行的操作对多不是表达式,D选项中的
是已定义的变量,,使用正确:A选项中一 ,
运算,因此A、D选项错误。
3.算术运算符的优先级和结合性
单目运算符是右结合的,,双目算术运算符是左
C语言规定了运算符的优先级和结合性
1.%">"+、一”,即单日运算往
结合的。算术运算符的优先级为,由%的优先级高于+、一。在优先级相同的优先级高于双目运算符,双目算术运算符中*、/
的情况下,按规定的“结合性”进行处理。
阿的对于达式10/2 (3+4),由于()的优先级最高,则先计算3十4的值为7。然后和的优先级相同,则按照左结合性,先计算1.0/2 的值为0.5.最后再进行0.5*7的乘让运算,最后表达式的值为3.500000。
4.算术表达式
算术表达式是由算术运算符、运算对象和括号连接起来的式子,运算对象可以是常量、变量和函数等。如a+b、3*(x+y)都是算术表达式。
通常数学表达式均可写成C语言的算术表达式,如数学表达式→n(x-1)可写成1 *n*(x-1)/3.0。 但也有些数学表达式无法直接用C语言的算术表达式写出,如3"(4"'-1),此时需要调用C语言中的数学函数来实现(数学函数的使用见3.4节,常用的数学函数见附录C),则数学公式“1
3n(4n'-1)”对应的C语言表达式是1.0/3*n*(4
pow(n,i)-1)。
象决定。起达式计算以后会得到一个确定的值和类型,其类型由所使用的具体运算符和运算对
d”值的类型为double。
算术表达式使用注意:
(1)表达式中的乘号:不能省略,且表达式中中的所有字符均应写在同-行上。(2)在表达式中还可以使用多层圆括号(不能用中括号[]和花括号{)),但是要注意括号的配对。
2.6数据类型转换
C语言规定,各种不同数据类型的数据在一起运算时,不同类型的数据要先转换成相同米型的数据能进行运算。数据类型的转换可以分为自动转换和强制转换。
2.6.1自动类型转换
不同类型的数据在一起运算时 ,编译系统会自动进行类型转换。进行自动转换的规则具把占用内存空间少的(低级)类型向古用空间多的(高级)类型转换,以保证运算的精度,如图2.2所示。
说明:
(1)图2.2中的横向箭头表示必定的转换,如char型、short型数据必定先转换为int型,float型数据在运算时将先转换成double型,以提高运算精度(即使是两个float型数据相加,也要先转换成double型,然后再相加)。
(2)图2.2中的纵向箭头表示当经过横向的转换后,进
double
float
行运算的数据类型仍然不同时进行的转换方式。在不同数
据类型的转换过程中,类型转换顺序并不是按箭头方向
步一步的转换,可以没有中间类型转换。例如int型与
long
double型数据进行运算,先将int型的数据直接转换成
double型,然后再进行两个同类型(double型)数据的运算。
(3)数据类型的各种转换只影响表达式的运算结果,并
unsigned
不改变原变量的定义类型,并且其数据值也不会发生任何
改变。
(4)当赋值运算符两边的运算对象类型不同时,也要发x低int
char, short
生类型转换,转换的规则是:把赋值运算符右边表达式的类
图2.2数据类型自动转换规则
型转换为左边变量的类型。
[例2.17]若有定义“double int i= 10;float f=3. 8,d-153;”,则表达式d+'a'+i* d/f的值的类型是double型。
分析:进行表达式“d+'a'+i* d/f"的运算时,根据自动转换规则:
(1)将int型变量i和float型变量f转换为double型后,进行i* d/f的运算,结果为double型。
(2)将char型常量'a转换为int型,进行d+'a'的计算,此时“+"左右两边数据的类型不同,则再将int型转换为double型,进行加法运算,结果为double型
(3)将(1)的结果和(2)的结果进行加法计算,最终结果为double型。
2.6.2强制类型转换
强制类型转换是采用强制类型转换运算符将某种数据类型强制转换成指定的数据类型,其一般形式为
(类型说明符)(表达式)
功能:把表达式的运算结果强制转换成类型说明符指定的类型。不,