表22整型量取值范围 所占位数取值范围 32768~32767 2147483648~2147483647 0~429497295 如果是32位机,则int和 unsigned的取值与long和 unsigned long相同 例2.2 maino) int a, b, c, d; b=4 d=(a+b)美c; printf ("%d n",d); 运行结果 2.4.2浮点型变量 浮点型变量也称实型变量,有单精度和双精度之分 单精度浮点型变量用关键字foat说明,双精度浮点型变量用关键字 double说明。如: double d 般来讲,oat型变量占据4个字节(32位)存储空间,绝对值取值范围约在10 103之间取6~7位有效数字; double型占据8个字节(64位)存储空间,取值范围由具体机 器决定,有12~16位有效数字除foat和 double型外, ANSI C还增加了 long double类 型,占16字节(128位),有效数字约24位,但多数C编译中没有设置。 前面的例21就是一个使用浮点型变量的例子。 24.3字符型变量 字符型变量由关键字char说明 如 char cl, c2; 个字符型变量占据一个字节(8位)存储空间只能存放一个字符。不要以为它能够存 放一个字符串,如:
是正确的,而 则是错误的 字符型变量的值实质上是一个8位的整数值因此取值范围一般是-128-127,char型 变量也可以加修饰符 unsigned,则 unsigned char型变量的取值范围是0~255(有些机器把 har型当做 unsigned char型对待,取值范围总是0~255) C语言把字符型量当做一个较小的整型量,可以象整型量一样使用它。 例23 har c3, c4; c3=c1-('a-'A’) printf("%c%c\n",c3, c4); 运行结果为 程序中的'a’-'A'是大小写字母之间的差值(别忘了字符对应相应的ASCI码),其 值为32。也可以把程序写成 效果是一样的, printf中的%c表示输出一个字符。 字符型数据也可以用整数形式输出,如将输出语句改为 printf("%d %d\n, c3, c4); 则运行结果为 2.4.4变量赋初值 变量定义之后,我们可以用赋值的形式给它确定的值,也可以在定义变量的同时给它设 置初值。如例2.3也可写成 maIn A c4=c2-(a,-A’);
printf("%c%c\n",c3, c4)i 在这里 char cl 就相当于 char cl 两条语句。 第五节算术运算符和算术表达式 2.5.1算术运行符 C语言中有5种算术运算符 +(加法运算符) (减法运算符) (乘法运算符) \(除法运算符) %(模运算符 这里的+、*、\、%都是双目运算符,即它们在参与运算时,左右各需要一个运算对象 (运算数),而“”既是双目运算符,又是单目运行符。当作为单目运行符时,只需要后跟一个 运算对象表示取它的负值 符号“*”表示乘,在C语言中(其他语言也大致如此)不能用数学中习惯的X或·号表 示乘,也不能什么都不写,如:2*a不能写做2a,2Xa或2·a 符号/表示除,不能用÷号(键盘上没有它)。当除数和被除数都是整数时,其商也是整 数如5/3结果为1 符号%只能用于整数,表示求模运算,即两个数相除的余数,如5%3结果为2,9%4 结果为1。 25.2算术表达式 C算术表达式由运算对象(常量变量、函数等)、圆括号和运算符组成。最简单的情况, 个常量,一个变量(赋过值的)都是合法的表达式,如5,0,x等。作为一般情况,则可有更多 的运算符和圆括号,如 -a/(b1+0.5)-11%7*'a 要注意,C表达式中的所有字符都是写在一行上的,没有分式,也没有上下标,括号只有 圆括号一种(方括号和花括号作其他用途),如数学表达式 需要写成 (a+b)/(c+d) 这里括号是不可缺少的如没有括号实际上就变成了 18
算术运算符的优先级是单目减最高然后是乘除最后是加减圆括号可用来改变优先 级。图2-5给出C语言中算术运算的优先级与结合规则。 (从右向左结合) 从左向左结合 (从左向左结合) 图25运算符的优先级和结合性 了解了算术运算符的优先级和结合规则我们可以看一下表达式-a/((b1+0.5) 11%7*'a'的求值过程: 求-a的值 ②求b1+0.5的值 ③求①/②的值 ④求11%7的值 ⑤求④*'a’的值 ⑥求③-⑤的值。 C表达式不论简单还是复杂,最终总是可以求出值,也就是说,C表达式的本质是一个 值。因此,表达式可以出现在数值能够出现的任何地方,这也意味着,如果表达式中有变量 则变量在被引用之前,必须是已赋过值的 例2.4求二次方程的根,假定b2-4ac≥0。 include "math h" maino float a, b, c, xl, x2 printf("Input a,b,c(b*b-4*a*c>=0)n"); scanf ("%f%f%f, &a, &b, &c)i x1=(-b+sqr(b*b-4*a“c))/(2*a); t(b*b-4a*c))/(2兼a); printf ("x1=%f, x2=%fn",x1, x2)i 运行结果 Input a,b,c(b米b-4并a兼C>=0) xl=5.000000,x2=1.000000 程序中求平方根的库函数sgrt需要用到文件 math. h中的信息,所以在程序最前面加 上 include命令。要注意的是,求x1和x2时表达式中的括号都是必须的,如果写成 btsgrt(b*b-4* a *c)/(2*a)
实际上相当于数学表达式 而写成 (-btsgrt(b* b-4*a*c)/2*a 则相当于数学表达式 b+√b3-4 显然这都是不对的。当把一个用分式表示的数学表达式转为C表达式时,一个较好的 方法是分子分母分别用括号括起。 25.3类型转换 如果一个运算符两边的运算数类型不同先要将其转换为相同的类型即较低类型转换 为较高类型,然后再参加运算,转换规则如图26所示 double float 高 低 图2-6类型转换 图中横向箭头表示必须的转换,如两个foat型数参加运算,虽然它们类型相同,但仍要 先转成 double型再进行运算,结果亦为 double型。纵向箭头表示当运算符两边的运算数为 不同类型时的转换如一个bong型数据与一个int型数据一起运算需要先将int型数据转 换为long型,然后两者再进行运算结果为long型。所有这些转换都是由系统自动进行的 使用时你只需从中了解结果的类型即可 上面说的转换是自动的,而另一方面,C语言也提供了以显式的形式强制转换类型的机 制,其一般式为 (类型名)(表达式 其效果是把表达式的类型强制转换为要求的类型,而不管类型的高低,如 double)a(将a转换成 double型) (int)(x+y)(将x+y的结果转换为int型) 要转换的表达式要用括号括起,如 (int)(x+y 与 是不同的,后者相当于int)(x)十y,也就是说,只将x转换成整型,然后与y相加。 在许多场合强迫转换是必须的,如用sqrt求一个整数n的平方根,sgrt要求一个双精 度型参数,如果用整型则可能得不到正确的结果因此必须强制转换n为 double型,写成 sqrt((double)n) (有些系统可以自动将整型量转换为 double型再求平方根,但你不应该依赖系统,因为那会