版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第2章 数据类型、运算符和表达式教学目标教学目标 掌握掌握C语言的字符集、关键字和标识符语言的字符集、关键字和标识符 理解理解C语言的数据类型语言的数据类型 理解字符型和整型数据在内存中的存储格式理解字符型和整型数据在内存中的存储格式 掌握基本类型数据的常量的表示方法掌握基本类型数据的常量的表示方法 掌握基本类型变量的定义和使用掌握基本类型变量的定义和使用 掌握数据类型转换的规则以及强制数据类型转换方法掌握数据类型转换的规则以及强制数据类型转换方法 掌握各种运算符的使用用法及其优先级和结合性掌握各种运算符的使用用法及其优先级和结合性 掌握字符数据输入输出函数掌握字符数据输入输出函数getcha
2、r和和putchar的用法的用法掌握格式输入输出函数掌握格式输入输出函数scanf和和printf的用法,理解输的用法,理解输入输出界面设计的重要性,掌握简单输入输出界面设入输出界面设计的重要性,掌握简单输入输出界面设计方法计方法目目 录录2.1 C语言的标识符和关键字语言的标识符和关键字2.2 C语言的基本数据类型语言的基本数据类型2.3 运算符和表达式运算符和表达式2.4 数据的输入输出数据的输入输出2.1 C语言的标识符和关键字大写、小写英文字母各大写、小写英文字母各26个个阿拉伯数字阿拉伯数字10个个运算符、标点符号及其他字符运算符、标点符号及其他字符30个个 + - * / % =
3、! & | ; : ? , .“ ( ) # _ 空格空格集外字符可用集内若干字符表示,如集外字符可用集内若干字符表示,如用用pi表示表示源程序注释中可以包含字符集以外的字符源程序注释中可以包含字符集以外的字符字符串作为数据也可以包含字符集以外的字符字符串作为数据也可以包含字符集以外的字符 标识符变量名、函数名、数组名、类型名等的命名变量名、函数名、数组名、类型名等的命名:由大小写字母、数字和下划线组成,且首字符必须是字母由大小写字母、数字和下划线组成,且首字符必须是字母或下划线,不能与关键字同名。或下划线,不能与关键字同名。合法的标识符合法的标识符 MyName、Value、_12、
4、b_tree、abm、sum非法的标识符非法的标识符 6ab、$ab、a3.5、case标识符区分大小写,其有效长度与标识符区分大小写,其有效长度与C编译系统有关编译系统有关标识符应体现标识符应体现“”原则,注重可读性原则,注重可读性 关键字编程语言预定义的具有专门用途的编程语言预定义的具有专门用途的标识符,不允许用作用户的标识符。标识符,不允许用作用户的标识符。2.2 C语言的基本数据类型程序处理的对象,分为常量和变量。程序处理的对象,分为常量和变量。用于描述程序中的数据。用于描述程序中的数据。基本数据类型基本数据类型:C语言预定义的数据类型,包括整型、语言预定义的数据类型,包括整型、字符型
5、、实型和空类型字符型、实型和空类型定义数据类型:定义数据类型:用户按编程需要定义的数据类型,包用户按编程需要定义的数据类型,包括数组、指针、结构体、共用体和枚举括数组、指针、结构体、共用体和枚举int 整型整型 char 字符型字符型float 单精度浮点型单精度浮点型 double 双精度浮点型双精度浮点型 常量程序执行过程中,其值不能被改变的量。程序执行过程中,其值不能被改变的量。和和。不做说明,直接使用的常量。如:不做说明,直接使用的常量。如:12,34.5。整型常量、实型常量、字符型常量和字符整型常量、实型常量、字符型常量和字符串常量。串常量。经说明或定义后才能使用的常量。经说明或定义
6、后才能使用的常量。 符号常量有名字的常量。有名字的常量。须先定义后使用须先定义后使用。使用常量说明符使用常量说明符const 使用编译预处理命令使用编译预处理命令 const double pi=3.1415926; #define PI 3.1415926可读、一致、易维护可读、一致、易维护 变 量在程序执行过程中其值可以被改变的量。在程序执行过程中其值可以被改变的量。变量类型变量类型变量名变量名变量的值变量的值变量的指针变量的指针(变量在内存中的位置变量在内存中的位置) 变量的定义作用:作用:指明变量的类型、名字。指明变量的类型、名字。格式:格式: 类型名类型名 变量名变量名1,变量名变量
7、名2,变量名变量名n;例例1: int n;该语句定义该语句定义(或声明或声明)了一个名为了一个名为n的整型变量,变量的整型变量,变量n 占用占用4字字节内存,节内存,&n是变量是变量n的指针,即变量的指针,即变量n在内存中的位置。在内存中的位置。 例:例: int year,month,day; double x1,x2,x3; long sum,average,total; 变量的定义说明:说明:变量定义不是可执行语句,应置于可执行语句前。变量定义不是可执行语句,应置于可执行语句前。同一变量不可重复定义。同一变量不可重复定义。变量名以简短、见名知意、见名知型为优。变量名以简短、见名
8、知意、见名知型为优。应按变量的取值范围选择变量类型,以占用内存应按变量的取值范围选择变量类型,以占用内存少、操作简便为优。少、操作简便为优。C语言没有提供字符串类型,字符串是用字符型数语言没有提供字符串类型,字符串是用字符型数组或指针来处理的。组或指针来处理的。 变量的初值变量的初值:变量的初值:在首次使用变量前,变量的取值。在首次使用变量前,变量的取值。置变量初值:置变量初值:在定义变量时,直接初始化:在定义变量时,直接初始化: int n=3; float x=12.5; int a,b=n+1,c=18; /*仅初始化部分变量仅初始化部分变量*/在定义变量后,用赋值语句赋初值:在定义变量
9、后,用赋值语句赋初值: float pi; pi=3.14159;变量定义后,若未指定初值,则其初值或变量定义后,若未指定初值,则其初值或取取0或或取随取随机值机值,由所分配的存储器种类决定。详见第,由所分配的存储器种类决定。详见第5章。章。 变量的使用取变量的值称为取变量的值称为。对变量赋值与引用统称为对变量的操作或使用。对变量赋值与引用统称为对变量的操作或使用。变量一旦定义,即可多次使用:变量一旦定义,即可多次使用:int n=3,s,t;s=n; /*取变量取变量n的值,对变量的值,对变量s赋值赋值*/ scanf(%d,&t); /*将输入整数存入变量将输入整数存入变量t*/
10、/*&t表示取变量表示取变量t的指针(地址)的指针(地址)*/ 基本数据类型学习数据类型,应关注其占用的内存字节数、取值范围及学习数据类型,应关注其占用的内存字节数、取值范围及所支持的操作。所支持的操作。基本数据类型基本数据类型int用于描述整数用于描述整数占用占用4字节内存字节内存(在在VC+中中)取值范围是取值范围是-21474836482147483647支持的操作包括加、减、乘、除等运算支持的操作包括加、减、乘、除等运算:整型、实型和字符型整型、实型和字符型 整数类型描述整数。描述整数。双字节整型:双字节整型:short int,unsigned short int。四字节整型
11、:四字节整型:int,unsigned int,long int,unsigned long int。八字节整型:有些八字节整型:有些C语言编译系统支持,如语言编译系统支持,如VC+的的_ _int64。类型说明符类型说明符位数位数数的范围数的范围基本型基本型int短整型短整型short2字节字节长整型长整型long4字节字节2字节字节4字节字节 整数类型例如:例如:整数整数13在内存中实际存放的情况在内存中实际存放的情况 整数类型 整型常量整型常量可用整型常量可用十进制、八进制、十六进制十进制、八进制、十六进制表示表示。由由09数字组成,除表示正负数的字符外,第一个数字不数字组成,除表示正负
12、数的字符外,第一个数字不能是能是0(整数整数0除外除外)。例如:。例如: 110,+12,-25,0,1289 +(正正)号可以省略。号可以省略。由数字由数字07数字组成,且以数字组成,且以0开头。例如:开头。例如: 012,056376以以0X(x)开头,由数字开头,由数字09和字母和字母a(A)f(F)组成。例如:组成。例如: 0 x1abCD,0X02a5,0 xABCFD213 整型常量整型常量可用后缀来修饰:整型常量可用后缀来修饰:以以 或或 后缀修饰的整数为长整数。例如:后缀修饰的整数为长整数。例如: 2 ,023 ,025678983以以 或或 后缀修饰的整数为无符号整数后缀修饰
13、的整数为无符号整数。例如:。例如: 6 ,045 ,0F91789后缀后缀 (u)和和 (l)可以组合使用,表示无符号长整型数可以组合使用,表示无符号长整型数。例如:例如: 0FFFFFF96,120000若整型常量未明确指定为长整型或无符号整型,则其类型由若整型常量未明确指定为长整型或无符号整型,则其类型由编译系统在编译时依据它的取值自动识别。编译系统在编译时依据它的取值自动识别。 整型数据的表示用原码表示,即其二进制数表示。用原码表示,即其二进制数表示。用补码表示。用补码表示。正数的补码:与其原码相同。正数的补码:与其原码相同。负数的补码:由其相应的正数的原码的各位逐位求反负数的补码:由其
14、相应的正数的原码的各位逐位求反后在最低位加后在最低位加1而得到。而得到。例如:若用双字节整型,则例如:若用双字节整型,则1和和-1的补码分别是的补码分别是0000000000000001,1111111111111111。#include int main(void) int a,b,c,d; /*指定a、b、c、d为整型变量*/ unsigned u; /*指定为无符号整型变量*/ a=12;b=-24;u=10; c=a+u;d=b+u; printf(a+u=%d,b+u=%dn,c,d); 可以看到不同种类的整型数据可以进行算术运算可以看到不同种类的整型数据可以进行算术运算 运行结果运
15、行结果: a+u=22,b+u=-14示例示例 整型变量的定义与使用整型变量的定义与使用 整型变量的定义及应用若有语句:若有语句:u=a+b;情况会怎样?情况会怎样?若按若按%u输出,则输出,则u=65524涉及到的问题:数据类型转换。涉及到的问题:数据类型转换。 整型变量的定义及应用#include int main(void)int a,b; a=32767; b=a+1; printf(%d,%dn,a,b);数值是以补码表示的。一个整型变量只能容数值是以补码表示的。一个整型变量只能容纳纳-3276832767范围内的数,无法表示大于范围内的数,无法表示大于32767或小于或小于-327
16、68的数。遇此情况就发生的数。遇此情况就发生“溢出溢出”。运行结果:运行结果: 32767,-32768例例2.3 整型数据的溢出整型数据的溢出 整型变量的定义及应用 实数类型实数类型实数类型(实型实型)又称浮点型又称浮点型,用于描述实数。,用于描述实数。科学记数法,即科学记数法,即 m10e 其中其中称为尾数,称为尾数, 称为阶码。称为阶码。仅存尾数和阶码,如仅存尾数和阶码,如3.14159*101存储为:存储为:实型数据不连续,无法精确表示每个实数,只能用实实型数据不连续,无法精确表示每个实数,只能用实型数据近似表达实数。型数据近似表达实数。 实数类型float:单精度实型单精度实型dou
17、ble:双精度实型双精度实型long double:长双精度实型长双精度实型位数位数数的范围数的范围有效数字有效数字float32double64long double128 单精度占单精度占4字节内存单元字节内存单元; 双精度占双精度占8字节内存单元。字节内存单元。 实型常量实型常量实型常量(或称浮点常量或称浮点常量)的表示形式:的表示形式:定点数形式:定点数形式:由由09、小数点和正负号组成。如:小数点和正负号组成。如: 0.1234,253.6,0.0,.205,-78.指数形式指数形式(科学表示法科学表示法):以以10的指数形式表示。的指数形式表示。如:如: 12.3E12 /* 12
18、.31012 */ 0.2333e-12 /* 0.233310-12 */注意:在注意:在 或或 的前面必须有数字,且在的前面必须有数字,且在E或或e之后的之后的指数部分必须是整数。例如:指数部分必须是整数。例如: e10,E5,.e5,1.0e3.5 都是不合法的实数。都是不合法的实数。规范的指数形式:规范的指数形式:,例如:,例如: 1.23E3/* 12.3102 */ 实型常量带后缀带后缀f或或F的浮点常量是单精度浮点数的浮点常量是单精度浮点数(float型型)带后缀带后缀d、D或无后缀的浮点常量是双精度浮点数或无后缀的浮点常量是双精度浮点数(double型型)带后缀带后缀l、L结尾
19、的浮点常量是长双精度浮点数结尾的浮点常量是长双精度浮点数(long double型型) 0.12f,12.3E12f,0.12D,0.12, 12.3E12,3.5L,12.3E12L C编译系统将浮点型数据都作为编译系统将浮点型数据都作为来处理!来处理!#include int main(void)float a,b; a = 123456.789e5; b = a + 20 ; printf(a=%f,b=%fn,a,b); printf(a=%e,b=%en,a,b);一个浮点型变量只能保证的有效数字是一个浮点型变量只能保证的有效数字是7位有效数字,位有效数字,后面的数字是无意义的,并不
20、准确地表示该数。应当避免将后面的数字是无意义的,并不准确地表示该数。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会一个很大的数和一个很小的数直接相加或相减,否则就会“丢失丢失”小的数。小的数。a=12345678848.000000,b=12345678848.000000a=1.234568e+10,b=1.234568e+10例例2.4 浮点型数据的舍入误差浮点型数据的舍入误差 实型变量的定义及应用不同编译器对实型不同编译器对实型变量的有效数字长度的限制。变量的有效数字长度的限制。在在VC6.0中中, 单精度一般为单精度一般为, 双精度双精度 实型变量的定义及应用3.4(10
21、381038)1.7( 1030810308)a=123456.664062b=1234567.750000c=12345679.000000d=123456792.000000分析程序分析程序: int main(void) float a,b,c,d; a=123456.666; b=1234567.777; c=12345678.888; d=123456789.999; printf(a=%fnb=%fnc=%fnd=%fn,a,b,c,d); 分析程序分析程序: #include#includeint main(void) float a,b,c; a=10 * 3.4e1; b=1
22、0 * 3.4e37; c=10 * 3.4e38; printf(a=%fnb=%fnc=%fn,a,b,c); printf(a=%enb=%enc=%en,a,b,c); a=340.000000b=339999995214436425000000000000000000000.0 (整数位为整数位为39位位)c=+INFc=3.400000e+02c=3.400000e+38c=+INF 实型变量的定义及应用 字符类型描述单个字符数据。描述单个字符数据。采用采用ASCII编码编码(见附录见附录)表示,占用一字节内表示,占用一字节内存。存。ASCII编码是正整数且只使用了一个字节的低编码
23、是正整数且只使用了一个字节的低7位二进位二进制位,最高位为制位,最高位为0。为了便于字符数据的处理以及一字节整型数据的表达为了便于字符数据的处理以及一字节整型数据的表达和处理,和处理,C语言允许把语言允许把char型数据当作整型数据,因此,型数据当作整型数据,因此,C语言允许用语言允许用signed和和unsigned修饰修饰char,即可以有即可以有signed char和和unsigned char类型。类型。 位数位数数的范围数的范围char8 字符型常量字符常量:字符常量:一对一对括起来的单个字符。括起来的单个字符。合法的字符常量:合法的字符常量: a ,A, ,1 , ,&不
24、合法的字符常量:不合法的字符常量: , 原因是原因是单引号已用作字符常量的定界符单引号已用作字符常量的定界符,反斜杠字符是反斜杠字符是转义序列的开始标志转义序列的开始标志。字符常量的表示:字符常量的表示:机内用该字符的机内用该字符的ASCII编码表示。编码表示。 字符型常量表示无法直接用单引号表示无法直接用单引号括起来括起来的字符常量的字符常量(主要是主要是控制符控制符) 。以以 开始,后跟一个字符或一个整型常量来表示一开始,后跟一个字符或一个整型常量来表示一个字符。其中整型常量为八进制或十六进制数,取值范个字符。其中整型常量为八进制或十六进制数,取值范围为围为0255。八进制数的开头。八进制
25、数的开头0可省,十六进制数应以可省,十六进制数应以X或或x开头。开头。032 x99 24 x56 0 可读性差可读性差 t n 可读性强可读性强分析程序分析程序: : #includeint main(void) char c1,c2,c3; c1=101; c2=x42; c3=; printf(“c1=%cnc2=%cnc3=%cn,c1,c2,c3); printf(“This is “character example”n”); printf(“This is “character example”n”);若将若将c1值改为值改为,c2值改为值改为,c3值改值改为为A,则程序运行输出
26、什么样的结果?,则程序运行输出什么样的结果? 字符型变量的定义及应用 将一个字符常量放到一个字符变量中,实际上并不是将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相把该字符本身放到内存单元中去,而是将该字符的相应的应的放到存储单元中。放到存储单元中。 这样使这样使和和之间可以通用。一个字之间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输符数据既可以以字符形式输出,也可以以整数形式输出。出。 字符型数据在内存中的存储形式及其使用方法#include int main(void) char c1,c2; c1=97; c2=98; pri
27、ntf(%c %cn,c1,c2); printf(%d %dn,c1,c2); 在第在第3和第和第4行中,将整数行中,将整数97和和98分别赋给分别赋给c1和和c2,它的作用相当于以下两个赋值语,它的作用相当于以下两个赋值语句:句: c1a;c2b; 因为因为a和和b的的ASCII码为码为97和和98运行结果:运行结果: a b 97 98分析程序分析程序 向字符变量赋以整数。向字符变量赋以整数。 字符型数据在内存中的存储形式及其使用方法#include int main(void)char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; printf(%c %
28、c,c1,c2);程序的作用是将两个小写字母程序的作用是将两个小写字母a和和b转换成大写转换成大写字母字母A和和B。从。从ASCII代码表中可以看到每一个代码表中可以看到每一个小写字母比它相应的大写字母的小写字母比它相应的大写字母的ASCII码大码大32。C语言允许字符数据与整数直接进行算术运算。语言允许字符数据与整数直接进行算术运算。 运行结果:运行结果: 分析程序:分析程序:大小写字母的转换大小写字母的转换 若若c1, c2的取值的取值范围超出了范围超出了ASCII码表码表的值,会产生什么后果?的值,会产生什么后果? 字符型数据在内存中的存储形式及其使用方法运行结果:运行结果:c1= ,
29、c2= , c3= , c4=#include int main(void) char c1,c2,c3,c4; c1=256; c2=257; c3=-1; c4=-2; c2=c2-32; printf(c1=%c,c2=%c,c3=%c,c4=%cn,c1,c2,c3,c4); 字符型数据在内存中的存储形式及其使用方法 1 256相当于相当于ASCII码的码的2550值。值。 取值分段,以取值分段,以256为模重复为模重复 从从256开始,依次得新取开始,依次得新取ASCII码的值。码的值。ASCII码ASCII码ASCII码2561 0255256511思考:思考:若有若有c1=c1
30、256;c2=c2 256;则结果怎样?则结果怎样?在在C语言中如何实现英文字母大小写的转换语言中如何实现英文字母大小写的转换? 字符型数据在内存中的存储形式及其使用方法 #include int main(void) int i; char c; i=32769; c=a; printf (c=%c, c=%dn, c, c); printf (i=%c, i=%dn, i, i); 运行结果运行结果: c=a , c=97 i= ,i=-32767分析程序分析程序: 字符型数据在内存中的存储形式及其使用方法 字符串常量用双引号括起来的若干个字符。存储时,字符串用双引号括起来的若干个字符。存
31、储时,字符串的尾部系统自动添加一个的尾部系统自动添加一个0,表示字符串结束。,表示字符串结束。0称为字符串称为字符串结束符。结束符。a stutent 含转义字符,占含转义字符,占12字节字节 空串,占空串,占1字节字节 结果为:结果为: 占占9字节字节(一个汉字占一个汉字占2字节字节)类型:前者是字符串常量,后者是字符型常量。类型:前者是字符串常量,后者是字符型常量。存储:前者占两个字节,后者占一个字节。即:存储:前者占两个字节,后者占一个字节。即:a 其存放值为其存放值为0 x6100,占两个字节占两个字节a 其存放值为其存放值为0 x61,占一个字节占一个字节a是字符常量,是字符常量,a
32、是字符串常量!是字符串常量! 空值型用用void表示表示描述描述函数没有返回值:详见第函数没有返回值:详见第5章章函数没有参数:详见第函数没有参数:详见第5章章无类型指针:详见第无类型指针:详见第7章章 数据类型转换不同类型的数据做混合运算时,应不同类型的数据做混合运算时,应,再做运算。,再做运算。数据类型转换的分类:数据类型转换的分类:(也称也称):由系统按类型:由系统按类型转换规则自动完成。对于赋值与非赋值表达式来转换规则自动完成。对于赋值与非赋值表达式来说,自动类型转换规则是不同的。说,自动类型转换规则是不同的。(也称也称):由程序员在程由程序员在程序中用类型转换运算符明确指明的转换操作
33、序中用类型转换运算符明确指明的转换操作。通。通常,当使用自动类型转换不能满足要求时,才需常,当使用自动类型转换不能满足要求时,才需要在程序中使用强制类型转换。要在程序中使用强制类型转换。 非赋值表达式计算过程的自动类型转换按保值原则按保值原则先把精度低的操作数转成与另一操作先把精度低的操作数转成与另一操作数相同精度的操作数后再做运算。数相同精度的操作数后再做运算。字符型或短整型数自动转成整型字符型或短整型数自动转成整型(int)数数单精度实型数自动转成双精度实型数单精度实型数自动转成双精度实型数其余情况,仅当两个操作数的类型不同时,才将表其余情况,仅当两个操作数的类型不同时,才将表示范围小的数
34、据类型转成与另一操作数相同的数据示范围小的数据类型转成与另一操作数相同的数据类型。类型。 intunsignedlongunsigned longdouble 非赋值表达式计算过程的自动类型转换double float高低高低 longunsignedint char, short 非赋值表达式计算过程的自动类型转换3+2.5f:因两个操作数的类型不同,故要将它们转因两个操作数的类型不同,故要将它们转成相同的成相同的double类型后再运算,结果为类型后再运算,结果为5.5。a*2+2.5f先算先算a*2:将字符将字符a转换为整型数转换为整型数97与整型数与整型数2相乘,相乘,得整型数得整型数
35、194;再算再算194+2.5f:将整型数:将整型数194和和float型数型数2.5f都转成都转成double型数后,做加法,得型数后,做加法,得196.5。如如-3+2u的结果并非的结果并非-1,而是,而是unsigned型的数据型的数据4294967295。 赋值表达式计算过程的自动类型转换若赋值运算符右边表达式的数据类型与其左边变量的类型不一致若赋值运算符右边表达式的数据类型与其左边变量的类型不一致但兼容,则但兼容,则。将实型数赋给整型变量时,仅取其整数部分赋给整将实型数赋给整型变量时,仅取其整数部分赋给整型变量。若其整数部分的值超过整型变量的取值范型变量。若其整数部分的值超过整型变量
36、的取值范围,则赋值结果出错。围,则赋值结果出错。将整型数赋给实型变量时,将整型数转成实型数后,将整型数赋给实型变量时,将整型数转成实型数后,再赋给实型变量。再赋给实型变量。将将double型数据赋给型数据赋给float型变量时,要注意数值范型变量时,要注意数值范围,溢出时赋值就出错。围,溢出时赋值就出错。 赋值表达式计算过程的自动类型转换将字符型数据赋给整型变量时将字符型数据赋给整型变量时无符号字符数据:低位不变,高位补无符号字符数据:低位不变,高位补0后赋值。后赋值。有符号字符数据:若为正,与无符号字符的转换规则相同;有符号字符数据:若为正,与无符号字符的转换规则相同;若为负,则高位补若为负
37、,则高位补1后再赋值。后再赋值。将无符号整型或长整型数赋给整型变量时,若在整将无符号整型或长整型数赋给整型变量时,若在整型的取值范围,则不会出错;否则赋值结果出错。型的取值范围,则不会出错;否则赋值结果出错。若表达式的计算结果类型的表达范围大于被赋值的变量的数据若表达式的计算结果类型的表达范围大于被赋值的变量的数据表达范围,或表达式的计算结果的精度高于被赋值的变量的精表达范围,或表达式的计算结果的精度高于被赋值的变量的精度,则度,则VC+6.0编译器会给出警告,希望用户处理编译器会给出警告,希望用户处理(如强制类型如强制类型转换等转换等)。 强制类型转换 (type)表达式表达式先算表达式的值
38、,再将表达式的值的类型强制转换为由先算表达式的值,再将表达式的值的类型强制转换为由类型名类型名type规定的数据类型。规定的数据类型。设设int a=7,b=2; float x; 则则x=a/b /* x为为3.0f */ x=(float)a/b /* x为为3.5f */ x=(float)(a/b) /* x为为3.0f */通常不必做强制类型转换,但当自动类型转换影响表达式求值通常不必做强制类型转换,但当自动类型转换影响表达式求值的精度或不能完成相应运算时,才须使用强制类型转换。例如,的精度或不能完成相应运算时,才须使用强制类型转换。例如,(int)13.5%(int)3.5。2.3
39、 运算符和表达式运算符运算符(也称操作符也称操作符):描述对数据的操作。描述对数据的操作。操作数:操作数:运算符操作运算符操作的数据的数据,可为常量和变量,也可为其他操,可为常量和变量,也可为其他操作符的运算结果。例如:作符的运算结果。例如: A+B 称称A和和B为操作数,而把字符为操作数,而把字符“+”称为加法运算符。称为加法运算符。运算符按功能分:运算符按功能分:算术运算符、赋值运算符、关系运算符、逻算术运算符、赋值运算符、关系运算符、逻辑运算符和位运算符等。辑运算符和位运算符等。运算符按操作数的个数分:运算符按操作数的个数分:一元一元(目目)运算符、二元运算符、二元(目目)运算符和运算符
40、和三元三元(目目)运算符。运算符。运算符的优先级:运算符的优先级:运算符的运算优先关系,其意义和作用与数运算符的运算优先关系,其意义和作用与数学中的运算优先级相同。学中的运算优先级相同。 C运算符简介(共有13类)1. 算术运算符算术运算符 +, , , /, % , 等等3. 逻辑运算符逻辑运算符 !, &, 2. 关系运算符关系运算符 , =, =, !=4. 位运算符位运算符 , , , , &5. 赋值运算符赋值运算符 = 及扩充赋值运算符及扩充赋值运算符6. 条件运算符条件运算符 ? :7. 逗号运算符逗号运算符 ,8. 指针运算符指针运算符 *, &9. 求
41、字节数运算符求字节数运算符 sizeof 10. 强制类型转换运算符强制类型转换运算符 (类型类型) 11. 分量运算符分量运算符 , -12. 下标运算符下标运算符 13. 其它运算符其它运算符 如函数的调用如函数的调用( ) 运算符的结合性若运算符优先级相同,则其运算顺序由运算符的结合性确定。若运算符优先级相同,则其运算顺序由运算符的结合性确定。一个运算符对其操作数按一个运算符对其操作数按的顺序执行所规定的的顺序执行所规定的运算。例如:运算。例如: 18-36先取先取18,再取,再取36,然后做减法运算。,然后做减法运算。一个运算符对其操作数按一个运算符对其操作数按的顺序执行所规定的的顺序
42、执行所规定的运算。例如:运算。例如: a=-3先取先取3,进行,进行“求负求负 ”运算后,将结果赋给运算后,将结果赋给“变量变量a。 运算符的目数一元一元(目目)运算符:运算符:一个运算符只能对一个操作数进行操作。例一个运算符只能对一个操作数进行操作。例如,如,-5中的负号运算符。中的负号运算符。二元二元(目目)运算符:运算符:一个运算符要求两个操作数。例如,一个运算符要求两个操作数。例如,5*10中的运算符中的运算符 。三元三元(目目)运算符:运算符:一个运算符要求三个操作数。例如,条件运一个运算符要求三个操作数。例如,条件运算符算符是唯一的三元运算符。是唯一的三元运算符。同一运算符因操作数
43、的个数不同,完成不同运算。同一运算符因操作数的个数不同,完成不同运算。例如,一例如,一元运算符元运算符*用于取变量,二元运算符用于取变量,二元运算符*用于乘法运算等。用于乘法运算等。 表 达 式表达式:表达式:由运算符、园括号和由运算符、园括号和操作数操作数构成的合法式构成的合法式子,经过运算应有一个某种类型的确定的值。子,经过运算应有一个某种类型的确定的值。操作数可以是常量、变量或函数等。操作数可以是常量、变量或函数等。用不同的运算符可以构成不同类型的表达式,如算用不同的运算符可以构成不同类型的表达式,如算术表达式、赋值表达式、关系表达式、逻辑表达式等。术表达式、赋值表达式、关系表达式、逻辑
44、表达式等。表达式书写:表达式书写:操作数、运算符、圆括号之间可以加操作数、运算符、圆括号之间可以加空格,也可以不加空格。空格,也可以不加空格。 算术运算符算术运算符:算术运算符:-(负号负号)、+(正号正号)、+(加加),-(减减),*(乘乘),/(除除),%(取余取余)。 正、负号运算符的优先级相同,右结合。正、负号运算符的优先级相同,右结合。 *、/、%优先级相同,左结合。优先级相同,左结合。 加、减运算符的优先级相同,左结合。加、减运算符的优先级相同,左结合。优先级顺序:优先级顺序: 正正、负号负号 高于高于 *、/、% 高于高于 加加、减减可用园括号改变运算符的优先顺序可用园括号改变运
45、算符的优先顺序,先计算园括号,先计算园括号内的值,再计算园括号外的值。内的值,再计算园括号外的值。 算术运算符若两边的操作数均为整数时,则做整除运算,即若两边的操作数均为整数时,则做整除运算,即只取运算结果的整数部分。例如:只取运算结果的整数部分。例如: 3/4 /* 0 */ 3.0/4 /*0.75*/计算两个整型操作数相除的余数。所得余数的符号计算两个整型操作数相除的余数。所得余数的符号与左操作数相同。例如:与左操作数相同。例如: 10%3 /* 1 */ -10%3 /*-1 */ 4%-3 /* 1 */ “%” 求余运算符,要求参加运算的两数必须为整数,且结果求余运算符,要求参加运
46、算的两数必须为整数,且结果的符号与被除数的符号相同,结果的绝对值小于除数。的符号与被除数的符号相同,结果的绝对值小于除数。 算术运算的溢出超出对应类型数据的表示范围。超出对应类型数据的表示范围。若除数为若除数为0或实数运算的结果溢出,则认为产生严或实数运算的结果溢出,则认为产生严重错误,并终止程序的执行。重错误,并终止程序的执行。若结果产生溢出并不认为是错误,尽若结果产生溢出并不认为是错误,尽管结果已不正确。管结果已不正确。举例:举例: int n=60000; printf(“%dn”,n*n); /* -694967296 */ 此类问题可通过此类问题可通过来解决。来解决。这种溢出便于设计
47、较低级的程序,如利用整数运算这种溢出便于设计较低级的程序,如利用整数运算的溢出做进位,做大整数的溢出做进位,做大整数(232)的加和乘运算。的加和乘运算。 算术表达式由算术运算符、园括号和操作数构成的、符合由算术运算符、园括号和操作数构成的、符合C语言语法规则的式子。语言语法规则的式子。设设int a=25,b=4,c=3;,求表达式的值。求表达式的值。a+b*c:表达式的值为表达式的值为37。a*-b:表达式的值为表达式的值为-100。a*- -b:因两个负号之间有空格,此式等同于因两个负号之间有空格,此式等同于a*(-(-b),其值为其值为100。表达式应简明,无多余运算符。表达式应简明,
48、无多余运算符。表达式中的每个变量都应有确定的值。表达式中的每个变量都应有确定的值。书写复杂表达式时,可适当增加配对的园括号,指书写复杂表达式时,可适当增加配对的园括号,指定表达式的求值顺序。定表达式的求值顺序。利用强制类型转换运算符将一个算术表达式转换为所需类型形式形式: (类型名类型名) (表达式表达式)(double) a 将将a转换为转换为double(int) (x+y) 将将x+y转换为转换为int(float) (5%3) 将将5%3转换为转换为float1. 括号不能省略。否则括号不能省略。否则: intx 会理解为变量会理解为变量intx. 又如又如: (int) (x+y)
49、若省略若省略: (int)x+y会变成只将会变成只将x转成整型转成整型。2. 转换后的类型数据由系统分配一个中间变量存放,而原变转换后的类型数据由系统分配一个中间变量存放,而原变量类型不变。量类型不变。 float x=2.5; int m;m=(int)x; x本身仍为实型本身仍为实型,而而(int)x是将是将变量变量x的整数部的整数部分分2赋给变量赋给变量m。 +和-运算符一元运算符,可置于一元运算符,可置于变量变量前前(前置前置),也可置于也可置于变量变量后后(后置后置),用于快速实现变量的增,用于快速实现变量的增1和减和减1操作。操作。变量的类型可以是字符型、整型、实型、枚举类型和指针
50、类型。变量的类型可以是字符型、整型、实型、枚举类型和指针类型。例如,。例如,-19、(x+6)+、(b=1)+、(k+)+都是错误的。都是错误的。先将变量的值增先将变量的值增1(或减或减1),再将变量的值参加,再将变量的值参加运算。运算。先将变量的值参加运算,再将变量的值增先将变量的值参加运算,再将变量的值增1(或或减减1)。滥用滥用+和和-运算符会使表达式的可读性明显下降。运算符会使表达式的可读性明显下降。 +和-运算符若变量的增若变量的增(减减)1运算不加入其他表达式运算,则前置增运算不加入其他表达式运算,则前置增(减减)1与后置增与后置增(减减)1的作用相同:的作用相同: int a=1
51、; a+; /* 等价于等价于a=a+1; */ /* 此时此时a+与与+a的作用相同的作用相同 */若变量的增若变量的增(减减)1运算加入其他表达式运算,则前置增运算加入其他表达式运算,则前置增(减减)1与与后置增后置增(减减)1的作用截然不同:的作用截然不同: int i=10; float x=7,y=15,v1,v2; v1=x+ + +i; /* v1为为18,i为为11,x为为8 */ v2=+y; /* v2和和y都为都为16 */ 赋值运算符与赋值表达式右结合的双目运算符右结合的双目运算符,其优先级比算术运算符、,其优先级比算术运算符、关系运算符和逻辑运算符的优先级低。关系运算
52、符和逻辑运算符的优先级低。 变量变量 = 表达式表达式 注:注: 赋值表达式的左边只能是变量赋值表达式的左边只能是变量 左边变量的值代表赋值表达式的值左边变量的值代表赋值表达式的值设设a、b、c为整型变量:为整型变量: a=3+5 将将3+5的值的值8赋给赋给a b=c=a=3+5 将将3+5的值的值8赋给赋给a,再将再将a赋给赋给c,再将再将c赋给赋给b a=5+c=5 将将5赋给赋给5+c,而而5+c不是变量不是变量 a=5+(c=5) 将将5赋给赋给c,再将再将5和和c相加后的结果相加后的结果10赋给赋给a 赋值运算符使用注意不要将赋值运算符不要将赋值运算符“=”与等号与等号“=”相混淆
53、相混淆。不同编译器对赋值表达式的值的不同处理,可能使同一表达式不同编译器对赋值表达式的值的不同处理,可能使同一表达式在不同编译器中的运行结果不同。在不同编译器中的运行结果不同。如:如: int x,s; s=(x=2)+(+x); 在在VC+ 6.0中,中,s的值为的值为6,而在,而在Dev C+ 4.9中,中,s的值为的值为5。避免上述问题的方法是对表达式进行分解:避免上述问题的方法是对表达式进行分解: int x=2,s; s=x+(+x); 在在VC+ 6.0和和Dev C+ 4.9中,中,s的值均为的值均为6。 复合赋值运算符二元算术运算符和位运算符与赋值运算符组二元算术运算符和位运算
54、符与赋值运算符组合而成,优先级和结合性与赋值运算符相同。包括合而成,优先级和结合性与赋值运算符相同。包括+=、-=、*=、/=、%=、=、&=、=、|=。 变量变量 复合赋值运算符复合赋值运算符 表达式表达式 等价于:等价于: 变量变量 = 变量变量 运算符运算符 (表达式表达式)简化书写,提高表达式的目标代码质量。简化书写,提高表达式的目标代码质量。: a+=b-5 等价于等价于 a=a+(b-5) a*=b-c/2 等价于等价于 a=a*(b-c/2) 关系运算符二元运算符,用来比较两个操作数之间的关系,二元运算符,用来比较两个操作数之间的关系,其优先级比算术运算符低,但比赋值运算
55、符高。共有六个:其优先级比算术运算符低,但比赋值运算符高。共有六个: 字符型、整型、实型、枚举类型以字符型、整型、实型、枚举类型以及指针类型及指针类型初学者常常误将初学者常常误将=当作当作=使用。使用。 、= 、=优先级相同优先级相同=、!=!=优先级相同优先级相同优先级高优先级高 低低 逻辑运算符实现逻辑运算,表达复杂条件。实现逻辑运算,表达复杂条件。 ! 逻辑非逻辑非(单目单目) & 逻辑与逻辑与(二目二目) | 逻辑或逻辑或(二目二目)!的优先级最高,高于算术运算符。的优先级最高,高于算术运算符。&的优先级低于的优先级低于!,但高于,但高于|,但两者均比关系运算,但两者均
56、比关系运算符、算术运算符的优先级低。符、算术运算符的优先级低。逻辑运算的操作数不为逻辑运算的操作数不为0时,为逻辑真;而操作数的值为时,为逻辑真;而操作数的值为0时,时,为逻辑假。为逻辑假。 逗号运算符与逗号表达式优先级最低。优先级最低。 表达式表达式1,表达式表达式2,表达式表达式n 按从左到右的顺序依次求出各表达式的值,并把最后一个表达式按从左到右的顺序依次求出各表达式的值,并把最后一个表达式的值作为整个逗号表达式的值。的值作为整个逗号表达式的值。设设int a=2,b; a+=2,b=3+a:值为值为7。此时,。此时,a为为4,b为为7。并非所有的逗号都构成逗号表达式。例如,并非所有的逗
57、号都构成逗号表达式。例如,max(a+b,c+d)中,逗号只是一个分隔符。中,逗号只是一个分隔符。 条件运算符与条件表达式唯一的三目运算符,其优先级仅高于赋值运算符、唯一的三目运算符,其优先级仅高于赋值运算符、复合赋值运算符和逗号运算符。复合赋值运算符和逗号运算符。 表达式表达式1 ? 表达式表达式2 : 表达式表达式3先求表达式先求表达式1的值,若为的值,若为1(即:即:),则求出表达式,则求出表达式2的值的值(不求表达式不求表达式3的值的值),并把该值作为运算结果;否则求出,并把该值作为运算结果;否则求出表达式表达式3的值的值(不求表达式不求表达式2的值的值),并把它作为运算结果。,并把它
58、作为运算结果。max=a=b?a:b;printf(%s,ab?a大于大于bn:a小于等于小于等于bn);ch=(ch=A&ch=Z)?(ch+32):ch; sizeof运算符单目运算符,用于计算操作数类型或表达式的单目运算符,用于计算操作数类型或表达式的值占用内存的字节数。格式为:值占用内存的字节数。格式为: sizeof(类型名或表达式类型名或表达式) sizeof(int) /*4(在在32位系统中位系统中)*/sizeof(float) /*4*/sizeof(100) /*1*/sizeof(a+2.5) /*8 因因a+2.5的值为的值为double型型*/sizeof(
59、Hello)/*6 因因Hello占占6字节内存字节内存*/sizeof(1+2) /*4(在在32位系统中位系统中)*/sizeof(1+2) /*4(在在32位系统中位系统中)*/2.4 C语言的输入输出输入输出输入输出(I/O):程序运行所需数据往往要从外设程序运行所需数据往往要从外设(如键盘等如键盘等)得到,得到,程序的运行结果通常也要输出到外设程序的运行结果通常也要输出到外设(如显示器、打印机、文件如显示器、打印机、文件等等)。C语言实现语言实现I/O的方法:的方法:C语言没有专门的语言没有专门的I/O语句,语句,I/O操作通过调操作通过调用标准库用标准库stdio.h中声明的库函数
60、来实现。中声明的库函数来实现。getchar:从键盘输入一个字符从键盘输入一个字符putchar:向显示器输出一个字符向显示器输出一个字符scanf:从键盘输入基本类型的数据从键盘输入基本类型的数据printf:向显示器输出基本类型的数据向显示器输出基本类型的数据 非格式化字符输入输出函数非格式化字符输入函数非格式化字符输入函数原型:原型:int getchar(void);功能:从键盘输入一个字符。若调用成功,则返回功能:从键盘输入一个字符。若调用成功,则返回输入的字符,否则返回输入的字符,否则返回EOF(-1)。例如:例如: c=getchar(); 注注.若从键盘输入若从键盘输入Ctrl+Z键,则键,则c得到的是得到的是EOF(-1)。非格式化字符输出函数非格式化字符输出函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年黑龙江省穆棱市高考物理一轮复习试卷(达标题)附答案详解
- 2026江苏泰州市人民医院招聘高层次人才6人(第二批)笔试备考试题及答案详解
- 2026年云南省泸水市高考物理一轮复习考试卷带答案详解(新)
- 2026贵州黔东南州黎平县中医医院招聘编外工作人员18人笔试备考题库及答案详解
- 2026中国地质调查局局属单位招聘(第二批)补充招聘笔试参考试题及答案详解
- 2026年山东省滕州市高考物理5月学情自测测试卷及参考答案详解【培优A卷】
- 2025年广东省雷州市高考物理5月学情自测考试卷带答案详解(典型题)
- 2026年云南省腾冲市高考物理二模试卷及答案详解
- 2025年江西省德兴市高考物理自主招生模拟卷及完整答案详解【名师系列】
- 2025年江西省樟树市高考物理一模试卷有完整答案详解
- 2026云南地质工程第二勘察院有限公司社会招聘29人考试参考题库及答案详解
- 2026贵州贵阳市白云区选聘社区工作者62人备考题库含答案详解
- 2026上海博物馆公开招聘12名工作人员备考题库完整参考答案详解
- 2026年四川省高考历史试题(含答案及解析)
- 2025年河南省招聘乡村振兴村级协理员真题
- 四川《装配式复合轻质墙体标准》
- 2026年广东省大湾区联考初中学业水平质量监测卷八年级地理(试卷+解析)
- 2026年见证取样员模拟题含答案详解(研优卷)
- 养老机构安全隐患排查治理台账(范本)
- 中信建投:27年钠电平价放量无虞碳酸锂涨价预期加速进程
- 漂流岗位责任制度
评论
0/150
提交评论