表达式与运算符
3-1 表达式的表达法
- 表达式三种表示法:
- 中序法(Infix):运算符在两个操作数中间,例如A+B、(A+B)*(C+D)等都是中序表示法。
- 前序法(Prefix):运算符在操作数的前面,例如+AB、*+AB+CD等都是前序表示法。
- 后序法(Postfix):运算符在操作数的后面,例如AB+、AB+CD+*等都是后序表示法。
C++中的表达式所使用的是中序法,包括了运算符的优先级与结合性的问题。
- 表达式分类:
- 一元运算式:由一元运算符所组成的表达式,在运算符左侧或右侧仅有一个操作数。
例如,-100(负数)、tmp–(递减)、sum++(递增)等。 - 二元表达式:由二元运算符所组成的表达式,在运算符两侧都有操作数。
例如,A+B(加)、A=10(等于)、x+=y(递增等于)等。 - 三元表达式:由三元运算符所组成的表达式。由于此类型的运算符仅有“:?”(条件)运算符,因此三元表达式又称为“条件表达式”。
例如,a>b ?‘Y’:‘N’。
- 一元运算式:由一元运算符所组成的表达式,在运算符左侧或右侧仅有一个操作数。
3-2 认识运算符
操作数包括了常数、变量、函数调用或其他表达式,而运算符的种类相当多,
有赋值运算符、算术运算符、比较运算符、逻辑运算符、递增递减运算符以及位运算符六种。
3-2-1 运算符优先级
3-2-2 赋值运算符
简单来说,"="符号称为赋值运算符(assignmentoperator),由至少两个操作数组成,主要作用是将等号右方的值指派给等号左方的变量。以下是赋值运算符的使用方式:
变量名称 = 赋值的值 或 表达式;
在赋值运算符(=)右侧可以是常数、变量或表达式,最终都会将其值赋给左侧的变量;而运算符左侧也只能是变量,不能是数值、函数或表达式等。
b=a+3
此外,C++的赋值运算符除了一次赋值一个数值给变量外,还能够同时把同一个数值赋值给多个变量。
a=b=c=100;
3-2-3 算术运算符
【范例:CH03_01.cpp】
#include<iostream>
#include<cstdlib>
using namespace std;
int main() {
int A= 21, B = 6;
cout << "A=21,B=6" << "A+B: " << A + B << endl;
cout << "A=21,B=6" << "A+B: " << A - B << endl;
cout << "A=21,B=6" << "A+B: " << A * B << endl;
cout << "A=21,B=6" << "A+B: " << A / B << endl;
cout << "A=21,B=6" << "A+B: " << A % B << endl;
system("pause");
return 0;
}
3-2-4 关系运算符
3-2-5 逻辑运算符
- && 运算符
当&&运算符(AND)两边的表达式都为真(1)时,其运行结果才为真(1),任何一边为假(0)时,运行结果都为假(0)。 - || 运算符
在||运算符(OR)两边的表达式中只要其中一边为真(1),运行结果就为真(1)。 - !运算符
!运算符(NOT)是一元运算符,会将比较表达式的结果做求反的运算,也就是返回与操作数相反的值。
3-2-6 位运算符
-
位逻辑运算符
- &(AND,与运算)
执行AND运算时,对应的两个位(bit)都为1时,运算结果才为1,否则为0。
- |(OR,或运算)
执行OR运算时,对应的两位(bit)只要任意一个为1,运算结果就为1,也就是说只有两位都为0时,运算结果才为0。
- ^(XOR,异或运算)
执行XOR运算时,参与运算的两位只有一个为1,运算结果就为1,同时为1或0时,结果则为0。
- ~(NOT,非运算)
NOT的作用是取1的补码(complement),在二进制中也就是0与1互换。
- &(AND,与运算)
-
位位移运算符
位位移运算符会将整数值的各个位(bit)向左或向右移动所指定的位数,C++中提供有两种位逻辑运算符,分别是左移运算符(<<)与右移运算符(>>)。- <<(左移)
左移运算符(<<)可将操作数的各个位(bit)向左移动n位,左移后超出存储范围即舍去,右边空出的位则补0。
cpp a<<n;
例如,表达式“12<<2”。数值12的二进制值为1100,向左移动2位后成为110000,也就是十进制的48。
- <<(左移)
-
>>(右移)
右移运算符(>>)与左移相反,可将操作数的各个位(bit)右移n位,右移后超出存储范围即舍去。这里请注意,这时右边空出的位,如果这个数值是正数则补0,负数则补1。cpp a>>n
例如,表达式“12>>2”。数值12的二进制值为1100,向右移动2位后成为0011,也就是十进制的3。
int main() {
int a = 13, b = 57;
//表示a,b二进制表示法
cout << "a=13, 二进制数为: 00001101" << endl;
cout << "b=57,二进制数为: 00111001" << endl;
cout << "13& 57= " << (a & b) << endl;
cout << "13| 57= " << (a | b) << endl;
cout << "13^ 57= " << (a ^ b) << endl;
cout << "~57= " << (~ b) << endl;
cout << "13>>2= " << (a>>2) << endl;
cout << "13<<2= " << (a<<2) << endl;
system("pause");
return 0;
}
3-2-7 递增与递减运算符
它们是针对变量操作数加1和减1的简化写法,属于一元运算符的一种,可增加程序代码的简洁性。
虽然都是对操作数进行加1和减1的操作,但是根据运算符在操作数前后的位置不同,递增与递减运算符还可以细分为“前置型”和“后置型”两种。
- 前置型
++或–运算符放在变量的前面是将变量的值先执行+1或-1的运算,再输出变量的值。 - 后置型
++或–运算符放在变量的后面代表先将变量的值输出,再执行+1或-1的操作。
int main() {
int a, b;
a = 5;
cout << "a= " << a;
b = ++a;
cout << "b=++a => a= " << a << " , b= " << b << endl;
cout << "___________" << endl;
a = 5;
cout << "a= " << a;
b = a++;
cout << "b=a++ => a= " << a << " , b= " << b << endl;
cout << "___________" << endl;
a = 5;
cout << "a= " << a;
b = a--;
cout << "b=a-- => a= " << a << " , b= " << b << endl;
cout << "___________" << endl;
a = 5;
cout << "a= " << a;
b =--a;
cout << "b=--a => a= " << a << " , b= " << b << endl;
cout << "___________" << endl;
system("pause");
return 0;
}
3-2-8 复合赋值运算符
认识数据类型转换
数据类型转换功能可以分为 自动类型转换 与 强制类型转换 两种。
3-3-1 自动类型转换
自动类型转换是由编译程序来判断应转换成何种数据类型,因此也称为“隐式类型转换”(implicit type conversion)。
在C++编译程序中,对于表达式类型的转换,会按照类型数值范围大者作为优先转换的对象,简单地说,就是类型存储空间大的(字节较多者),也被称为扩大转换(augmented conversion)。
double > float > usigned long> long > unsigned int > int
3-3-2 强制类型转换
除了由编译程序自行转换的自动类型转换之外,C++也允许用户强制转换数据类型,或称为“显式类型转换”(explicit type conversion)。
如果要在表达式中强制转换数据类型,语法如下:
(强制转换类型名称)表达式或变量;
3-3-3 转型运算符简介
C++中的转型运算符(castoperator)指定数据进行转型则是C++独有的强制类型转换方式。当程序用转型运算符指定进行强制转型的操作时便会抑制原先所应该进行的表达式类型转换。
int main() {
int one = 9;
double two = 7.6;
one = one + static_cast<int>(two);
cout << "one=" << one << endl;
system("pause");
return 0;
}