690 likes | 873 Views
第 1 讲 C 语言基础. 要求 : (1) C 程序的组成 (2) C 语言的标识符是如何定义的。 (3) C 语言有哪些基本数据类型?各种基本数 据类型的常量和变量是如何定义的? (4) C 语言有几种类型的表达式?各种类型表 达式是如何求值的? (5) 在 C 语言混合运算的表达式中,各种运算 符的优先级和结合性。. 一、 C 程序的组成. 函数类型说明. 由若干. 函数名. 函数说明部分. 函数形参. C 程序. (函数首部). 函数组成. 形参类型说明. 变量定义部分. 函数体. 例如:. 执行部分.
E N D
第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; retrun z; } 等价
1 C程序中必有且仅有一个main( )函数,程序从main( )开始执行,并且在main( )中结束。 main( )函数可以放在任何位置。 2每一个说明,每一个语句都必须以分号“;”结尾。但预处理命令,函数头和花括号“}”之后不能加分号。 3 C 语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。 在TC++中,注释符以“//”开始,到本行结束。 例如: int a ,b; // 定义2个整型变量
C 的数据类型 1. 数据的描述(数据结构) 一个程序应包括两个方面的内容: 2. 操作的描述(即操作步骤、算法) 数据是操作的对象,操作的结果又会改变数据的状况。 数据结构与算法的结合才成为一个程序。 C语言提供的数据结构是以数据类型形式出现的,C的数据类型有: 基本型 (int) 整型 短整型 (short int) 长整型 (long int) 无符号型 (unsigned int) 基本类型 实型(浮点型) 单精度 (float) 双精度 (double) 字符型 (char) 枚举型 (enum) 数组类型 (type[ ]) 构造类型 结构体类型 (struct) 共用体类型 (union) 指针类型 (type *) 空类型 (void)
1. 基本符号: ⑴ 26个英文字母 包括大写和小写,C 中大小写字母被认为是两个不同的字符。 ⑵ 数字0~9。 ⑶ 特殊符号:如 ① 初等量表达式操作符:( ),[ ],. ,→; ② 一元操作符:*,&,-,!,~,++,- -,sizeof( ); ③ 二元操作符: +,-, *,/,%,>>,<<,>,<,>=,<=,==,!=,&,^,|,&&,|| ; ④ 赋值组合操作符:=,+=,- =,*=,/=,%=,>>=,<<=,&=,^=,|= ; ⑤ 逗号操作符:,; C语言的基本符号
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_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, volatile ②预定义标识符: 如 printf( ), scanf( ), define, include…. ③用户定义的标识符 一般应选用有一定含义的字符串,以便于程序阅读。 选择题:以下选项中,均是不合法的用户标识符是 ( )。 A) A B) float C) b-a D) _123 P_0 1a0 go# temp do _A int INT
3.2 常量与变量 常量 十进制常量 长整型常量(后缀加l(不是数字1)) 八进制常量(0开头常数) 十六进制常量(0x开头常数) 实型常量 单个字符常量 字符串常量 整型常量 算术常量 常量 字符常量 符号常量 常量——在程序运行过程中其值不能被改变的量。 常量有不同的类型, 如 -3,4.6,‘a’, “as” 分别为不同类型。常量一般从其字面形式即可判别类型,这种常量称为字面常量或直接常量。
1.直接常量 如 12、0、-3 整型, 45l 长整型 4.6、-1.23 实型 ‘a’、‘\101’、‘D’ 字符型 “abc”、“1024” 字符串 (字符数组 ) 2. 符号常量 格式#define 标识符 常数 如 #define PRICE 30 习惯上符号常量名用大写,变量名用小写,以示区别。 使用符号常量的好处是: ①含义清楚。 ②在需要改变一个常量时能做到“一改全改”。 注意: 符号常量不能再被赋值. 要避免产生岐义(宏定义)
变量—— 其值可以改变的量称为变量。 一个变量应该 ①有一个名字—— 变量名,用合法的标识符表示 ②在内存占据一定的存储单元,在该内存单元中存放变量的值。 应注意区分变量名和变量值这两个不同的概念: 变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。 变量名 变量值 a 3 存储单元 变量 • C语言中,要求对所有用到的变量作强制定义,即先定义后使用, 这样可以: • 确保程序中变量名的正确。 • 一个变量一经定义,在编译时就可以为其分配相应的存储单元。 • 由于每个变量都有一个类型,因此在编译时可以检查该变量所进行的运算是否合法。
注意 1. 变量名和变量值是不同的。 如: x=3.14 变量名 x 变量值 3.14 2. 变量名由字母、数字、下划线组成,由字母、下划线开头 3. 大写字母和小写字母是不同的,一般用小写字母 如:sum 和 SUM 是两个变量名 4. 变量名应“见名知意” 如:sum、count、total 5. 变量应“先定义,后使用”,未定义的不得使用 6. 每一变量有一确定类型 如:int, float,char 7. 尽量避免用容易混淆的字符 如: o和0, l和1, z和2
整型常量的表示法 即整常数,C语言中有以下三种表示形式: 1. 十进制: 如 123 0 -456 2. 八进制: 以0开头的数即认为是八进制数。 如 0123即八进制的123, 相当于十进制的83 3. 十六进制: 以0x或0X开头的数即认为是十六进制数。 如 0x123即十六进制的123, 相当于十进制的291 。 整型数据 选择题:以下选项中,均是合法的整型常量的选项是 ( )。 A) 160 B) -0xcdf C) -01 D) -0x48a -0xffff 01a 986,012 2e5 011 0xe 0668 0x
补充 数制转换 1. 十进制 →八进制(二、十六进制) 整数转换:除8取余 例如 (175)10=(257)8 余数 7 5 8 175 21 8 2 读数:257 2.八进制(二、十六进制)→十进制 整数转换: (11001)2---> 1*24 +1*23 +0*22+0*21 +1*20 = 16 + 8 + 0 + 0 + 1 = (25)10
1. 整型数椐在内存中存放形式 数椐在内存中是以二进制形式存放的,每一个整型变量在内存中占两个字节。 如 定义一个整型变量 i : int i=10; 10 的二进制表示为1010, 内存中的存储形式为: 00000000 00001010 • 实际上,在计算机中数值是以补码表示的。一个正数的补码和其原码相同,负数的补码为其绝对值的二进制形式按位取反再加1。 • 例如,若 i=-10; 二进制表示为: • 00000000 00001010 10的原码 • 11111111 11110101 10的反码 • 11111111 11110110 -10的补码
补充原码、反码、补码的概念 原码存储单元的最高位为符号位,其0为正,1为负,值为二进制 反码代码的0变为1, 1变为0 补码补码=反码+1 例 (-10)101000 0000 0000 1010 --- 原码 求反 1111 1111 1111 0101 --- 反码 +1 1 -------------------------------- 1111 1111 1111 0110 --- 补码 注意正数的原码、反码、补码是一样的
2. 整型变量的分类 • 可以根据数值的范围将整型变量定义为基本整型、短整型或长整型。 • ⑴ 基本型: 以 int表示,变量的值范围为 -32768~32767。 • ⑵ 短整型: 以 short int或 short表示 • ⑶ 长整型: 以 long int或 long 表示 • 为了充分利用变量的表数范围,可以不设符号位,而用全部二进位存放数据,只存放不带符号的整数,即定义无符号型。可以有无符号整型( unsigned int )、无符号短整型( unsigned short )、无符号长整型 ( unsigned long )。 • 归纳起来,可以使用以下6 类整型变量: • int unsigned int • short [int] unsigned short [int] • long [int] unsigned long [int] • C 标准并没有具体规定以上各类数据所占内存字节数,只要求long型数据长度不短于int 型,short 型不长于int 型。
3. 整型变量的定义(强制类型定义): int a, b; ------------- a,b定义为整型 unsigned short c, d; ------ c,d定义为无符号短整型 long e, f; ------------ e,f定义为长整型 变量定义一般放在函数的开头部分的声明部分。 例1 整型变量的定义和使用 main( ) { int a,b,c,d; /* 定义整型变量 */ unsigned int u; /* 定义无符号整型变量*/ a=12; b=-24; u=10; c=a+u; d=b+u; printf("a+u=%d , b+u=%d\n",c,d ); } 运行结果: a+u=22, b+u=-14 可以看到:不同种类的整型数据可以进行算术运算.
4. 整型数据的溢出 例 2 整型数据的溢出 main( ) { int a,b; a=32767; b=a+1; printf("%d , %d ", a,b ); } 一个 整型变量只能容纳 -32768~32767 (-215 ~215-1 )范围内的数,无法表示大于32767 的数,遇此情况就发生“溢出”。 (教材P43表) 运行结果: 32767 , -32768 a: 0111111111111111 32767 b: 1000000000000000 -32768
实型常量的表示法 C语言中的实数又称浮点数,有两种表示形式: 1. 十进制数形式:由数字和小数点组成(必须有小数点)。 如 0.123 .123 123. 0.0 … 2. 指数形式:由数字、字母E (或 e ) 和小数点组成,且E 后面必须是整数,E 前面必须要有数字 。 如 123e3 1.23e6 123.4E2 规范化的指数形式:在字母e 或E 之前的小数部分中,小数点左边有且只有一位非零数字。 如 1.23e 实型数据 选择题:以下选项中,均是不合法的实型常量的选项是 ( )。 A) 160. B) 123 C) -.18 D) -e3 0.12 2e4.2 123e4 .234 e3 . e5 0.0 1e3
实型变量 1. 实型数据在内存中的存放形式 一个实型数据一般在内存中占用四个字节(32位),按照指数形式存储。 例如,3.14159 按照 “ +0.314159e1” 形式存储。 在4个字节中,究竟用多少位来表示小数部分、多少位来表示指数部分,标准C 并无具体规定,完全由各编译系统自定。小数部分占的位数越多,数的有效数字越多,精度越高。指数部分占的位数越多,则能表示的数值范围越大。 单精度float型(32 bit,6~7位有效数字) 2. 实型变量的分类 双精度double型(64 bit,15~16位有效数字) 3. 实型变量的定义: 每个实型变量也必须在使用之前定义 例如 float x,y; -----------定义 x 和 y 为单精度型变量 double z; -----------定义 z 为双精度型变量 单精度与双精度只是数据的有效位数不同.。
4. 实型数据的舍入误差 由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会产生误差(四舍五入)。 例3 main( ) { float a,b; a=123456.789e5; b=a+20; printf(" %f ",b); } a:12345678900 b:12345678920 ? 运行结果: 12345678848. 000000 这是因为一个实型变量只能保证7位数字有效。 注意:应避免将一个很大的数和一个很小的数相加或相减。
字符型数据 单引号 一、 字符常量 C的字符常量是指用单引号括起来的一个字符, 如 'a', 'A', '$' 等, 除上述字符常量之外,C中还允许一种特殊字符常量,即以 "\" 开头的字符序列, 称为"转义字符",意思是将 “ \” 后面的字符转变成另外的意义。 \n 换行 \t 水平制表(跳到下一个tab位) (一个tab位占8列) \v 竖向跳格(相当于换行) \b 退格,将当前位置移到前一列 \r 回车(到行首,不换行) \f 走纸换页,将当前位置移到下页开头 \\ 字符 “ \ ” \' 字符 “ ' ” \ddd 1~3位八进制数所代表的字符 如 ‘\074’ ‘\74’ '\4' \xhh 1~2位十六进制数所代表的字符 如 '\x74' '\x4' 例 A (65)10 = (101)8 '\101'='A’ P374 换行符 (10)10 = (12)8 '\012'='\n’
选择题:以下选项中,正确的字符常量是 ( )。 A) "c" B) '\\'' C) '\085' D) 'W' 选择题:以下选项中,均是不合法的转义字符的选项是 ( )。 A) '\''' B) '\1011' C) '\011' D) '\abc' '\\' '\' '\f ' '\101' '\xf ' '\a' '\}' 'x1f'
二、 字符变量 字符变量用来存放字符常量(只能放一个字符,而不是字符串)。 字符变量的定义: char c1, c2; ——定义c1,c2为字符变量 • 三、 字符数据在内存中的存储形式及其使用方法 • 将一个字符常量存到一个字符变量中去,并不是把该字符本身放入内存单元之中,而是将该字符的相应的ASCII码American national Standard Code for Information Interchange(美国国家信息交换标准代码)。存放到存储单元之中。 • 例如: char c1, c2; • c1='a'; • c2='b'; 内存中存放的不是'a' 和 'b',而是 'a' 和 'b' 的ASCII码 97 和 98 由于字符数据以ASCII码存储,因此与整数有相同的形式,因此C 语言中的字符型数据和整型数据之间可以通用。
至于是输出字符还是整数取决于"格式控制符"。至于是输出字符还是整数取决于"格式控制符"。 %d:十进制整型 %c:字符型 例. char c1, c2; c1='a'; 与 c2='b'; 对c1、c2分别赋值,结果相同。 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) ; } 运行结果: A B 从ASCII码表中可以看到,每一个小写字母比它相应的大写字母的ASCII大32。因此有: 小写字母-32 = =大写字母
四、 字符串常量 • 字符串常量:是一对双引号" " 括起来的字符序列。 • 如: "How do you do." • "$123.45" • 字符串常量与字符常量: • 字符常量是一个字符,字符串常量是一对双引号 括起来的字符序列。C 规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统椐此判断字符串是否结束。C 规定以字符 '\0 ' 作为字符串结束标志。 '\0 '是系统自动加上的,在写字符串时不必加 '\0 '。 • "a" 与 'a' 的区别:字符串"a"实际上包含2个字符:'a' 和 '\0',占2个字节;'a'占1个字节。 • 注意:不要混淆字符常量与字符串常量! • 字符串常量不能赋给一个字符变量。 • 如: c="a"; 是非法的,而应该是 c='a'; • C语言中的字符串用字符型数组来存放。
练习题 选择题:下面不正确的字符串常量是 ( )。 A) 'abc' B) "12'12'' C) "0" D) " " 选择题:以下选项中,均是正确的数值常量或字符常量的是 ( )。 A) 0.0 B) "a" C) '3' D) +001 0f 3.9E-205 011 0xabcd 8.9e 1e1 0xFF00 2e2 '&' '\''' 0a 50.
练习题 选择题: " \12\’12 "的字符串长度为( )。 A) 3 B) 4 C) 7 D) 5 选择题: " \1212\’12 "的字符串长度为( )。 A) 3 B) 6 C) 5 D) 编译出错
程序中常常需要对一些变量预先设定初始值,C语言中规定,可以在定义变量的同时使变量初始化。程序中常常需要对一些变量预先设定初始值,C语言中规定,可以在定义变量的同时使变量初始化。 如 int i=3; float x=2.5; 变量赋初值相当于变量定义与变量赋值两部分。 如: 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 ; 变量初始化一般是在程序运行、执行本函数时赋予初值的。 而定义是在编译时执行的.
高 double <--------float 即float必须先转换成double ↑ 以提高精度(即使两个数同为float long 型也必须转换为double后进行运算) ↑ unsigned ↑ 低 int <-------char, short字符、短整型必须转换成整型int 各数据类型之间的混合运算 整型、实型(单精度、双精度)可以混合运算,而字符型数据与整型通用,因此, 整型、实型(单精度、双精度)、字符型数据之间可以混合运算。 例如: 10+'a'+12.3*'b' 是合法的 在运算时先将各种类型化成同一类型,然后进行运算, 类型转换的规则是: 注注意: 这里只是指出数据类别级别的高低,而不是说必须一级一级转换。 例如: int 与 double 运算,则int 直接转换成double,然后运算,而不必经过 unsigned 和 long 这两级。
算术运算符和算术表达式 • 1. 基本算术运算符 • 分两类:一元和二元运算符: • 一元有 : -(负号)、 ++、 - - ; 例如 -x , x++ , x-- • 二元有: +、-、 * 、/、%(模运算符,求余运算符); • 例如: x+y ; x-y ; x*y ; x/y ; • x%y (表示两个整数求余数 , 如 7%4 的值为 3) • 注意二点: • ⑴ 两个整数相除,结果为整型,舍去小数部分。如果其中一个为实型,则结果为double。如果其中之一为负数,则舍入的方向是不定的,依机器而定。多数机器采取“向零取整”。 • 如 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' 是一个合法的算术表达式 优先级: - , ++ , -- * , / ,% + , - 算术运算符的结合方向(结合性)是 自左至右(左结合,C语言中还有右结合) 如: a-b*c - 与 * 之间先 * 后 - a-b+c - 与 + 同级,则先 - 后 + 如果一个运算符两边的数据类型不同,则按前面的法则进行转换,然后运算。 2. 算术表达式和运算符的优先级与结合性
3. 强制类型转换 可以用一个强制类型转换运算符将一个表达式的值转换成所需要的类型。 一般形式: (类型名) (表达式) 如: (double) a 将a 的值转换成double型 (int) (x+y) 将(x+y)的值转换成int 型 比较 与(int) x+y 有何不同? (float) (5%3) 注意:强制类型转换只是将表达式的值转换成所需的类型,而原来的变量类型并没有变化。 运行结果: x=3.600000 , i=3 例: 强制类型转换。 1. main( ) { float x ; int i; x=3.6 ; i=(int) x ; printf("x=%f , i=%d",x, i) ; } 因此有两种方法进行类型转换: (1) 自动转换 (按级别高低) (2) 强制转换 (用强制类型转换运算符)
如果写成 z=x*y 结果如何(是int型14464) 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(“z=%ld\n",z) ; } 运行结果: z=80000 运行结果:j=3
自增、自减的作用是使变量的值增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 注意: ⑴ 自增、自减运算符只能用于变量,不能用于常量或表达式。++(i+1)是错误的。 ⑵ 自增、自减运算符是自右至左结合的(不同于算术运算符)。 如: -i++ 表示 –(i++),而不是 (-i)++ , 而(-i)++也是不合法的。 若 i=3; printf("%d", -i++); 4. 自增运算符(++) 、自减运算符(- -) 先取出i 的值3 ,输出-i 的值-3,然后i 增值为4。
1. 赋值运算符 赋值号 “=” 就是赋值运算符。它的作用是将一个数据赋给一个变量, 也可以将一个表达式的值赋给一个变量。 如: x=1 ; c=a+b; 注意:左边必须是变量 a++=5;a+1=5;都是错误的。 2. 类型转换 当赋值号两边类型不一致,但都是数值型或字符型时,赋值时要进行类型转换。 不同类型的整型数据间的赋值归根到底就是一条:按存储单元中的存储形式直接传送。 赋值运算符和赋值表达式 不“四舍五入” A. float ---> int实型赋给整型, 舍去小数 i=3.56 ---> i=3 B. int ---> float数值不变, 以浮点数形式储存, 补足0 f=23 ---> f=23.00000 (有效数字7位)
赋值运算符和赋值表达式 例题 #include <stdio.h> 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. 以上都不对
3. 复合的赋值运算符 在赋值运算符之前加上其它运算符可以构成复合运算符。 如: 在 = 之前加上 +, 则构成 +=。 a+=3 相当于 a=a+3 含义是: a+=表达式 相当于 a=a+表达式 如果表达式是由多项构成,则相当于有括号,即 a=a+(表达式) 凡是二元(二目)运算符都可以与 “ = ” 一起组成赋值运算。 C 语言中规定可以用10 种复合赋值运算符: += -= *= /= %= <<= >>= &= ^= |= 例: *=: a*=3 ; → a=a*3 ; /=: x/=y+3 ; → x=x/(y+3); %=:a%=3 ; → a=a%3 ;
4. 赋值表达式 • 什么是 赋值表达式 ?由(单一或复合)赋值运算符将一个变量和一个表达式连接起来的式子。 • 一般形式: <变量> <赋值号> <表达式> • 赋值表达式的求解过程是: 先对运算符右侧的表达式求值,再将该值赋给运算符左边的变量。 • 赋值表达式的值:就是被赋值的变量的值。 如: 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=10 • a=(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 注意:如果在赋值表达式后面加上 “ ; ” ,则成为赋值语句。
用 “ , ” 将两个表达式连接起来所构成的表达式称为逗号表达式。 如: 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 例: (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 语言语法的赋值表达式是 ( )。 • 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
关系运算符和表达式 一、关系运算符及优先级别 比较两个量的运算符称为关系运算符。 在C语言中有以下关系运算符: < 小于, <=小于或等于 > 大于 >=大于或等于 ==等于 !=不等于 关系运算符的优先级: (1) >、>=、<、<=优先级相等,==、!=优先级相等,前者高于后者。 (2) 关系运算符的优先级低于算术运算符。 (3) 关系运算符的优先级高于赋值运算符。
关系运算符和表达式 二、关系表达式 关系表达式的一般形式为: 表达式 关系运算符 表达式 关系表达式的值是: 关系成立为“真”,不成立则为“假”,C语言中用“1”表示“真”、“0”分别表示“假”。 例如:a+b>c-d x>3/2 'a'+1<c -i-5*j==k+1 都是合法的关系表达式。 表达式也可以又是关系表达式。 例如:a>(b>c), a!=(c==d) 等也都是合法的关系表达式。
条件运算符和条件表达式 条件运算符为 ? : 它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为: 表达式1? 表达式2 :表达式3 其求值规则如右图: 例如条件语句: if(a>b) max=a; else max=b; 可用条件表达式写为 : max=(a>b)?a:b;
条件运算符和条件表达式 使用条件表达式时,还应注意以下几点: 1. 条件运算符的运算优先级 低于关系运算符和算术运算符,高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b 2. 条件运算符? :是一对运算符,不能分开单独使用。 3. 条件运算符的结合方向是自右至左。 例如: a>b?a:c>d?c:d 应理解为 a>b?a:(c>d?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。
条件运算符和条件表达式 例 main() {char ch; scanf("%c",&ch); ch=(ch>='A' && ch<='Z')? ch+32:ch; printf("%c",ch); } 等价 if (ch>='A' && ch<='Z') ch=ch+32;
逻辑运算符和表达式 一、逻辑运算符 C语言中提供了三种逻辑运算符 !非运算 &&与运算 ||或运算 运算符&&和或运算符||均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。 1、 逻辑运算符优先级表示如下: (1) ! 高于 && 高于 || (2) &&, || 低于关系运算符, !高于算术运算符(*, / )。
逻辑运算符和表达式 按照运算符的优先顺序可以得出: a>b && c>d等价于(a>b) && (c>d) !b==c||d<a等价于((!b)==c)||(d<a) a+b>c && x+y<b等价于 ((a+b)>c) && ((x+y)<b) 2、逻辑运算的值: 逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。
逻辑运算符和表达式 3、逻辑运算的规则: (1)与运算&& 参与运算的两个量都为真时(非0),结果才为真(值为1),否则为假(值为0)。 例如:5>0 && 4>2,由于5>0为真,4>2也为真,其结果也为“真”,表达式的值为1。 (2)或运算|| 参与运算的两个量只要有一个为真(非0),结果就为真(值为1)。 两个量都为假(值为0)时,结果为假(值为0)。 例如:5>0 || 5>8, 结果也就为真(值为1)。