1. 表达式类型
在C++中,表达式可以分为多种类型,每种类型都有不同的使用方式和语法规则。
(1)算术表达式
算术表达式是最基本的表达式类型之一,用于执行加、减、乘、除和取模等算术运算。
e.g.
int a = 5, b = 3; float c = 2.5; int d = a + b; // 结果为8 int e = a - b; // 结果为2 int f = a * b; // 结果为15 int g = a / b; // 结果为1 int h = a % b; // 结果为2 float i = a + c; // 结果为7.5
(2)关系表达式
关系表达式用于比较两个值的大小、相等性和不等性。
e.g.
int a = 5, b = 3; bool c = a < b; // 结果为false bool d = a > b; // 结果为true bool e = a == b; // 结果为false bool f = a != b; // 结果为true
(3)逻辑表达式
逻辑表达式用于执行布尔逻辑运算。
e.g.
int a = 5, b = 3; bool c = (a < b) && (a > 0); // 结果为false bool d = (a > b) || (b < 0); // 结果为true bool e = !(a == b); // 结果为true
(4)位表达式
位表达式主要用于在二进制位级别上执行操作。
e.g.
int a = 5, b = 3; int c = a & b; // 结果为1 int d = a | b; // 结果为7 int e = ~a; // 结果为-6 int f = a << 2; // 结果为20 int g = b >> 1; // 结果为1
(5)条件表达式
条件表达式也称为三目运算符,用于根据条件选择两个不同的值。它的语法如下:
condition ? true_expression : false_expression
如果条件为真,则计算true_expression的值;否则计算false_expression的值。
e.g.
int a = 5, b = 3; int c = (a > b) ? a : b; // 如果a大于b,则c等于a;否则c等于b
(6)赋值表达式
赋值表达式用于将一个值赋给一个变量。它的基本形式如下:
variable = expression;
C++还支持多种复合赋值运算符,例如+=
、-=
、*=
和/=
等,这些运算符可以使代码更加简洁和易读。
int a = 5, b = 3; a = b; // 将b的值赋给a a += 2; // 将2加到a中 b *= 3; // 将3乘到b中
2. 表达式优先级
在C++中,不同运算符具有不同的优先级。这意味着某些运算符比其他运算符更先执行。例如,在算术表达式中,乘法和除法运算符比加法和减法运算符具有更高的优先级。
以下是C++中运算符的优先级列表,从最高到最低优先级:
()
:括号[]
:数组下标.
和->
:成员选择++
和--
:前缀递增和递减+
和-
:正负号!
和~
:逻辑非和按位取反*
、/
和%
:乘法、除法和取模+
和-
:加法和减法<<
和>>
:左移和右移<
、<=
、>
和>=
:关系运算符==
和!=
:相等和不等运算符&
:按位与^
:按位异或|
:按位或&&
:逻辑与||
:逻辑或?:
:条件运算符=
、+=
、-=
、*=
、/=
和%=
:赋值运算符,
:逗号
在表达式中,可以使用括号来改变运算符的优先级。例如,以下表达式会先计算乘法和除法运算符,然后再计算加法和减法运算符:
int a = 5, b = 3, c = 2; int d = (a + b) * c / a; // 计算步骤为:(5 + 3) * 2 / 5 = 2
3. 表达式计算顺序
在C++中,表达式的计算顺序是未定义的。这意味着编译器可以任意决定何时计算表达式中的各个部分。虽然不同的编译器可能会有不同的计算顺序,但通常情况下,表达式的计算顺序遵循以下规则:
- 先计算所有的括号表达式。
- 先计算所有的前缀递增和递减运算符。
- 先计算所有的乘法、除法和取模运算符。
- 先计算所有的加法和减法运算符。
- 先计算所有的移位运算符。
- 先计算所有的关系运算符。
- 先计算所有的相等和不等运算符。
- 先计算所有的按位与运算符。
- 先计算所有的按位异或运算符。
- 先计算所有的按位或运算符。
- 最后计算所有的逻辑运算符。
需注意的是,某些情况下对于表达式中的多个操作数,编译器可能会使用特定的寄存器来保存它们,以提高代码的执行效率。这种情况下,表达式的计算顺序可能会更加复杂,因为编译器需要考虑如何最大限度地利用可用的寄存器。