1.3 运算符与表达式
一、运算符
1.运算符与表达式
•算术运算符:+、-、*、 /、 %、++、–
•赋值运算符:= 、+=、-= 、*= 、/=、%=
•关系运算符:< 、<= 、>=、== 、!=
•逻辑运算符:! 、 &&、 ||
•条件运算符:? :
•位运算符:<<、>>、~、| 、^、&
•sizeof运算符(求字节运算符):sizeof
•逗号运算符:,
•其它运算符:
指针运算符(、&)、分量运算符( 、->)、函数调用运算符(())、强制类型转换运算符((type))
2.运算符的优先级与结合性
-
运算符优先级决定了在表达式中各个运算符执行的先后顺序
-
括号会改变优先级
-
运算符的结合方式有两种:左结合和右结合
-
左结合表示运算对象先与其左边的运算符结合
-
右结合表示运算对象优先与其右边的运算符结合
-
二、表达式
1.表达式
表达式是用于计算的式子,它由运算符、运算数和括号组成
•算术表达式:由算术运算符和位操作运算符组成的表达式
•逻辑表达式:由逻辑运算符组成的表达式。
–其表达式值的类型为逻辑型
•关系表达式:由关系运算符组成的表达式。
–其表达式值的类型为逻辑型
•赋值表达式:由赋值运算符组成的表达式
•条件表达式:由三目运算符组成的表达式
•逗号表达式:用逗号将若干个表达式连起来组成的表达式
2.类型转换
•(1) 隐式类型转换
–隐式类型转换是由编译器自动完成的类型转换。
当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算。
•(2)显式类型转换
–显式类型转换是由程序员显式指出的类型转换
–转换形式有两种
类型名(表达式)
**(类型名)**表达式
•(3)转换规则
–当参与运算的操作数必须是bool型时,如果操作数是其它类型,编译系统会自动将非0数据转换为true,0转换为false。
–位运算的操作数必须是整数。
–赋值运算要求左值与右值的类型相同,若不同,系统自动转换为左值的类型。
三、类型转换
数据类型转换:
有三种转换方式:自动转换、赋值转换和强制转换。
**1. **自动转换
在进行双目运算时,系统将两个不同类型的数据自动转换成同一类型。自动转换的规则如图所示。
例如:
int x=2;
float y=1.6;
double z=1.6;
z=x*y+z;
1)y的值自动转换double型,x也转换成与相同的类型
2)计算2.0*1.6 结果为 3.2
3计算3.2+1.6
4)给z赋值
假设已指定i为整型变量,f为float变量,d为double型变量,e为long型,有下面表达式:
10+′a′+if-d/e
运算次序为:
①进行10+′a′的运算,先将′a′转换成整数97,运算结果为107。
②进行if的运算。先将i与f都转换成double型,运算结果为double型。
③整数107与if的积相加。先将整数107转换成双精度数(小数点后加若干个0,即107.000…00),结果为double型。
④将变量e转换成double型,d/e结果为double型。
⑤将10+′a′+i*f的结果与d/e的商相减,结果为double型。
**2 .**赋值转换
在赋值时将赋值符右边值的类型转换成与其左边变量类型一致的类型。
(1) 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
(2) 将实型数据赋给整型变量时,舍弃实数的小数部分。如x为整型变量,执行“x=4.25”时,取值为x=4。
(3) unsigned int型数据赋给int型数据变量时,不存在符号扩展,只需将高位补0即可。
(4) 精度高的数据类型向精度低的数据类型转换时,数据的精度有可能降低。
(5) 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。
(6) 将一个int、short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。
例如
short int i=289;
char c;
c=i;//将一个int型数据赋给一个char型变量
3. 强制转换
在表达式中不同类型的数据会自动地转换类型,以进行运算。
- 有时程序编制者还可以利用强制类型转换运算符将一个表达式转换成所需类型。
例如:
(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
(float)(5%3) (将5%3的值转换成float型)
-
强制类型转换的一般形式为:(类型名)(表达式)
-
如果要进行强制类型转换的对象是一个变量,该变量可以不用括号括起来。
-
如果要进行强制类型转换的对象是一个包含多项的表达式,则表达式应该用括号括起来。
如果写成
(int)x+y
则只将x转换成整型,然后与y相加。
- C++还增加了以下形式: 类型名(表达式)
如
int(x) 或 int(x+y)
类型名不加括号,而变量或表达式用括号括起来。这种形式类似于函数调用。但许多人仍习惯于用第一种形式,把类型
名包在括号内,这样比较清楚。
需要说明的是在强制类型转换时,得到一个所需类型的中间变量,但原来变量的类型未发生变化。
例如:
(int)x
如果x原指定为float型,值为3.6,
进行强制类型运算后得到一个int型的中间变量,它的值等于3,而x原来的类型和值都不变。
#include <iostream>
using namespace std;
int main( )
{
float x;
int i;
x=3.6;
i=(int)x;
cout<<″x=″<<x<<″,i=″<< i<<endl;
return 0;
}
运行结果如下:
x=3.6,i=3
x的型仍为float型,值仍等于3.6。