本例中,a,b被说明为字符变量并赋予字符值,C语言允许字符变量参与数值运算,即用字符的 ASCII码参 与运算。由于大小写字母的 ASCII码相差32,因此运算后把小写字母换成大写字母。然后分别以整型和字符 型输出 [Practice//chariot a=49 char b char b=a+10 d=a+b: Vtable 2,49 b,1,随机 d,1,随机 of Vtable Vupdate 2,随机 3,随机 3,1 of Vupdate of Practice [Practicel//char cl, c2 c1=a'c2='b c1=cl-32:c2=c2-32. Vtable 2,1,随机 of vtable Vupdate 1,随机;2,随机 1,’a';2,"b of vupdate of Practice 字符串常量 字符串常量是由一对双引号括起的字符序列。例如:" CHINA"," C program:","$12.5″等都是合法的字 符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别: 1.字符常量由单引号括起来,字符串常量由双引号括起来。 2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相 应的字符串变量。 这是与 BASIC语言不同的。但是可以用一个字符数组来存放一个字符串常量。在数组一章内予以介绍。 4.字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节 中存放字符"0″( ASCII码为0)。这是字符串结束的标志。例如,字符串" C program"在内存中所占的字节为: C program(0。字符常量a和字符串常量"a"虽然都只有一个字符,但在内存中的情况是不同的
本例中,a,b 被说明为字符变量并赋予字符值,C语言允许字符变量参与数值运算,即用字符的 ASCII 码参 与运算。由于大小写字母的 ASCII 码相差 32,因此运算后把小写字母换成大写字母。然后分别以整型和字符 型输出。 [Practice] //charint a=49; char b; char d; b=a+10; d=a+b;'Vtable a,2,49 b,1,随机 d,1,随机 of Vtable 'Vupdate 1,49 2,随机 3,随机 2,';' 3,'l' of Vupdate of Practice [Practice] //char c1,c2; c1='a';c2='b'; c1=c1-32;c2=c2-32;'Vtable c1,1,随机 c2,1,随机 of Vtable 'Vupdate 1,随机;2,随机 1,'a';2,'b' 1,'A';2,'B' of Vupdate of Practice 字符串常量 字符串常量是由一对双引号括起的字符序列。例如: "CHINA" ,"C program:" , "$12.5" 等都是合法的字 符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别: 1.字符常量由单引号括起来,字符串常量由双引号括起来。 2.字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 3.可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相 应的字符串变量。 这是与 BASIC 语言不同的。但是可以用一个字符数组来存放一个字符串常量。在数组一章内予以介绍。 4.字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加 1。增加的一个字节 中存放字符"\0"(ASCII 码为 0)。这是字符串结束的标志。例如,字符串 "C program"在内存中所占的字节为: C program\0。字符常量'a'和字符串常量"a"虽然都只有一个字符,但在内存中的情况是不同的
a'’在内存中占一个字节,可表示为:a a"在内存中占二个字节,可表示为:a\0符号常量 符号常量 在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一 般形式为 # define标识符常量 其中# define也是一条预处理命令(预处理命令都?quot;#"开头),称为宏定义命令(在第九章预处理程序 中将进一步介绍),其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符 的地方均代之以该常量值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别 # pi 3. 14159 void maino float s, r s=PI*r*r printf("s=%f\n", s) 由宏定义命令定义PI为3.14159s,r定义为实数5->rPI*r*r->s 显示程序结果 float s,r;r=5;s=PI*r*r;本程序在主函数之前由宏定义命令定义PI为3.14159,在程 序中即以该值代替PI。s=PI*r*r等效于s=3.14159*。应该注意的是,符号常量不是变量,它所代表的 值在整个作用域内不能再改变。也就是说,在程序中,不能再用赋值语句对它重新赋值 变量的初值和类型转换 变量赋初值 在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法,在定义时赋以初值的方法,这 种方法称为初始化。在变量说明中赋初值的一般形式为: 类型说明符变量1=值1,变量2=值2,……;例如 float x=3.2,y=3f,z=0.75; char ch1=K',ch2='P 应注意,在说明中不允许连续赋值,如a=b=c=5是不合法的 void main o int a=3. b c=5 b=a+c printf("a=d, b=%d, c=%d\n",a, b, c) a<---3,b<--0,c<- b<--a+c 显示程序运行结果 变量类型的转换
'a'在内存中占一个字节,可表示为:a "a"在内存中占二个字节,可表示为:a\0 符号常量 符号常量 在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一 般形式为: #define 标识符 常量 其中#define 也是一条预处理命令(预处理命令都?quot;#"开头),称为宏定义命令(在第九章预处理程序 中将进一步介绍),其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符 的地方均代之以该常量值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。 #define PI 3.14159 void main() { float s,r; r=5; s=PI*r*r; printf("s=%f\n",s); } 由宏定义命令定义 PI 为 3.14159 s,r 定义为实数 5->r PI*r*r->s 显示程序结果 float s,r; r=5; s=PI*r*r; 本程序在主函数之前由宏定义命令定义 PI 为 3.14159,在程 序中即以该值代替 PI 。s=PI*r*r 等效于 s=3.14159*r*r。应该注意的是,符号常量不是变量,它所代表的 值在整个作用域内不能再改变。也就是说,在程序中,不能再用赋值语句对它重新赋值。 变量的初值和类型转换 变量赋初值 在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法,在定义时赋以初值的方法,这 种方法称为初始化。在变量说明中赋初值的一般形式为: 类型说明符 变量 1= 值 1,变量 2= 值 2,……; 例如: int a=b=c=5; float x=3.2,y=3f,z=0.75; char ch1='K',ch2='P'; 应注意,在说明中不允许连续赋值,如 a=b=c=5 是不合法的。 void main() { int a=3,b,c=5; b=a+c; printf("a=%d,b=%d,c=%d\n",a,b,c); } a<---3,b<--0,c<---5 b<--a+c 显示程序运行结果 变量类型的转换
变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,一种是强制转换 自动转换 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则: 1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。 2.转换按数据长度增加的方向进行,以保证精度不降低。如int型和1ong型运算时,先把int量转成1ng 型后再进行运算 3.所有的浮点运算都是以双精度进行的,即使仅含 float单精度量运算的表达式,也要先转换成 double型 再作运算 4.char型和 short型参与运算时,必须先转换成int型 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右 边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。图 21表示了类型自动转换的规则。 void main o float PI=3. 14159. int s, r=5: s=r*r*PI printf("s=d\n",s) P1<--3.14159 s<--r*kr:PI 显示程序运行结果 float Pi=3. 14159 s=r*r*PI 本例程序中,PI为实型;s,r为整型。在执行s=r*r*PI语句时,r和PI都转换成 double型计算,结果也 为 double型。但由于s为整型,故赋值结果仍为整型,舍去了小数部分 强制类型转换 强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的 运算结果强制转换成类型说明符所表示的类型。例如:( float)a把a转换为实型(int)(x+y)把x+y的结 果转换为整型在使用强制转换时应注意以下问题 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转 换成int型之后再与y相加了。 2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不 改变数据说明时对该变量定义的类型。 main float f=5.75 printf("(int)f=%d, f=%f\n",(int)f, f) f<--5.75
变量的数据类型是可以转换的。转换的方法有两种, 一种是自动转换,一种是强制转换。 自动转换 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。自动转换遵循以下规则: 1.若参与运算量的类型不同,则先转换成同一类型,然后进行运算。 2.转换按数据长度增加的方向进行,以保证精度不降低。如 int 型和 long 型运算时,先把 int 量转成 long 型后再进行运算。 3.所有的浮点运算都是以双精度进行的,即使仅含 float 单精度量运算的表达式,也要先转换成 double 型, 再作运算。 4.char 型和 short 型参与运算时,必须先转换成 int 型。 5.在赋值运算中,赋值号两边量的数据类型不同时, 赋值号右边量的类型将转换为左边量的类型。 如果右 边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度, 丢失的部分按四舍五入向前舍入。图 2 1 表示了类型自动转换的规则。 void main() { float PI=3.14159; int s,r=5; s=r*r*PI; printf("s=%d\n",s); } PI<--3.14159 s<--0,r<--5 s<--r*r*PI 显示程序运行结果 float PI=3.14159; int s,r=5; s=r*r*PI; 本例程序中,PI 为实型;s,r 为整型。在执行 s=r*r*PI 语句时,r 和 PI 都转换成 double 型计算,结果也 为 double 型。但由于 s 为整型,故赋值结果仍为整型,舍去了小数部分。 强制类型转换 强制类型转换是通过类型转换运算来实现的。其一般形式为: (类型说明符) (表达式) 其功能是把表达式的 运算结果强制转换成类型说明符所表示的类型。例如: (float) a 把 a 转换为实型(int)(x+y) 把 x+y 的结 果转换为整型在使用强制转换时应注意以下问题: 1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y 则成了把 x 转 换成 int 型之后再与 y 相加了。 2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不 改变数据说明时对该变量定义的类型。 main() { float f=5.75; printf("(int)f=%d,f=%f\n",(int)f,f); } f<--5.75
将 float f强制转换成 int f float f=5.75; printf("(int)f=%d,f=%fn",(int)f,f);本例表明,f虽强制 转为int型,但只在运算中起作用,是临时的,而f本身的类型并不改变。因此,(int)f的值为5(删去了 小数)而f的值仍为5.75 基本运算符和表达式 运算符的种类、优先级和结合性 C语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分 完善。这也是C语言的主要特点之 C语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算量参 与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进 行运算还是自右向左进行运算。这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂 运算符的种类C语言的运算符可分为以下几类 1.算术运算符 用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(+)、自减(--)共七种 2.关系运算符 用于比较运算。包括大于(>)、小于(、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。 3.逻辑运算符 用于逻辑运算。包括与(&&)、或(|)、非(!)三种 4位操作运算符 参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非()、位异或(ˆ)、左移(<<)、右移(>>) 六种 5.赋值运算符 用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*,/=,%=)和复合位运算赋值(&=,|=,“=,>=,<=) 三类共十一种 6.条件运算符 这是一个三目运算符,用于条件求值(?:)。 7逗号运算符 用于把若干表达式组合成一个表达式(,) 8.指针运算符 用于取内容(*)和取地址(&)二种运算。 9.求字节数运算符 用于计算数据类型所占的字节数( sizeof) 10.特殊运算符 有括号(,下标[,成员(→,.)等几种 优先级和结合性 C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级 较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处 理。C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符 的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合,执行x-y运算,然后再执 行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。最
将 float f 强制转换成 int f float f=5.75;printf("(int)f=%d,f=%f\n",(int)f,f); 本例表明,f 虽强制 转为 int 型,但只在运算中起作用, 是临时的,而 f 本身的类型并不改变。因此,(int)f 的值为 5(删去了 小数)而 f 的值仍为 5.75。 基本运算符和表达式 运算符的种类、优先级和结合性 C语言中运算符和表达式数量之多, 在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分 完善。 这也是C语言的主要特点之一。 C语言的运算符不仅具有不同的优先级, 而且还有一个特点,就是它的结合性。在表达式中, 各运算量参 与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约, 以便确定是自左向右进 行运算还是自右向左进行运算。 这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂 性。 运算符的种类C语言的运算符可分为以下几类: 1.算术运算符 用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。 2.关系运算符 用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。 3.逻辑运算符 用于逻辑运算。包括与(&&)、或(||)、非(!)三种。 4.位操作运算符 参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>) 六种。 5.赋值运算符 用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=) 三类共十一种。 6.条件运算符 这是一个三目运算符,用于条件求值(?:)。 7.逗号运算符 用于把若干表达式组合成一个表达式(,)。 8.指针运算符 用于取内容(*)和取地址(&)二种运算。 9.求字节数运算符 用于计算数据类型所占的字节数(sizeof)。 10.特殊运算符 有括号(),下标[],成员(→,.)等几种。 优先级和结合性 C语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。在表达式中,优先级较高的先于优先级 较低的进行运算。 而在一个运算量两侧的运算符优先级相同时, 则按运算符的结合性所规定的结合方向处 理。 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符 的结合性是自左至右,即先左后右。如有表达式 x-y+z 则 y 应先与“-”号结合, 执行 x-y 运算,然后再执 行+z 的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最
典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 算术运算符和算术表达式基本的算术运算符 1.加法运算符“+”加法运算符为双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。 2.减法运算符“-”减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具 有左结合性 3.乘法运算符“*”双目运算,具有左结合性。 4.除法运算符“/”双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算 量中有一个是实型,则结果为双精度实型。 void maino i printf("nn%d,%d\n",20/7,-20/7) printf("%f,%fn",20.0/7,-20.0/7) 双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型, 则结果为双精度实型。 printf("nn%d,%dn",20/7,-20/7) printf("%f,%fn",20.0/7,-20.0/7) 本例中,20/7,-20/7的结果均为整型,小数全部舍去。而20.0/7和-20.0/7由于有实数参与运算,因此结 果也为实型 5.求余运算符(模运算符)“%”双目运算,具有左结合性。要求参与运算的量均为整型。求余运算的结果等 于两数相除后的余数。 void main(i printf("%d\n”,100%3) 双目运算,具有左结合性。求余运算符%要求参与运算的量均为整型。本例输出100除以3所得的余数1 自增1,自减1运算符 自增1运算符记为“+-”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。 自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式:++ii自增1后再参与其它运 算。-ii自减1后再参与其它运算 i++i参与运算后,i的值再自增1。 i-i参与运算后,i的值再自减1 在理解和使用上容易出错的是i++和ⅰ--。特别是当它们出在较复杂的表达式或语句中时,常常难于弄清 因此应仔细分析。 int i=8 printf("%dn”,++i) printf(%d\n" --i) printf(%d\n", i++) printf( %d\n",i--) printf(%d\n", -i++) printf(%d\n",i-)
典型的右结合性运算符是赋值运算符。如 x=y=z,由于“=”的右结合性,应先执行 y=z 再执行 x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 算术运算符和算术表达式基本的算术运算符 1.加法运算符“+”加法运算符为双目运算符,即应有两个量参与加法运算。如 a+b,4+8 等。具有右结合性。 2.减法运算符“-”减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5 等具 有左结合性。 3.乘法运算符“*”双目运算,具有左结合性。 4.除法运算符“/”双目运算具有左结合性。参与运算量均为整型时, 结果也为整型,舍去小数。如果运算 量中有一个是实型,则结果为双精度实型。 void main(){ printf("\n\n%d,%d\n",20/7,-20/7); printf("%f,%f\n",20.0/7,-20.0/7); } 双目运算具有左结合性。参与运算量均为整型时, 结果也为整型,舍去小数。如果运算量中有一个是实型, 则结果为双精度实型。 printf("\n\n%d,%d\n",20/7,-20/7); printf("%f,%f\n",20.0/7,-20.0/7); 本例中,20/7,-20/7 的结果均为整型,小数全部舍去。而 20.0/7 和-20.0/7 由于有实数参与运算,因此结 果也为实型。 5.求余运算符(模运算符)“%”双目运算,具有左结合性。要求参与运算的量均为整型。 求余运算的结果等 于两数相除后的余数。 void main(){ printf("%d\n",100%3); } 双目运算,具有左结合性。求余运算符% 要求参与运算的量均为整型。本例输出 100 除以 3 所得的余数 1。 自增1,自减1运算符 自增 1 运算符记为“++”,其功能是使变量的值自增 1。自减 1 运算符记为“--”,其功能是使变量值自减 1。 自增 1,自减 1 运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i 自增 1 后再参与其它运 算。--i i 自减 1 后再参与其它运算。 i++ i 参与运算后,i 的值再自增 1。 i-- i 参与运算后,i 的值再自减 1。 在理解和使用上容易出错的是 i++和 i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清, 因此应仔细分析。 void main(){ int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); } i<--8 i<--i+1