C++程序设计课件 设计制作:徐龙琴 2
本章要点:
?C++中的 各种 运算符
?C++中的各种 表达式
C++程序设计课件 设计制作:徐龙琴 3
§ 3.1 C++的运算符
?运算符,在程序中,许多语句是由 表达式构成的。 表达式 是 由 运算符 和 运算
数组成 的式子。 运算符 指运算的符号,而 运算数 包含 常量、变量
和函数等。
?运算符的分类:
? 单目 运算(一元运算符,只需一个操作数)
? 双目 运算(二元运算符,需两个操作数)
? 三目 运算(三元运算符,需三个操作数)
① 按 运算符 连接运算对象的个数分为:
② 按 其 在表达式 中所起的 作用又可分为:
C++程序设计课件 设计制作:徐龙琴 4
? 算术运算符 + - * / %
? 关系运算符 < <= >= == !=
? 逻辑运算符 ! && ||
? 位运算符 << >> ~ | ^ &
? 自增自减运算符 ++ --
? 赋值运算符 = 及其扩展( += -= *= /= %= 等)
? 条件运算符?,
? 指针运算符 * 和 &
? 逗号运算符,
? 分量运算符 * ->
? 函数调用运算符()
? 下标运算符 []
? 求字节运算符 sizeof
? 强制类型转换运算符:( type)
C++程序设计课件 设计制作:徐龙琴 5
1,算术运算符
运算符 名字 实例
+ 加 12 + 4.9 // 得出 16.9
- 减 3.98 - 4 // 得出 -0.02
* 乘 2 * 3.4 // 得出 6.8
/ 除 9 / 2.0 // 得出 4.5
% 取余 13 % 3 // 得出 1
2,自加和自减运算符
++是自增运算符,―― 自减运算符,它门 都是单目运算符,都是
将数值变量的值加 1或减 1,该类操作符 应用于变量而不能应用于常量 。
例,int i= 5;
C++程序设计课件 设计制作:徐龙琴 6
运算符 名字 实例
+ + 自加 (前缀 ) ++i + 10 // 得出 16,i变为 6
+ + 自加 (后缀 ) i++ + 10 // 得出 15,i变为 6
- - 自减 (前缀 ) --i + 10 // 得出 14,i变为 4
- - 自减 (后缀 ) i-- + 10 // 得出 15,i变为 4
注意,① ++或--只能用于 变量
② ++i 或 - -i 是 先增值再引用,i ++ 或 i - - 是 先引用再增值
③ 自 右向左 将运算符 结合 在一起,但 调用函数时,实参的求值顺序一
般为自右向左。
a = 6;
b=6;
c1 = a++;
c2=++b;
例:
执行结果为,c1=6,a=7,b=7,c2=7
int a=1;
printf(“%d,%d,%d”,a++,a++,a++);
输出的结果为 3,2,1而不是 1,2,3。
C++程序设计课件 设计制作:徐龙琴 7
3, 关系运算符
关系运算符 用于数值之间的比较,表达式的 值为 1(表示 true),或
为 0
(表示 false),见表,运算符 名字 实例
= = 等于 5 = = 5 // 得出 1
! = 不等于 5 != 5 // 得出 0
< 小于 5 < 5.5 // 得出 1
< = 小于或等于 5 <= 5 // 得出 1
> 大于 5 > 5.5 // 得出 0
> = 大于或等于 6.3 >= 5 // 得出 1
关系运算符 都是 双目 运算符,两边的数值结果必须是 类型相同 的其结
合性是从 左到右,优先级 低于算术运算符。 字符串 不应当 用关系运算符比
较,因为被比较的不是字符串的内容本身,而是字符串的地址
C++程序设计课件 设计制作:徐龙琴 8
① 如何表示数学中的逻辑关系,0≤ a≤9?
用 0<=a<=9表示?行吗? X
因为 0<=a<=9等价于 (0<=a)<=9
若 a=5则 (0<=a)<=9的值为,1
② 如何表示数学中的逻辑系,0≤ a≤9
0≤ a≤9 应表示为为,a>=0&&a<=9
C++程序设计课件 设计制作:徐龙琴 9
4, 逻辑运算符
运算符 名字 实例
! 逻辑非 !(5 = = 5) // 得出 0
&& 逻辑与 5 < 6 && 6 < 6 // 得出 0
|| 逻辑或 5 < 6 || 6 < 5 // 得出 1
注意,①逻辑 非 的优先级最 高,逻辑 与次之,逻辑 或最低
② &&,如果 第一操作数为 0,则 不再求解第二操作数 。
例, (x=0) && (y=4), 只完成了 x的赋值,不再操作 y=4,所以,
y没有实现赋值。
③ | |,如果第一操作数为 1,则不再求解第二操作数。
例, (x=4) || (y=4) 结果如何?
例,该式 5>3 && 2 | | 8<3 - !0的值为,1
C++程序设计课件 设计制作:徐龙琴 10
例, 从键盘上输入年份 year( 4位十进制数),判断其是否闰年。
闰年的条件是,能被 4整除、但不能被 100整除;或者能被 400整除。
#include <stdio.h>
void main()
{
int year;
printf("Please input the year:");
scanf("%d",&year);
if ((year%4==0 && year%100!=0)||(year%400==0))
printf("%d is a leap year.\n",year);
else
printf("%d is not a leap year.\n",year);
}
C++程序设计课件 设计制作:徐龙琴 11
5,条件运算符
一般 形式 为,表达式 1?表达式 2:表达式3
其 运算方式 为:先计算表达式 1的值,如果其值为非 0(真),则表
达式 2的值就是整个表达式的最终结果;否则表达式
3的值就是整个表达式的值。
运行的结果为,x=y? no!
例如, ① x=10;
y=x>9? 100,200;
② x=10;
y=20;
printf(“x=y? %s !”,x==y?,yes”:,no”);
//y=100
C++程序设计课件 设计制作:徐龙琴 12
注意,①条件运算符的结合性是自 右向左 。
例如,a>b?a:c>d?c:d; //相当于 a>b?a:(c>d?c:d)
②条件运算符 优先级 高于 赋值 运算符 低于 关系和算术 运算符。
例如,a>b?a-b:b-a; //相当于 a>b?(a-b):(b-a)
6,位运算符
位运算符是对其操作数 按其二进制形式逐位进行运算,参加位运
算的操作数 必须为整数 。 C++提供 6种位运算符,
运算符 名字 功能
~ 取反 按位求反
& 逐位与 把两操作数对应的二进制位进行逻辑与
| 逐位或 把两操作数对应的二进制位进行逻辑或
^ 逐位异或 把两个操作数对应的二进制位进行异或
<< 逐位左移 将左操作数的每个二进制位左移右操作数位
>> 逐位右移 左操作数的每一个二进制位右移右操作数位
C++程序设计课件 设计制作:徐龙琴 13
7,赋值运算符
① =是赋值运算符,它的 作用是 将一个表达式的值赋给一个左值。
左值,是 指 能 出现在赋植表达式左边的表达式,左值 能 存放数据, 能
够 被修改, 不能是 常量 。可用 变量 作左值,指针 和
引用 也 可以
作左值。
右值,只能出现在赋植表达式右边。
② 赋值运算符, =”的 一般格式 为,变量 =表达式;
例如,int i=1.2*3;
int j;
j=3*(4+5); //j的值变为 27
//结果为 3,而不是 3.6
例,二进制数左移, 0110<<1其值为,1100
二进制数右移( 缺位补最左一位的数值 ) 1100>>1其值为,1110
C++程序设计课件 设计制作:徐龙琴 14
③ 赋值运算符的 种类,
运算符 实例 等价于
= n = 25
+ = n += 25 n = n + 25
- = n -= 25 n = n - 25
* = n *= 25 n = n * 25
/ = n /= 25 n = n / 25
% = n %= 25 n = n % 25
& = n &= 0xF2F2 n = n & 0xF2F2
| = n |= 0xF2F2 n = n | 0xF2F2
^ = n ^= 0xF2F2 n = n ^ 0xF2F2
<< = n <<= 4 n = n << 4
>> = n >>= 4 n = n >> 4
C++程序设计课件 设计制作:徐龙琴 15
注意,① 赋值表达式 本身的运算结果 是 右侧 表达式 的值,而结果 类型是左侧
变量的数据 类型,
②赋值运算符的 结合性是从右至左的
例如,int a=12;
a+=a-=a*=a;
表示:
a=a*a //a=12*12=144
a=a-a //a=144-144=0
a=a+a //a=0+0=0
注意,x *= y+8等价于 x=x*(y+8),
C++程序设计课件 设计制作:徐龙琴 16
8,sizeof运算符(求字节运算符)
sizeof运算符 是单目 运算符,用于 计算 运算 对象在内存中所占字节 的
多少,它有 两种形式,
sizeof ( 类型标识符 ) ;
sizeof 表达式;
例如,int a,则 sizeof( a)表示, 求变量 a在内存中所占字节数。
int a[10],则 sizeof( a)表示, 求数组 a在内存中所占字节数。
9,逗号运算符
① 逗号运算符 用于 将多个表达式连在一起,并将各表达式从左到右的顺序
依次求值,且最右端的表达式的结果,为整个逗号表达式的结果。
②一般 格式 为:表达式 1,表达式 2,……,表达式 n
(i=3,i++,++i,i+5)这个逗号表达式的 值是 10,i的值为 5
C++程序设计课件 设计制作:徐龙琴 17
?C++运算符的优先级 和 结合性,
①当 不同的运算符混合运算时,运算顺序是 根据运算符的优先级而定 的。
② 若各运算符有相同的优先级,运算顺序是从左向右,还是从右向左,是
由运算符的结合性确定的 。所谓结合性是指运算符可以和左边的表达式
结合,也可以与右边的表达式结合。 C++运算符的优先级和结合性见
表( P=课本 35页)
注意,① 优先级,一般情况为:
1)单目, 双目, 三目, 赋值
2)算术, 移位, 关系, 位运算, 逻辑, 条件, 赋植, 逗号
② 结合性,仅 单目、三目和赋值 的 结合性是从右到左 。
C++程序设计课件 设计制作:徐龙琴 18
括号
! ++,--,sizeof
*,/,%
+,-
移位( >> <<)
关系( >,>=,<,<=和 ==,!=)
位运算
&&
||
:
赋值运算
逗号运算


