1、第1讲 C语言基础,要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数据类型的常量和变量是如何定义的? (4) C语言有几种类型的表达式?各种类型表达式是如何求值的? (5) 在C语言混合运算的表达式中,各种运算符的优先级和结合性。,一、C程序的组成,C程序,函数组成,由若干,函数说明部分,函数体,函数类型说明,函数名,函数形参,形参类型说明,变量定义部分,执行部分,int sum( x, y )int x, y; int z;z=x+y;retrun z;,int sum(int x, int y) int z;z=x+y;ret
2、run z;,例如:,等价,(函数首部),1 C程序中必有且仅有一个main( )函数,程序从main( )开始执行,并且在main( )中结束。2 每一个说明,每一个语句都必须以分号“;”结尾。但预处理命令,函数头和花括号“”之后不能加分号。3 C 语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。在TC+中,注释符以“/” 开始,到本行结束。 例如:int a ,b; / 定义2个整型变量,C 的数据类型,C语言的基本符号,1. 基本符号: 26个英文字母包括大写和小写,C 中大小写字母被认为是两个不同的字符。 数字 09。 特殊符号:如 初等量表达式操
3、作符:( ), ,. ,; 一元操作符:*, 逗号操作符:,;,2. 标识符用来表示变量名、符号常量名、函数名、数组名、类型名、文件名等的有效字符序列 。 标识符的组成:由字母、数字、下划线(-)组成,且第一个字符必须是字母或下划线。注意:C语言中 大、小写字母被认为是两个不同的字符: sum 和SUM。例 sum, _total, lotus_1, A1, B123 为合法的标识符。而 M. John, 1A, $3.33 不合法。 标识符字符序列长度 ANSI C 无规定。 一般取前8位,例:student_number, student_name 不能区分stu_number, stu_
4、name 能区分, 标识符分类:(分3类)关键字:32个,一般用小写字母。 数据类型关键字(12个):char, double, enum, float, int, long, short, signed, struct, union, unsigned, void 控制语句关键字(12个):break, case, continue, default, do, else, for, goto, if, return, switch, while 存储类型关键字(4个):auto, extern, register, static其它关键字(4个):const, sizeof, typedef
5、, volatile预定义标识符:如 printf( ), scanf( ), define, include.用户定义的标识符一般应选用有一定含义的字符串,以便于程序阅读。, 选择题:以下选项中,均是不合法的用户标识符是 ( )。A) A B) float C) b-a D) _123P_0 1a0 go# temp do _A int INT,3.2 常量与变量,常量,常量在程序运行过程中其值不能被改变的量。常量有不同的类型, 如 0,-3,4.6,-1.23,a, d, A 分别为不同类型。常量一般从其字面形式即可判别类型,这种常量称为字面常量或直接常量。,1. 直接常量如 12、0、-
6、3 整型, 45l 长整型 4.6、-1.23 实型a、101、D 字符型 “abc”、“1024” 字符串 (字符数组 ),2. 符号常量 格式 #define 标识符 常数如 #define PRICE 30,习惯上符号常量名用大写,变量名用小写,以示区别。 使用符号常量的好处是: 含义清楚。 在需要改变一个常量时能做到“一改全改”。 注意: 符号常量不能再被赋值. 要避免产生岐义(宏定义),变量,变量 其值可以改变的量称为变量。 一个变量应该有一个名字 变量名,用合法的标识符表示在内存占据一定的存储单元,在该内存单元中存放变量的值。应注意区分变量名和变量值这两个不同的概念:变量名实际上是
7、一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。,C语言中,要求对所有用到的变量作强制定义,即先定义后使用, 这样可以: 确保程序中变量名的正确。 一个变量一经定义,在编译时就可以为其分配相应的存储单元。 由于每个变量都有一个类型,因此在编译时可以检查该变量所进行的运算是否合法。,注意 1. 变量名和变量值是不同的。如: x=3.14 变量名 x 变量值 3.14 2. 变量名由字母、数字、下划线组成,由字母、下划线开头 3. 大写字母和小写字母是不同的,一般用小写字母如:sum 和 SU
8、M 是两个变量名 4. 变量名应“见名知意” 如:sum、count、total 5. 变量应“先定义,后使用”,未定义的不得使用6. 每一变量有一确定类型 如:int, float,char 7. 尽量避免用容易混淆的字符 如: o和0, l和1, z和2,整型数据,整型常量的表示法即整常数,C语言中有以下三种表示形式:1. 十进制: 如 123 0 -4562. 八进制: 以0开头的数即认为是八进制数。如 0123 即八进制的123, 相当于十进制的833. 十六进制: 以0x或0X开头的数即认为是十六进制数。如 0x123 即十六进制的123, 相当于十进制的291 。, 选择题:以下选
9、项中,均是合法的整型常量的选项是 ( )。A) 160 B) -0xcdf C) -01 D) -0x48a-0xffff 01a 986,012 2e5 011 0xe 0668 0x,补充 数制转换,1. 十进制 八进制(二、十六进制)整数转换:除8取余,例如 (175)10=(257)8,175,21,2,8,8,余数 7 5,读数:,2.八进制(二、十六进制)十进制 整数转换:,(11001)- 1*24 +1*23 +0*22 +0*21 +1*20 = 16 + 8 + 0 + 0 + 1= (25)10,1. 整型数椐在内存中存放形式数椐在内存中是以二进制形式存放的,每一个整型变
10、量在内存中占两个字节。 如 定义一个整型变量 i : int i=10;10 的二进制表示为1010, 内存中的存储形式为: 00000000 00001010,实际上,在计算机中数值是以补码表示的。一个正数的补码和其原码相同,负数的补码为其绝对值的二进制形式按位取反再加1。例如,若 i=-10; 二进制表示为: 00000000 00001010 10的原码 11111111 11110101 10的反码 11111111 11110110 -10的补码,补充 原码、反码、补码的概念 原码 存储单元的最高位为符号位,其0为正,1为负,值为二进制,补码 补码=反码+1,反码 代码的0变为1,
11、1变为0,注意 正数的原码、反码、补码是一样的,例 (-10)10 1000 0000 0000 1010 - 原码 求反 1111 1111 1111 0101 - 反码 +1 1- 1111 1111 1111 0110 - 补码,2. 整型变量的分类可以根据数值的范围将整型变量定义为基本整型、短整型或长整型。 基本型: 以 int 表示,变量的值范围为 -3276832767。 短整型: 以 short int 或 short 表示 长整型: 以 long int 或 long 表示为了充分利用变量的表数范围,可以不设符号位,而用全部二进位存放数据,只存放不带符号的整数,即定义无符号型。
12、可以有无符号整型( unsigned int )、无符号短整型( unsigned short )、无符号长整型 ( unsigned long )。归纳起来,可以使用以下6 类整型变量:int unsigned intshort int unsigned short intlong int unsigned long intC 标准并没有具体规定以上各类数据所占内存字节数,只要求long型数据长度不短于int 型,short 型不长于int 型。,例1 整型变量的定义和使用main( ) int a,b,c,d; /* 定义整型变量 */unsigned int u; /* 定义无符号整型变
13、量 */a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=%d , b+u=%dn“,c,d );,运行结果: a+u=22, b+u=-14,可以看到:不同种类的整型数据可以进行算术运算.,3. 整型变量的定义(强制类型定义):int a, b; - a,b定义为整型unsigned short c, d; - c,d定义为无符号短整型long e, f; - e,f定义为长整型变量定义一般放在函数的开头部分的声明部分。,4. 整型数据的溢出例 2 整型数据的溢出main( ) int a,b;a=32767;b=a+1;printf(“%d , %d “, a
14、,b );,a: 0111111111111111 32767 b: 1000000000000000 -32768,运行结果:32767 , -32768,一个 整型变量只能容纳 -3276832767(-215 215-1 ) 范围内的数,无法表示大于32767 的数,遇此情况就发生“溢出”。 (教材P43表),实型数据,实型常量的表示法C语言中的实数又称浮点数,有两种表示形式: 1. 十进制数形式:由数字和小数点组成(必须有小数点)。如 0.123 .123 123. 0.0 2. 指数形式:由数字、字母E (或 e ) 和小数点组成,且E 后面必须是整数,E 前面必须要有数字 。如 1
15、23e3 1.23e6 123.4E2规范化的指数形式:在字母e 或E 之前的小数部分中,小数点左边有且只有一位非零数字。 如 1.23e, 选择题:以下选项中,均是不合法的实型常量的选项是 ( )。A) 160. B) 123 C) -.18 D) -e30.12 2e4.2 123e4 .234 e3 . e5 0.0 1e3,实型变量 1. 实型数据在内存中的存放形式一个实型数据一般在内存中占用四个字节(32位),按照指数形式存储。 例如,3.14159 按照 “ +0.314159e1” 形式存储。在4个字节中,究竟用多少位来表示小数部分、多少位来表示指数部分,标准C 并无具体规定,完
16、全由各编译系统自定。小数部分占的位数越多,数的有效数字越多,精度越高。指数部分占的位数越多,则能表示的数值范围越大。单精度float型(32 bit,67位有效数字)2. 实型变量的分类 双精度double型(64 bit,1516位有效数字)3. 实型变量的定义: 每个实型变量也必须在使用之前定义例如 float x,y; -定义 x 和 y 为单精度型变量double z; -定义 z 为双精度型变量单精度与双精度只是数据的有效位数不同.。,4. 实型数据的舍入误差由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会产生误差(四舍五入
17、)。例3main( ) float a,b;a=123456.789e5;b=a+20;printf(“ %f “,b);,运行结果:12345678848. 000000这是因为一个实型变量只能保证7位数字有效。 注意:应避免将一个很大的数和一个很小的数相加或相减。,a:12345678900 b:12345678920 ?,一、 字符常量C的字符常量是指用单引号括起来的一个字符, 如 a, A, $ 等, 除上述字符常量之外,C中还允许一种特殊字符常量,即以 “ 开头的字符序列, 称为“转义字符“,意思是将 “ ” 后面的字符转变成另外的意义。n 换行t 水平制表(跳到下一个tab位) (
18、一个tab位占8列)v 竖向跳格(相当于换行)b 退格,将当前位置移到前一列r 回车(到行首,不换行)f 走纸换页,将当前位置移到下页开头 字符 “ ” 字符 “ ”ddd 13位八进制数所代表的字符 如 074xhh 12位十六进制数所代表的字符 如 x74,字符型数据,单引号,例 A (65)10 = (101)8 101=A P374换行符 (10)10 = (12)8 012=n, 选择题:以下选项中,均是不合法的转义字符的选项是 ( )。A) B) 1011 C) 011 D) abc f 101xf a x1f, 选择题:以下选项中,正确的字符常量是 ( )。A) “c“ B) C
19、) 085 D) W,三、 字符数据在内存中的存储形式及其使用方法将一个字符常量存到一个字符变量中去,并不是把该字符本身放入内存单元之中,而是将该字符的相应的ASCII码American national Standard Code for Information Interchange(美国国家信息交换标准代码)。存放到存储单元之中。例如: char c1, c2;c1=a; c2=b;,二、 字符变量字符变量用来存放字符常量(只能放一个字符,而不是字符串)。字符变量的定义: char c1, c2; 定义c1,c2为字符变量,内存中存放的不是a 和 b,而是 a 和 b 的ASCII码 9
20、7 和 98,由于字符数据以ASCII码存储,因此与整数有相同的形式,因此C 语言中的字符型数据和整型数据之间可以通用。,例. char c1, c2;c1=a; 与 c2=b; 对c1、c2分别赋值,结果相同。,至于是输出字符还是整数取决于“格式控制符“。 %d:十进制整型 %c:字符型,char c1, c2; c1=97; c2=98;,大小写字母转换。main( )char c1 , c2 ;c1=a ;c2=b ;c1=c1-32 ;c2=c2-32 ;printf(“%c %c“ , c1 , c2) ;,从ASCII码表中可以看到,每一个小写字母比它相应的大写字母的ASCII大3
21、2。因此有: 小写字母32 大写字母,运行结果: A B,四、 字符串常量 字符串常量:是一对双引号 “ “ 括起来的字符序列。如: “How do you do.“$123.45“ 字符串常量与字符常量:字符常量是一个字符,字符串常量是一对双引号 括起来的字符序列。C 规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统椐此判断字符串是否结束。C 规定以字符 0 作为字符串结束标志。 0 是系统自动加上的,在写字符串时不必加 0 。“a“ 与 a 的区别:字符串“a“实际上包含2个字符:a 和 0,占2个字节;a占1个字节。注意:不要混淆字符常量与字符串常量!字符串常量不能赋给一个字
22、符变量。如: c=“a“; 是非法的,而应该是 c=a;C语言中的字符串用字符型数组来存放。, 选择题:以下选项中,均是正确的数值常量或字符常量的是 ( )。A) 0.0 B) “a“ C) 3 D) +0010f 3.9E-205 011 0xabcd8.9e 1e1 0xFF00 2e2& 0a 50., 选择题:下面不正确的字符串常量是 ( )。A) abc B) “1212 C) “0“ D) “ “,练习题,变量赋初值,程序中常常需要对一些变量预先设定初始值,C语言中规定,可以在定义变量的同时使变量初始化。如 int i=3;float x=2.5;变量赋初值相当于变量定义与变量赋值
23、两部分。如: int i=3; 相当于 int i; i=3; 也可以使被定义的变量的一部分赋初值。如: int a, b, c=5; (只对c 赋初值5),如果对几个变量赋以同一个值,不能写成int a=b=c=3 ; 而应写成 int a=3,b=3,c=3 ;,变量初始化一般是在程序运行、执行本函数时赋予初值的。 而定义是在编译时执行的,各数据类型之间的混合运算,注注意: 这里只是指出数据类别级别的高低,而不是说必须一级一级转换。例如: int 与 double 运算,则int 直接转换成double,然后运算,而不必经过 unsigned 和 long 这两级。,整型、实型(单精度、双
24、精度)可以混合运算,而字符型数据与整型通用,因此, 整型、实型(单精度、双精度)、字符型数据之间可以混合运算。例如: 10+a+12.3*b 是合法的 在运算时先将各种类型化成同一类型,然后进行运算, 类型转换的规则是:,算术运算符和算术表达式1. 基本算术运算符分两类:一元和二元运算符: 一元有 : (负号)、 、 ; 例如 -x , x+ , x- 二元有: 、 * 、%(模运算符,求余运算符);例如: x+y ; x-y ; x*y ; x/y ; x%y (表示两个整数求余数 , 如 7%4 的值为 3)注意二点: 两个整数相除,结果为整型,舍去小数部分。如果其中一个为实型,则结果为d
25、ouble。如果其中之一为负数,则舍入的方向是不定的,依机器而定。多数机器采取“向零取整”。如 5/3 =1 , 3/5=0, -5/3=-1 % 运算符只适用于整数。 5%3=2 , 3%5=3 , 8%4=0 -7%4=-3 , 7%(-4)=3 注意:求模运算中,结果值的符号与第一个数(即被求模的数)符号相同.,C的算术表达式: 用算术运算符和括号将运算对象连接起来的、符合C语法规则的式子。 这里运算对象包括:常量、变量、函数等。如: a*b/c+1+12.3*a 是一个合法的算术表达式优先级: - , + , -* , / ,%+ , - 算术运算符的结合方向(结合性)是 自左至右(左
26、结合,语言中还有右结合)如: a-b*c - 与 * 之间先 * 后 -a-b+c - 与 + 同级,则先 - 后 +如果一个运算符两边的数据类型不同,则按前面的法则进行转换,然后运算。,2. 算术表达式和运算符的优先级与结合性,3. 强制类型转换可以用一个强制类型转换运算符将一个表达式的值转换成所需要的类型。一般形式: (类型名) (表达式)如: (double) a 将a 的值转换成double型(int) (x+y) 将(x+y)的值转换成int 型 比较 与(int) x+y 有何不同?(float) (5%3)注意:强制类型转换只是将表达式的值转换成所需的类型,而原来的变量类型并没有
27、变化。,因此有两种方法进行类型转换: (1) 自动转换 (按级别高低)(2) 强制转换 (用强制类型转换运算符),例: 强制类型转换。 1. main( ) float x ;int i; x=3.6 ;i=(int) x ;printf(“x=%f , i=%d“,x, i) ;,运行结果:x=3.600000 , i=3,3. main( ) float x ;int i , j ;x=3.6 ;i=5 ;j=(int)x%i ;printf(“j=%d“,j);,2.main( ) int x , y ;long z ;x=400 ;y=200 ;z=(long)x*y ;printf(
28、“z=%ldn“,z) ;,运行结果: j=3,运行结果: z=80000,4. 自增运算符( +) 、自减运算符(- -),自增、自减的作用是使变量的值增1、减1。 +i 、 - -i :在使用i之前使i的值先增加1(或减少1) , 即先变化i后得到新的i值,再使用该新的i进行运算。i+ 、 i- -:在使用i之后再使i的值增加1(或减少1) , 即先使用原来的i进行运算,运算结束后再变化原来的i,得到新的i值。例如:n=3; n=3 ;m=n+ ; m=+n ;结果是 m 为 3 , n 为 4 ; m为 4 , n 为 4 注意: 自增、自减运算符只能用于变量,不能用于常量或表达式。 自
29、增、自减运算符是自右至左结合的(不同于算术运算符)。如: -i+ 表示 (i+),而不是 (-i)+ , 而(-i)+也是不合法的。若 i=3; printf(“%d“, -i+);,先取出i 的值3 ,输出-i 的值-3,然后i 增值为4。,赋值运算符和赋值表达式,1. 赋值运算符赋值号 “=” 就是赋值运算符。它的作用是将一个数据赋给一个变量, 也可以将一个表达式的值赋给一个变量。 如: x=1 ; c=a+b; 2. 类型转换当赋值号两边类型不一致,但都是数值型或字符型时,赋值时要进行类型转换。不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。,A. float
30、 - int 实型赋给整型, 舍去小数 i=3.56 - i=3,不“四舍五入”,B. int - float 数值不变, 以浮点数形式储存, 补足0f=23 - f=23.00000 (有效数字7位),#include void main () int y;double d=3.4, x;x=(y=d/2.0)/2;printf(“(%0.2f,%d)“,x,y);getch(); 程序运行结果: A. (0.00,1) B.(0.85,1.7) C.(0.50,1) D. 以上都不对,例题,赋值运算符和赋值表达式,例: *=: a*=3 ; a=a*3 ; /=: x/=y+3 ; x=x
31、/(y+3);%=:a%=3 ; a=a%3 ;,3. 复合的赋值运算符在赋值运算符之前加上其它运算符可以构成复合运算符。如: 在 = 之前加上 +, 则构成 +=。a+=3 相当于 a=a+3含义是: a+=表达式 相当于 a=a+表达式如果表达式是由多项构成,则相当于有括号,即 a=a+(表达式)凡是二元(二目)运算符都可以与 “ = ” 一起组成赋值运算。 C 语言中规定可以用10 种复合赋值运算符:+= -= *= /= %= = &= = |=,4. 赋值表达式 什么是 赋值表达式 ?由(单一或复合)赋值运算符将一个变量和一个表达式连接起来的式子。 一般形式: 赋值表达式的求解过程是
32、:先对运算符右侧的表达式求值,再将该值赋给运算符左边的变量。 赋值表达式的值:就是被赋值的变量的值。 如: a=5 的值是5。 这里既可以是一个普通的表达式,也可以是一个赋值表达式。如: a=(b=5) 即表示 b=5 和 a=5由于赋值运算符是自右至左结合,因此 a=(b=5) 等价于 a=b=5例: a=(b=4)+(c=6) c=6 , b=4 , a=10a=(b=10)/ (c=2) c=2 , b=10 , a=5例: 有表达式 a+=a-=a*a ,设 a=12,求 运行结果。,(1) a-=a*a ,即a=a-a*a=-132 (2) a+=a ,即a=a+a=-264,注意:
33、如果在赋值表达式后面加上 “ ; ” ,则成为赋值语句。,逗号运算符和逗号表达式,用 “ , ” 将两个表达式连接起来所构成的表达式称为逗号表达式。如: 3+5 , 6+8逗号表达式的一般形式: 表达式1 , 表达式2求解过程: 先求表达式1的值,再求表达式2的值,整个表达式的值是表达式2 的值。如上式,结果是14又如: a=3*5,a*4 结果是a= 15, 表达式值是60。一个逗号表达式可以与另一个逗号表达式组成新的逗号表达式。如: (a=3*5,a* 4) , a+5即: (1) a=15(2) ( 15 , 60) = 值为 60(3) 60 ,20 = 整个表达式的值为 20例: (
34、1) x=(a=3,6*a) (2) x=a=3,6*a,赋值表达式:a为 3 ,x 为18 ; 逗号表达式:x为 3,a为 3。,逗号表达式可以推广到多个表达式的情况表达式1 , 表达式2, . , 表达式n 它的值是 表达式n 的值。由于逗号运算符是所有运算符中级别最低的,因此书写表达式时要注意求解的次序。注意:并非所有的 “,“ 都是运算符如: printf(“%d,%d,%d“,a,b,c); -这里的“,“ 都只是分隔符而 printf(“%d,%d,%d“, (a,b,c), b, c); -这里(a,b,c)中的“,“是运算符,逗号运算符和逗号表达式,选择题: 下面符合C 语言语
35、法的赋值表达式是 ( )。A) d=9+e+f=d+9 B) d=9+e, f=d+9 C) d=(9+e, e+, d+9) D) d=9+e+=d+7,关系运算符和表达式,一、关系运算符及优先级别比较两个量的运算符称为关系运算符。 在语言中有以下关系运算符:大于 = 大于或等于 = 等于 != 不等于 关系运算符的优先级:(1) 、=、=优先级相等,=、!=优先级相等,前者高于后者。(2) 关系运算符的优先级低于算术运算符。(3) 关系运算符的优先级高于赋值运算符。,关系表达式的一般形式为: 表达式 关系运算符 表达式 关系表达式的值是: 关系成立为“真”,不成立则为“假”,C语言中用“1
36、”表示“真”、“0”分别表示 “假” 。例如:a+bc-dx3/2a+1(bc), a!=(c=d)等也都是合法的关系表达式。,二、关系表达式,关系运算符和表达式,条件运算符为 ? : 它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:表达式1? 表达式2 :表达式3 其求值规则如右图:,例如条件语句: if(ab) max=a;else max=b; 可用条件表达式写为 :max=(ab)?a:b;,条件运算符和条件表达式,使用条件表达式时,还应注意以下几点:1. 条件运算符的运算优先级 低于关系运算符和算术运算符,高于赋值符。因此 max=(ab)?a:b可
37、以去掉括号而写为 max=ab?a:b 2. 条件运算符? :是一对运算符,不能分开单独使用。 3. 条件运算符的结合方向是自右至左。 例如:ab?a:cd?c:d 应理解为ab?a:(cd?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。,条件运算符和条件表达式,例,main() char ch;scanf(“%c“, ,if (ch=A ,等价,条件运算符和条件表达式,一、逻辑运算符语言中提供了三种逻辑运算符 ! 非运算 & 与运算 | 或运算运算符&和或运算符|均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。1、 逻辑运算符优先级表示如下:
38、(1) ! 高于 & 高于 |(2) &, | 低于关系运算符,!高于算术运算符(*, / )。,逻辑运算符和表达式,按照运算符的优先顺序可以得出:ab & cd等价于(ab) & (cd)!b=c|dc & x+yc) & (x+y)b) 2、逻辑运算的值:逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。,逻辑运算符和表达式,3、逻辑运算的规则: (1)与运算&参与运算的两个量都为真时(非0),结果才为真(值为1),否则为假(值为0)。例如:50 & 42,由于50为真,42也为真,其结果也为“真”,表达式的值为1。 (2)或运算| 参与运算的两个量只要有一个为真(非0),结果
39、就为真(值为1)。 两个量都为假(值为0)时,结果为假(值为0)。 例如:50 | 58, 结果也就为真(值为1)。,逻辑运算符和表达式,(3)非运算!参与运算量为真(非0)时,结果为假(值为0);参与运算量为假(值为0)时,结果为真(值为1)。例如:!(50)的结果为假(值为0)。注意:语言在逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:5&3 的值为“真”,即为1。又如:5|0的值为“真”,即为1。,逻辑运算符和表达式,二、逻辑表达式逻辑表达式的一般形式为:表达式 &或 | 表达式 !表达
40、式逻辑表达式的值:各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。 例如:,char c=k;int i=1,j=2,k=3;printf(“%d n“, i=5,逻辑运算符和表达式,说明:在逻辑表达式的求解中,并不是所有的逻辑运算符都执行,只有在必须执行下一个逻辑运算符才能求出表达式的值时,才执行下一个运算符。(1) 表达式1 & 表达式2 a+b0 & b+如果:表达式1的值是0,无论表达式2的值是什么,整个表达式的值都为0,因此表达式2就不计算了。(2)表达式1 | 表达式2 a+b0 | b+如果:表达式1的值是1,无论表达式2的值是什么,整个表达式的值都为1,因此表达式
41、2就不计算了。,逻辑运算符和表达式,判断题: 表达式 !x 等价于 x!=1 表达式 (z=0,(x=2)|(z=1),z) 的值是 1 填空题:执行表达式 (z=0,(x=2)|(z=1),z)后变量z 的值是,逻辑运算符和表达式,0, 选择题1:设x, t 均为int 型变量,则执行以下语句后,t 的值是 ( ).x=10; t=xA) 不定值 B) 2 C) 1 D) 0,逻辑运算符和表达式, 选择题3:设有整型变量 a,b,c, 其中 a,b 的值分别为 10 与 20, 计算表达式 “c=(a%2=0)?a:b”后 ,c 的值为_A、 0 B、 5 C、10 D、20,位运算 进行二
42、进制位的运算 。,位运算符和位运算,说明: 位运算符中除了 以外,均为二目(元)运算符,即要求两侧各有一个运算量。高于关系运算“ ,=”,底于算术运算符“+,-”&底于关系运算“=, !=”,高于逻辑运算符“&” 运算量只能是整型或字符型数据,不能为实型数据 。,高,底,位运算符和位运算,位运算符和位运算,计算机中的控制字各个位表示某些设备的状态,状态发生变化,各个位通过位运算改变数值。,位运算符和位运算,位运算符和位运算,三、 按位异或运算符() 两个数的相应位按位异或异或 判断两个相应的位值是否为“异“,“异“则结果为1,否则为0 运算规则 : 相应位的位值不同时(相异), 作或 的运算。
43、即 0 0 = 0 1 0 = 1 0 1 = 1 1 1 = 0 例如: 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 11 1 0 1 0 1 1 0 用途 : 用 1 去与某些位“异或” ,使 特定位翻转。0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 10 1 1 1 0 1 0 1 用 0 去与某些位异或 , 保留原值。 如上例中前 4 位用 0去异或,保留原值 0111,位运算符和位运算,对一个二进制数按位取反 ( 0 1 , 1 0 ) 例如 : 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 又如 : 若一个整数 a 为16 位,要使
44、a 最低一位为 0,可以用a= a (与 a 的字长无关) 其中: 1 = (0000000000000001)=1111111111111110,四、按位“取反”运算符( ),位运算符和位运算,将一个二进制数的各位全部左移若干位,右端空位补0, 高位左移后溢出,舍去不起作用。 例如 : a = a 2 ; (左移二位) 若 a=15 , a 二进制数为 0 0 0 0 1 1 1 1 a 左移2 位为 0 0 1 1 1 1 0 0 其值为 60。 左移2 位 相当于 乘以 22 =4,但此结论只适用于左移时被溢出舍弃的高位中不包含1 的情况。(见下表),五、 (左移运算符),位运算符和位运
45、算,六、 (右移运算符)将一个二进制数的各位全部右移若干位,移到右端的低位被舍去。无符号数, 高位补0。有符号数,正数(符号位为0)左边移入0,负数则取决于所用的计算机系统,有“逻辑右移”(移入0)和“算术右移”(正数移入0, 负数移入1),称为符号位扩张。(Turbo C 采用算术右移) 例如: a=a 2 ; (右移二位 ), 若 a=016a 二进制数为 0 0 0 0 1 1 1 1,a 右移二位为 0 0 0 0 0 0 1 1 a: 1001011111101101 a1: 0100101111110110 (逻辑右移) a1: 1100101111110110 (算术右移),位运
46、算符和位运算,位运算符与赋值运算符可以组合成复合赋值运算符位运算赋值运算符。如 : &= , |= , = , = , = 2 相当于 a = a2,七、位运算赋值运算符,位运算符和位运算,若 a 是整型变量 , 表达式 (aa) 等于 .A、 a B、 1 C、 0 D、2,例:,位运算符和位运算,小 测 验,1. 一个程序是从_ 函数开始执行的。 2. 一个C 源程序中的基本单位是_。 3. 一个C 语言程序是由_ 组成。 4. 一个C 源程序中至少应包括一个_。 5. 写出下面不合法的用户标识符_float , b-a , _123 , p_o , 1ao , temp , long , _A , 6. 写出下面不合法的整型常数是_160 , -01 , 0668 , 011 , 0x , 01a , -0xffff , -0x48aa , 3.4E2 6. 写出下面不合法的浮点数是_ 160. , e3 , 123 , 2e4.5 , .e5 , 1e3,