实型常量又称实数或浮点数。在C语言中可以用两种形式表示一个实型常量。在内存中,实数一律是以指数形式存放的。 1、小数形式
小数形式是由数字和小数点组成的一种实数表示形式,例如1.123、.123、123.、0.0等都是合法的实型常量。注意:小数形式表示的实型常量必须要有小数点。 2、指数形式 以“e”或“E”后跟一个整数来表示以10为底的幂数。2.3026可以表示为0.23026E1、2.3026e0、23.026e-1。C语言的语法规定,字母e或E之前必须要有数字,且e或E后面的指数必须为整数。如e3、.5e3.6、.e3、e等都是非法的指数形式。注意:在字母e或E的前后以及数字之间不得插入空格。 2.4.2实型变量
C语言中实型变量分为单精度型和双精度型两种,分别用类型名float和double进行定义。 在一般计算机系统中,为float类型的变量分配4个字节的存储单元,为double类型的变量分配8个字节的存储单元。实型的变量只能存放实型数,不能用整型变量存放一个实数,也不能用实型变量存放一个整数。
在VC 6.0中单精度实数(float类型)的数值范围约在-1038~1038之间,并提供7位有效数字位;绝对值小于l0-38的数被处理成零值。双精度实数(double类型)的数值范围约在-10308~10308之问,并提供l5~16位有效数字位,具体精确到多少位与机器有关;绝对值小于l0-308的数被处理成零值。因此double型变量中存放的数据要比float型变量中存放的数据精确得多。注意,在VC 6.0中,所有的float类型数据在运算中都自动转换成double型数据。
注意:在计算机中可以精确地存放一个整数,不会出现误差,但实型数的数值范围较整型大,还往往存在误差。 ◆ 【例题分析】
(2009年3月)以下选项中,能用作数据常量的是(D) A)o115 B) 0118C) 1.5e1.5D)115L (习题)以下选项中正确的实型常量是(B) A)0B)3.1415C)0.329×102 D).872
(习题)以下选项中不正确的实型常量是(B) A)2.607E-1B)0.8103 e 2C)-77.77 D)456e-2 2.5 算术表达式
2.5.1基本的算术运算符
在C语言中,基本的算术运算符是:+、-、*、/、%,分别为加、减、乘、除、求余运算符。这些运算符需要两个运算对象,称为双目运算符。除求余运算符%外,运算对象可以是整型,也可以是实型。如l+2、1.2*3.2。 求余运算符的运算对象只能是整型。当运算数为负数时,所得结果的符号随机器的不同而不同。
“+”和“-”也可用作单目运算符,运算符必须出现在运算数的左边。 说明:
(1)如果双目运算符两边运算数的类型一致,则所得结果的类型与运算数的类型一致。例如:1.0/2.0,其运算结果为0.5;1/2,其运算结果为0。
(2)如果双目运算符两边运算数的类型不一致,系统将自动进行类型转换,使运算符两边的类型达到一致后,再进行运算。在进行双目运算时,若运算符两边的运算数类型不一致,其类型转换规律如下表。
6 / 26
(3)在C语言中,所有实型数的运算均以双精度方式进行。若是单精度数,则在尾数部分添0,使之转化为双精度数。
2.5.2运算符的优先级、结合性和算术表达式
在C语言中,常量、变量、函数调用以及按C语言语法规则用运算符把运算数连起来的式子都是合法的表达式。凡是表达式都有一个值,即运算结果。
例如:表达式(5+1)/2的运算结果是3,圆括号的优先级高于除号;表达式5+1/2的运算结果是5,除号的优先级高于加号;表达式5*-2的运算结果是-10,单目运算符“-”的优先级高于乘号,这个表达式与5*(-2)等价。
用算术运算符和圆括号将运算数(或称操作数)连接起来的、符合C语言语法的表达式称为算术表达式。
算术表达式中,运算对象可以是常量、变量和函数等。例如:2+sqrt(c)*b. 2.5.3 强制类型转换表达式
强制类型转换表达式的形式如下:(类型名)(表达式)
(类型名)称为强制类型转换运算符,利用强制类型转换运算符可以将一个表达式的值转换成指定的类型,这种转换是根据人为要求进行的。例如:表达式(int)3.234把3.234转换成整数3;表达式(double)(10%3)把10%3所得结果l转换成双精度数。 ◆ 【例题分析】
(2009年9月)表达式:(int)((double)9/2)-(9)%2的值是(B) A)0 B)3 C)4 D)5
(2008年9月)以下不能正确表示代数式2ab/cd的C语言表达式是(D) A)2*a*b/c/d B)a*b/c/d*2 C)a/c/d*b*2 D)2*a*b/c*d
(2009年9月)若有语句double x=17;int y;,当执行y=(int)(x/5)%2;之后y的值为 【7】 。(答案:1)
(2009年3月)表达式(int)((double)(5/2)+2.5)的值是【6】。(答案:4) 2.6 赋值表达式
2.6.1赋值运算符和赋值表达式
在c语言中,赋值号“=”是一个运算符,称为赋值运算符。由赋值运算符组成的表达式称为赋值表达式,其形式如下:变量名=表达式
赋值号的左边必须是一个代表某一存储单元的变量名,对于初学者来说,只要记住赋值号左边必须是变量名即可。赋值号的右边必须是C语言中合法的表达式。赋值运算的功能是先求出右边表达式的值,然后把此值赋给赋值号左边的变量,确切地说,是把数据存入以该变量为标识的存储单元中去。
例如,a和b都被定义成int类型变量: a=10;/*把常量10赋给变量a*/
b=a; /*把a中的值赋给变量b,a中的值不变*/ 在程序中可以多次给一个变量赋值,每赋一次值,与它相应的存储单元中的数据就被更新一次,内存中当前的数据就是最后一次所赋的那个数据。 2.6.2复合赋值表达式
7 / 26
在赋值运算符之前加上其他运算符可以构成复合赋值运算符。c语言规定可以使用10种复合赋值运算符,其中与算术运算有关的复合赋值运算符有:+=、-=、*=、/=、%=(注意:两个符号之间不可以有空格)。复合赋值运算符的优先级与赋值运算符的优先级相同。表达式n+=1的运算规则等价于n=n+1,表达式n*=m+3的运算规则等价于n=n*(m+3),因为运算符“+”的优先级高于复合赋值运算“* =”。其他以此类推。
例,已有变量a,其值为9,计算表达式 a+=a-=a+a的值。 2.6.3 赋值运算中的类型转换 在赋值运算中,只有在赋值号右侧表达式的类型与左侧变量类型完全一致时,赋值操作才能进行。如果赋值运算符两侧的数据类型不一致,在赋值前,系统将自动先把右侧表达式求得的数值按赋值号左边变量的类型进行转换,也可以用强制类型转换的方式人为地进行转换后将值赋给赋值号左边的变量。这种转换仅限于数值数据之问,通常称为“赋值兼容”。对于另外一些数据,例如后面将要讨论的地址值就不能赋给一般的变量,称为“赋值不兼容”。 ◆ 【例题分析】
(2009年3月)设有定义:int x=2;以下表达式中,值不为6的是(D) A)x*=x+1 B)x++,2*xC)x*=(1+x)D)2*x,x+=2
(2010年3月) 若有定义语句:int x=10;,则表达式x-=x+x的值为(B) A)-20 B)-10 C)0 D)10
2.7 自加、自减运算符和逗号运算符
2.7.1自加运算符“++”和自减运算符“--” (1)自增/减运算符“++/--”的运算结果是使运算对象的值增1或减l。如i++,相当于i=i+1;i--,相当于i=i-1。因此,自加或自减运算本身也是一种赋值运算。
(2)运算符“++”和“--”是单目运算符,运算对象可以是整型变量也可以是实型变量,但不能是常量或表达式,因为不能给常量或表达式赋值。因此,如++3、(i+j)--等都是不合法的。
(3)用自加或自减运算符构成表达式时,既可以前缀形式出现,也可以后缀形式出现。例如:++i、--i、i++、i--等都是合法的表达式。无论是作为前缀运算符还是作为后缀运算符,对于变量本身来说自增l或自减1都具有相同的效果,但作为表达式来说却有着不同的值。例如,若变量i为int类型,且已有值为5。若表达式为++i,则先进行i增1运算,i的值为6,表达式的值也为6;若表达式为i++,则表达式先取i的值为5,然后i进行增1运算,使i中的值为6。
(4)运算符“++”和“--”的结合方向是“自右至左”。例如有一表达式-i++,其中i的原值为3。由于负号运算符与自加运算符的优先级相同,结合方向是“自右至左”,即相当于对表达式-(i++)进行运算,此时自加运算符“++”为后缀运算符,(i++)的值为3,因此-(i++)的值为-3,然后i自增为4。
(5)不要在一个表达式中对同一个变量进行多次诸如i++或++i等运算,例如写成: i++*++i+i--*--i,这种表达式不仅可读性差,而且不同的编译系统对这样的表达式将做不同的解释,进行不同的处理,因而所得结果也各不相同。 2.7.2逗号运算符和逗号表达式 “,”是c语言提供的一种特殊运算符,用逗号将表达式连接起来的式子称为逗号表达式。逗号表达式的一般形式为:表达式1,表达式2,??,表达式n 说明:
(1)逗号运算符的结合性为从左到右,因此逗号表达式将从左到右进行运算。即,先计算表达式1,然后计算表达式2,依次进行,最后计算表达式n。最后一个表达式的值就是此逗号表达式的值。例如:(i=3,i++,++i,i+5)这个逗号表达式的值是10,i 的值为5。
8 / 26
(2)在所有运算符中,逗号运算符的优先级最低。 第二章能力点
1、掌握C的数据类型、常量、变量及表达式,并运用于C程序设计的能力; 2、在Visaul C++ 6.0中调试表达式的能力。
第3章 顺序结构
在程序中若按语句出现的顺序逐条执行,由这样的语句构成的程序结构称为顺序结构。 3.1 赋值语句
在赋值表达式尾部加上一个“;”号,就构成了赋值语句,也称表达式语句。例如a=b+c是赋值表达式,a=b+c; 则是赋值语句。i++;、--i;、a=b=c、a=b,b=c;等也是赋值语句。要注意,不要把变量定义时的赋初值和赋值语句混为一谈。
C语言中可由形式多样的赋值表达式构成赋值语句,用法灵活,因此读者首先应当掌握好赋值表达式的运算规律才能写出正确的赋值语句。 3.2数据输出
把数据从计算机内部送到计算机外部设备上的操作称为“输出”。例如把计算机运算结果显示在屏幕上或打印在纸上,或者送到磁盘上保存起来。从计算机外部设备将数据送入计算机内部的操作称为“输入”。
C语言本身并没有提供输入输出语句,但可以通过调用标准库函数中提供的输入和输出函数来实现输入和输出。C语言提供了丰富的用于输入和输出的库函数。在VC++ 6.0环境下,在调用输入和输出的库函数之前要求在源程序中出现包含头文件stdio.h的命令行: #include
3.2.1 printf函数的一般调用形式
printf函数是C语言提供的标准输出函数,用来在终端设备上按指定格式进行输出。 printf函数的调用形式如下:
printf(格式控制,输出项1,输出项2,?)
格式控制是字符串形式。在printf函数调用之后加上“;”,则构成输出语句。 例如:printf(“a=%d,b=%d”,a,b);
以上输出语句中,printf是函数名,用双引号括起来的字符串部分“a=%d,b=%d”是输出格式控制,决定了输出数据的内容和格式。a,b称为输出项,是printf函数的实参。 printf函数中格式控制的作用是: 1.给输出项提供输出格式说明
输出格式说明的作用是将要输出的数据按照指定的格式输出。格式说明由“%”符号和紧跟在其后的格式描述字符组成。当输出项为int类型时,用d作为格式描述字符,其形式为%d;当输出项为float或double类型时,用f或e作为格式描述字符,其形式为%f或%e(对于double类型也可用%lf或%le)。
9 / 26
2.提供需要原样输出的文字或字符
除了格式转换说明外,字符串中的其他字符(包括空格)将按原样输出。这样使得输出结果具有可读性。
printf的各输出项之间用逗号隔开(函数的各个参数之间必须用逗号隔开)。输出项可以是任意合法的常量、变量或表达式。printf可以没有输出项,此时函数的调用形式为printf(格式控制),输出结果就是格式控制中的字符串。
例如:printf(“OK!”);将输出字符串:OK!。 3.2.2 printf函数中常用的格式说明
格式控制中,每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之间可以根据需要插入“宽度说明”、左对齐符号“-”、前导零符号“0”等。 1.格式字符 %后允许使用的格式字符和它们的功能如下表所示。在某些系统中,可能不允许使用大写字母的格式字符,因此为了使程序具有通用性,写程序时应尽量不用大写字母的格式字符。 格式字符 说 明 c 输出一个字符 输出带符号的十进制整型数。%ld为长整型(16位编译器上必须使用),%hd为短整d或i 型,%i64d为64位长整数(VC++4.0以上版本输出_int64类型的整数) 以八进制格式输出整型数。%o不带先导0,例如十进制数15用%o输出为17;%#o加o 先导0,例如十进制数15用%#o输出为017 以十六进制格式输出整型数。不带先导0x或0X,例如十进制数2622用%x数据格式x 输出为a3e,用%X数据格式输出为A3E;%#x输出带先导0x或0X的十六进制数,例如十进制数2622用%#x数据格式输出为0xa3e,而用%#X数据格式输出为0XA3E u f 以无符号十进制形式输出整型数 以带小数点的数学形式输出浮点数(单精度和双精度数) 以指数形式输出浮点数(单精度和双精度数),格式是:[-]m.dddddde±XXX或[-]m.ddddddE±xxx。小数位数(d的个数)由输出精度决定,隐含的精度是6。若指e 定的精度为0,则包括小数点在内的小数部分都不输出。XXX为指数,保持3位,不足补0。若指数为0,输出指数是000 g s p % 由系统决定采用%f格式还是采用%e(或%E)格式输出,以使输出宽度最小 输出一个字符串,直到遇到”\\0”。若字符串长度超过指定的精度则输出完整字符串 输出变量的内存地址 也就是%%形式,输出一个% 2.长度修饰符
在%和格式字符之间,可以加入长度修饰符,以保证数据输出格式的正确和对齐。对于长整型数(long)应该加l,即%ld;对于短整型数(short)可以加h,即%hd。
10 / 26