③ 常用运算符优先级:
即,先() → 单目! → 算数 → 移位 → 关系 → 位运算 → &&和 ︳︳ →? → 赋值 → 逗号
C++程序设计课件 设计制作:徐龙琴 19
?表达式,
① 表达式,由 运算符, 操作数 组成 的计算 式子 。最简单的表达式只有一个常
量或变量。
② 表达式的分类 (据表达式中的运算符的种类):
算术表达式,a+5.2/3.0-9%5
关系表达式, (a+b*c)>d
逻辑表达式, a>b && c>d
赋值表达式, a = b+c,a += b*c+d和 a=b=c=1
条件表达式, a>b?a:b
逗号表达式, x = a + b,y = c + d,z = x + y
混合表达式,(a>b)+(a=b+c)*(x>y?x:y)
C++程序设计课件 设计制作:徐龙琴 20
③ 表达式求值的顺序,
● 按运算符的 优先级 高低次序执行 。例如,先乘除后加减
● 如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则
按C语言规定的 结合方向( 结合性 )进行 。且操作数必需化成同类型才
能计算
例,算术运算符的结合方向是, 自左至右,,即:在执行, a -b + c”
时,
变量 b先与减号结合,执行, a -b”
C++程序设计课件 设计制作:徐龙琴 21
?数据类型转换,
C++中数据类型转换有两类,
① 隐式转换,是由 编译器自动 将不同类型的数据 转换 为相同类型
后再进行运算。隐式类型转换 按 从低到高的顺序进行,
int?unsigned?long?unsigned long?double?long double
↑ ↑
short,char float
② 显式转换,由程序员显式指出的类型转换,转换形式有两种:
类型名 ( 表达式 )
( 类型名 ) 表达式
例如,
double f=3.6;
int n=(int)f; 这样 n为 3。
C++程序设计课件 设计制作:徐龙琴 22
例,设球的半径为 r,求球的表面积和球的体积。用 scanf函
数输入数据,输出计算结果时,取小数点后 2位数字。请
编程序
分析,问题简单,可直接写出程序
#define PI 3.14159
#include <stdio.h>
void main()
{float r,s,v;
printf(“input r:”);
scanf(“%f”,&r);
s=4*PI*r*r;
v=4.0/3*PI*r*r*r;
printf(“s=%6.2f\n”,s);
printf(“v=%6.2f\n”,v);}