1.1引例
输入半径,分别计算球体积和球表面积。
2.2 C语言的数据类型
(1)基本类型还可以分解成其他类型,主要为整形、字符型和浮点型。
(2)构造类型是根据已定义的一个或多个数据,用构造的方法来定义的。可以理解为,一个构造类型的值由若干个“成员”或“分量”构成。每个“成员”都是一个基本类型或一个构造类型。
C语言中构造类型包括:数组类型,构造类型,共用体类型和枚举类型。
(3)指针时C语言中一种特殊的,同时又具有重要的作用的数据类型。
2.3 C语言的常量
2.3.2直接常量
1.整型常量
整型常量即整数,包括正整数、负整数和零。C语言中,整型常量可以用十进制、八进制和十六进制表示。
十进制表示:由数字0~9,正、负号组成;
八进制表示:以0为前缀,其后由数字0~7组成,八进制数一般是无符号数。
十六进制表示:以0x或0X为前缀,其后由数字0~9和字母A~F(字母大小写均可)组成,十六进制数一般是无符号数。
2.实型常量
(1)小数形式:由整数部分、小数点和小数部分组成,当整数部分和小数部分为零时,可以省略不写,但小数点不可省略。
(2)指数形式:由尾数部分、字母E或e和指数部分组成,格式为:±尾数E指数。
3.字符型常量
字符常量指单个字符,用一对单引号及其括号所括起的字符来表示。
(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符,不能是字符串。
(3)字符可以是ASCII字符集中的任意字符。按ASCII的大小,不同的字符之间存在着次序,以字符的ASCII码值按升序连续排列。
使用字符常量时,每个字符在内存中占用一个字节,用于存储它的ASCII码值。
常见的转义字符
转义字符 | 转义功能 | ASCII码值 |
\0 | 空字符 | 0 |
\a | 响铃 | 7 |
\b | 退格 | 8 |
\t | 水平制表符 | 9 |
\n | 回车换行 | 10 |
\v | 竖向跳格 | 11 |
\f | 换页 | 12 |
\r | 回车 | 13 |
\" | 双引号 | 34 |
\' | 单引号 | 39 |
\? | 问号 | 63 |
\\ | 反斜线字符 | 92 |
\ddd | 1~3位八进制所代表字符 | |
\xhh | 1~2位十六进制所代表字符 |
转义字符使用实例
4.字符串常量
字符串常量是由一对双引号“”括起来的零个或多个字符序列。
字符串中可以使用空格字符、转义字符和其他字符,也可以使用汉字等文字符号。
字符串在内存中占用一段连续的存储单元,系统自动在每个字符串的尾部加上‘\0’作为字符串结束的标志,因此,n个字符组成的字符串,在内存中要占用n+1个字节空间。
2.3.2 符号常量
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必需先定义,其一般形式为:
#define 标识符 常量值
其中#define是一条编译预处理命令,称为宏义命令,其功能是该把该标识符定义为其后的常量值,该标识符称为符号常量。一个#define命令只能定义一个符号常量,若要定义多个符号常量,需要多个#define命令。
利用符号常量计算价格。
符号常量的优点:
(1)增加程序的可读性:通过标识符就知道该常量的意思,既见名之意。
(2)提高程序的可维护性:通过符号常量使得修改常量很方便,只需在常量的定义处修改即可。
(3)简化程序代码:通过符号常量可以简化复杂表达式的复杂输入。
(4)方便数组的定义:可以将整型符号常量作为数组的长度。
2.4 C语言的变量
变量是指在程序运行期间其值可以发生变化的量。
2.4.1 变量的定义和使用
1. 变量的定义
其定义格式:
类型说明符 变量名表
其中:
(1)类型说明符必须是C语言中的有效的数据类型,如int、float、double、char等,用于指定变量的类型,该类型决定了编译时分配给变量的内存单元的多少。
(2)变量名表可以由一个或多个变量名组成,各变量名之间用“,”分隔。变量名必须是合法的C语言标识符,变量名一般使用小写字母。
(3)变量的定义必须放在变量的使用之前,一般在函数体的开头部分进行定义。
例如:
在C语言中,基本类型包括char(字符型),int(整型),float(单精度浮点型)及double(双精度浮点型)等。不同的类型存放不同的数据,所需的储存空间也不相同。
2.变量的初始化
C语言允许在定义变量的同时对变量赋值,这个过程称为变量的初始化。如:
对变量初始化时需注意:
(1)对一个变量赋初值之后,该值被储存在分配给该变量的内存空间中。
(2)不允许对多个未定义的同类型变量连续初始化,如:“int x=y=3;”是不合法的,应写成 “int x=3,y=3;”。
(3)初始化时,一般因使“=”右边表达式的数据类型和“=”左边的变量的类型一致,如果不一致,系统会进行自动复制转换。
(4)没有进行初始化的变量,其值是由定义时所使用的存储类型决定的。全局变量和static变量的值是0或'\0',其它存储类型的局部变量的值是未知的。
3. 变量的使用
变量定义之后,就可以在程序中使用。使用变量时,应先赋值,后引用。
变量使用实例:
分析:在main()函数中定义了三个int型变量a、b、c,一个char型变量ch。若程序运行时输入10
则程序的运行结果如下:
10,75,10,A
2.4.2 整型变量
一个整型变量用来保存整数。在C语言中,整型又可分为:短整型(short int)、整型(int)、长整型(long int)、无符号整型(unsigned int)、无符号短整型(unsigned short int)、无符号长整型(unsigned long int)六种。
C标准没有规定各类整形数据所占内存的字节数,只要求短整形不长于整形,长整型不短于整型
关键字 | 类型 | 占用字节数 | 取值范围 |
short int | 短整型 | 2 | ﹣32768~32767 |
int | 整型 | 4 | ﹣2147483648~2147483647 |
long int | 长整型 | 4 | ﹣2147483648~2147483647 |
unsigned short | 无符号短整型 | 2 | 0~65535 |
unsigned int | 无符号整型 | 4 | 0~4294967295 |
unsigned long | 无符号长整型 | 4 | 0~4294967295 |
说明
(1)各种无符号整数所占的字节数与相应的有符号整数相同。但由于省去了符号位,故不能表示负数。
(2)有符号整数以二进制补码形式储存。最左边第一位表示符号,该位为0,表示正数,该位为1,表示负数。
(3)无符号整数以二进制原码形式组成。
不同类型整型变量的定义与使用实例。
短整型变量的溢出。
2.4.3 实型变量
C语言中实型变量分单精度(float型)和双精度(double型)。
关键字 | 类型 | 占用字节数 | 取值范围 |
float | 单精度型 | 4 | 3.4E-38~3.4E+38 |
double | 双精度型 | 8 | 1.7E-308~1.7E+308 |
单精度型数据能保留7位有效数字,双精度型能保留16位有效数字。
实型变量的使用示例。
2.4.4 字符型变量
字符型变量的值是字符常量,即用单引号引起来的单个字符。字符型常量的类型说明符是char,其类型说明的格式和命名规则与整型变量相同。
由于字符常量在内存中占用一个字节,用于存储它的ASCII码值,所以C语言中的字符具有数值特征,可以像整数一样参加运算,允许对整型变量赋以字符值,也允许对字符常量赋以整数值。C语言在输出时,允许把字符变量按整型量输出,也允许把整形量按字符量输出。
字符变量的使用示例。
把大写字母换为小写字母。
2.5 运算符和表达式
C语言中运算符和表达式数量之多,在其它高级语言中是很少见的。正是丰富的运算符和表达式使C语言功能十分丰富,这也是C语言的特点之一。
2.5.1 赋值运算符和赋值表达式
C语言中赋值运算符有“=”、“+=”、“-=”、“*=”、“/=”和“%=”等。用赋值运算符将运算对象连接而成的表达式称为赋值表达式。
1. 简单赋值运算符
最简单的赋值运算符就是“=”,它的作用就是就是将一个数赋值给另一个变量。
下面是给变量赋值的例子:
int a,b,c=3;
定义a,b,c为整型变量,但只对c进行了赋值操作,c的值为3。
如果对几个变量赋同一个初值,应写成:
int a=3,b=3,c=3;
表示a,b,c的初值都是3。如果写成下面的格式,则是错误的。
int a=b=c=3;
2. 复合赋值运算符
在简单赋值运算符前面加上算术运算符就构成复合赋值运算符。
运算符 | 应用实例 | 等价形式 |
+= | a+=x | a=a+(x) |
-= | a-=x | a=a-(x) |
*= | a*=x | a=a*(x) |
/= | a/=x | a=a/(x) |
%= | a%=x | a=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)赋值表达式的右边也可以是一个赋值表达式,如“a=b=c=6”。由于赋值运算符具有右结合性,上述表达式相当于“a=(b=(c=6))”。
2.5.2 算数运算符和算数表达式
1. 基本的算术运算符
基本算术运算符包括加、减、乘、除和求余等运算,其中加、减、乘、除和求余运算均为双目运算符,所谓双目运算符是指运算时需要两个操作数。
运算符 | + | - | * | / | % |
名称 | 加 | 减 | 乘 | 除 | 求余 |
(1)+ 加法运算符,为双目运算符,其功能是进行求和运算,如3+4的值为7。
(2)- 作为单目运算符使用时,是取负运算,如-3;做为双目运算符使用时,是进行求差运算,如3-4的值为-1.
(3)*乘法运算符,为双目运算符,功能是进行求乘积运算,如3*4的值为12。
(4)/除法运算符,为双目运算符,功能是进行求商运算,如a/b。
(5)%求余运算符,为双目运算符,功能是进行求余数的运算,如a%b,其结果为a除以b后的余数。
2. 自增、自减运算符
C语言有两个特殊运算符“++”和“--”。
(1)++自增运算符,为单目运算符,其功能是使变量的值自加1。自增运算符有两种使用形式:
①前缀方式:用于变量前面,如“int a=++x;”它是“先计算,后使用”,即先将x的值自加1,然后将x的值赋给变量a。
②后缀方式:用于变量后面,如“int a=x++;”它是“先使用,后计算”,即先将x的值赋给变量a,然后将x的值自加1。
(2)--自减运算符,为单目运算符,功能是使变量的值自减1,使用方法与自增运算符相似。
注意:自增和自减运算符的操作对象只能是一个简单变量,不能是常量或表达式,如6--、
(a+b)++都是错误的。
3. 算术运算符的优先级和结合性
C语言规定了运算符的优先级和结合性,单目运算符是右结合的,双目运算符是左结合的。算术运算符的优先级为:“++、--、-”>“*、/、%”>“+、-”,即单目运算符的优先级高于双目运算符,双目运算符中*、/、%的优先级高于+、-。在优先级相同的情况下,按规定的“结合性”进行处理。
4. 算术表达式
算术表达式是由算数运算符、运算对象和括号连接起来的式子,运算对象可以是常量、变量和函数等。
表达式计算以后会得到一个确定的值和类型,其类型是由所使用的具体运算符和运算对象决定的。
算术表达式使用注意:
(1)表达式中的乘号不能省略,且表达式中的所有字符均应写在同一行上。
(2)在表达式中还可以使用多层圆括号(不能使用中括号【】和花括号{}),但是要注意括号的配对。
(3)在数学中,5×6÷4的运算结果与6÷4×5的结果相同,都是7.5,但是C语言中表达式5*6/4的结果却与6/4*5的结果不一样。
输入一个3位的正整数,输出其反序数(如123反序数为321)。
3.5.2 逗号运算符和逗号表达式
C语言中逗号“,”也是一种运算符,称为逗号运算符,其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。逗号表达式一般形式为:
表达式1、表达式2,…,表达式n
(1)逗号表达式的执行顺序是:从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。
(2)逗号表达式是双目运算符,其优先级最低,是左结合的。
(3)并非所有出现逗号的地方都是逗号表达式,如在变量说明语句中,以及函数参数表中逗号只是用作各变量之间的分隔符。
逗号表达式应用示例。
2.5.4 求字节数运算符
运算符sizeof用于计算数据类型所占的字节数,它是一个单目运算符,优先级高于双目运算符,其一般格式如下:
(1)sizeof(表达式)或sizeof表达式
(2)sizeof(数据类型名)
不同数据类型字节数示例。
求字节数运算符示例。
说明:执行语句“a=sizeof(3+5.0);”时,先计算出3+5.0的结果为double型的8.0,然后再求其字节数,其结果为8。执行语句“b=sizeof 3+5.0”时,由于sizeof运算符的优先级高于+运算符,因此先计算sizeof 3,其值为4,然后计算4+5.0=9.0,赋值给int型的变量b时,b=9.“china”是字符串,其字节数为字符串的长度加1个字节,增加的这个字节用于用于存放字符串的结束符'\0'。
2.6 数据类型转换
C语言规定,各种数据类型的数据在一起运算时,不同类型的数据要转换成相同类型的数据才能进行运算。数据类型的转换可以分为自动转换和强制转换。
2.6.1 自动类型转换
不同类型数据在一起运算时,编译系统会自动进行类型转换。进行自动转换的规则是:把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度。
(1)图中横向箭头表示必定转换,如char型,short型数据必定转换为int型,float型数据在运算时将先转换成double型,以提高运算精度(即使两个float数据相加,也要转换成double型,然后再相加)。
(2)图中纵向箭头表示经过横向转换后,进行运算的数据类型仍然不同时进行的转换方式。在不同数据类型的转换过程中,类型转换顺序并不是按箭头方向一步一步的转换,可以没有中间类型转换。
(3)数据类型的各种类型只影响表达式的运算结果,并不能改变原变量的定义类型,并且数据值也不会发生任何改变。
(4) 当赋值运算符两边的运算对象类型不同时也要发生类型装换,转换规则是:把赋值运算符右边表达式的类型转换成左边变量的类型。
2.6.2 强制类型转换
强制类型转换是采用强制类型转换运算符将某种数据类型强制转换成指定的数据类型,其一般形式为:
(类型说明符)(表达式)
功能:把表达试的运算结果强制转换成类型说明符指定的类型。
强制类型转换示例。
分析:计算表达式(float)(a+b)时,是将结果7强制转换为float型的7.0,然后计算7.0/2的结果为7.5。输出c的值时,由于c的数据类型是单精度型的,有7位有效数字,故添了5个0。
强制类型转换时需注意:
(1)需强制类型转换中的表达式一定要括起来,否则只对紧随括号后的量进行转换。
(2)强制类型的转换是一种不安全的转换,如果是从高级类型转换成低级类型,则会损失数据类型的精度。
(3)强制类型转换并不是改变表达式中的类型和值。