第三章 运算符和表达式
例 3.4 逻辑表达式的求值
main() { int a = 2, b = 0, c = 0 ; char d =ˊAˊ; float e = 2.5 ; printf("%d", a && b); printf("%d", a || b && c) ; printf("%d", !a && b); printf("%d", a || 3 + 10 && 4); printf("%d", !(e == 2)); printf("%d", !e == 2); printf("%d", d || b); }
a || b 1
非0(真)
0(假)
0(假)
非0(真)
0
1
1
0 1
0
0
1
1
0(假)
0(假)
1
0
0
(二)逻辑表达式
用逻辑运算符将关系表达式或逻辑量连接起来的式子, 称为逻辑表达式。 (a <= 5) && (b >= c)、 !(a = = 2) C语言编译系统在给出逻辑表达式运算结果时,用1表 示“真”,用0表示“假”, 在判断一个量(运算对象)是否为“真”时,将非0 数值看成“真”,0看成“假”。 例如:若a = 1,b = 2,则a && b的值为1。因 为a、b均非0,被看成“真”,因此a && b的值 为1。
在“=”前面加上算术运算符就构成了复合算术赋值运算符 加上位运算符就构成了复合位赋值运算符。
运 算 符
名
称
等价
+=
-= * = /= %=
加法赋值
减法赋值 乘法赋值 除法赋值 求余赋值
x += exp
x - exp = x * = exp x /= exp x %= exp
等价于 x = x + (exp)
一、赋值运算符和赋值表达式
(一)赋值运算符 C语言将赋值作为一种运算,并定义了赋值运算符 “ = ”。它的作用是把一个表达式的值赋予一个变 量,如x = 3*2 + 5。 注意C语言中的等号是“==”,不可与赋值运算符 混淆。 (二)赋值表达式 用赋值运算符将一个变量和一个表达式连接起来的 式子称为赋值表达式。赋值表达式的格式如下:
等价于 x = x -(exp) 等价于 x = x * (exp) 等价于 x = x / (exp) 等价于 x = x % (exp)
例3.2 赋值运算的运用
main() { int a, b, c; a = (b = 7) + (c = 5); /* 对a、b、c 赋初值 */ printf("%d,%d,%d \n",a, b, c); /* 输出a、b、c的值 */ a *= b; b += c; c %= a; /* 对a、b、c 第二次复合赋值 */ printf(“%d,%d,%d\n”,a, b, c); /* 第二次输出a、b、c的值 */ a = b = c = c+1; /* 对a、b、c 第三次复合赋值 */ printf("%d,%d,%d\n",a, b, c); /* 第三次输出a、b、c的值 */ }
按照运算符的功能(含义),C语言的运算符可分为以下几类: ⑴ 算式运算符 + - * / % ⑵ 赋值运算符 = 及复合赋值运算符 ⑶ 关系运算符 > < == >= <= != ⑷ 逻辑运算符 ! && || ⑸ 增量运算符 ++ - ⑹ 条件运算符 ? : ⑺ 逗号运算符 , ⑻ 位操作运算符 & | ^ ~ << >> ⑼ 其他运算符 指针运算符、分量运算符等
例3.3
关系表达式的求值
main () { int a = 3, b = 2, c = 1; printf("%d,", a > b); printf("%d,", (a > b) == c); printf(“%d,", b + c < a); printf("%d,", a > b > c); printf("%d,", 0 >= b >= 5); }
第三章 运算符和表达式
第三章 运算符和表达式
C语言的运算符繁多,这也是C语言的一大特点。 运算符的3个基本属性: 功能(含义) 优先级 结合性。 用运算符和括号将运算对象(也称操作数、运算分 量)连接起来的、符合C语言语法规则的式子,称为 表达式。 表达式主要用于求值、调用函数等
第一节 运算符的种类及功能
例3.1 有符号数据传送给无符号变量
main () { unsigned a; int b = -1; a = b; printf("%u", a); }
/* 定义a为无符号整型变量 */
/* 定义b为 整型变量且赋值为-1 */ /* b的值传送到a中 */
/* 输出无符号数a */
数据存储的形式
-1的绝对值
00
00 00 00 00 00 00 01
取反 加一
11 11 11 11 11 11 11 10
11 11 11 11 11 11 11 11
符号位
11 11 11 11 11 11 11 11 a
65535
(三)复合赋值运算符
赋值运算符分为简单赋值运算符和复合赋值运算符。 简单赋值运算符 “=”, 复合赋值运算符又分为复合算术赋值运算符和复合位 赋值运算符,
例3.5
写出满足下列条件的逻辑表达式
⑴ c是大写英文字母。 ⑵ a和b不同时为0. ⑶ 判断某一年year是否闰年。闰年的条件是year能 被4整除但不能被100整除,或year能被400整除。 解答如下: ⑴ 逻辑表达式 c >=ˊAˊ && c <=ˊZˊ。 (2) 逻辑表达式!(a == 0 && b == 0) 或a!= 0 || b!= 0 或a || b。 (3)逻辑表达式(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
例如,如a值为0,b值为1,则“a | | b”为1。
⑶ ! 逻辑非。一元运算,用于对运算对象求非:若运算 对象值为0(假),则结果为1(真);否则,结果为0 (假)。
例如,如a值为0,则 ! a 为1。
表3-5
逻辑运算的“真值表”
a 非0(真)
b 非0(真)
!a 0
!b 0
a && b 1
三、关系运算符和关系表达式
(一)关系运算符 关系运算符用于对两个运算对象进行“比较运算”, 判断其比较的结果是否符合给定的条件。如果符合给 定的条件,比较结果为“真”,否则为“假”。 C语言共提供了6种关系运算符: ⑴ < 小于 ⑵ <= 小于或等于 ⑶ > 大于 ⑷ >= 大于或等于 ⑸ == 等于 ⑹ != 不等于
*/
}
注意
增量运算符的运算对象只能是变量,不能是常量或表达式。例 如,5++、(a+b)++都不合法。 增量运算符是C语言最具特色的一种运算符,它使程序的编写 变得简洁。但有时会出现一些容易搞混的问题,使用时一定要 小心。例如,设i的初值为5: ⑴ 考虑表达式 (i++) + (i ++)。有一些系统(如Turbo C)把5作为表达式所有的i的值,于是两个i的值相加,得 表达式的值为10。然后实现自加两次,i的值变为7。而另 外一些系统按自左至右顺序求解括号内的运算,求完第一 个括号的值后,实现i的自加,i值变为6,再求第二个括号 的值,结果表达式的值为5+6 = 11。 ⑵ 对于函数调用printf("%d, %d", i, i++)。有的系统自 左至右求值,输出“5,5”。而有的系统(如Turbo C)求 值顺序是自右至左,先求出i++的值5,然后i自加变为6, 再求出i的值,所以printf()输出的是“6,5”。
例3.6 增量运算符的使用
main () { int m, n ; n=3; m = ++n ; /* 执行完此语句后,m和n的值都为4 */ printf("m =%d,n = %d\n", m-,++n); /* 输出(使用)m以后再对m减1 ,输出(使用)n之前就对n加1 */
n = m-; /* 执行完此语句后,m的值为2 ,n 的值为3 printf("m=%d, m=%d\n", m++, n++); printf("m=%d, m=%d\n", m, n);
赋值运算时类型转换
⑴实型数据赋予整型变量。转换结果是舍弃小数部 分。 如i为整型变量,执行i = 1.23后,i的值为1。 ⑵整型数据赋予实型变量。数值不变,但以浮点数 形式存储到变量中。 如将12赋给float型变量x(x = 12),先将12 转换成12.000000,再存储到x中。 ⑶字符型数据赋予整型变量。由于字符只占一个字 节,而整型变量为2个字节,因此将字符数据(8位) 放到整型变量低8位中。 整型数据赋予字符型变量。仅将其低8位原封不动 地存放到字符型变量中。