C++系列七:表达式

简介: C++系列七:表达式


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++中,表达式的计算顺序是未定义的。这意味着编译器可以任意决定何时计算表达式中的各个部分。虽然不同的编译器可能会有不同的计算顺序,但通常情况下,表达式的计算顺序遵循以下规则:

  • 先计算所有的括号表达式。
  • 先计算所有的前缀递增和递减运算符。
  • 先计算所有的乘法、除法和取模运算符。
  • 先计算所有的加法和减法运算符。
  • 先计算所有的移位运算符。
  • 先计算所有的关系运算符。
  • 先计算所有的相等和不等运算符。
  • 先计算所有的按位与运算符。
  • 先计算所有的按位异或运算符。
  • 先计算所有的按位或运算符。
  • 最后计算所有的逻辑运算符。

需注意的是,某些情况下对于表达式中的多个操作数,编译器可能会使用特定的寄存器来保存它们,以提高代码的执行效率。这种情况下,表达式的计算顺序可能会更加复杂,因为编译器需要考虑如何最大限度地利用可用的寄存器。

相关文章
|
6月前
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
113 4
|
2月前
|
算法 编译器 程序员
C++ 11新特性之Lambda表达式
C++ 11新特性之Lambda表达式
16 0
|
6月前
|
C++
【C/C++ 编程 入门篇】 if条件判断表达式的使用教程
https://developer.aliyun.com/article/1465430
124 0
|
4月前
|
安全 编译器 C++
C++一分钟之-泛型Lambda表达式
【7月更文挑战第16天】C++14引入泛型lambda,允许lambda接受任意类型参数,如`[](auto a, auto b) { return a + b; }`。但这也带来类型推导失败、隐式转换和模板参数推导等问题。要避免这些问题,可以明确类型约束、限制隐式转换或显式指定模板参数。示例中,`safeAdd` lambda使用`static_assert`确保只对算术类型执行,展示了一种安全使用泛型lambda的方法。
60 1
|
5月前
|
算法 编译器 C++
C++一分钟之—Lambda表达式初探
【6月更文挑战第22天】C++的Lambda表达式是匿名函数的快捷方式,增强函数式编程能力。基本语法:`[capture](params) -&gt; ret_type { body }`。例如,简单的加法lambda:`[](int a, int b) { return a + b; }`。Lambda可用于捕获外部变量(值/引用),作为函数参数,如在`std::sort`中定制比较。注意点包括正确使用捕获列表、`mutable`关键字和返回类型推导。通过实践和理解这些概念,可以写出更简洁高效的C++代码。
53 13
|
5月前
|
C++
C++语言的lambda表达式
C++从函数对象到lambda表达式以及操作参数化
|
5月前
|
C++
C++一分钟之-理解C++的运算符与表达式
【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a &gt; b) ? &quot;greater&quot; : &quot;not greater&quot;`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
36 3
|
5月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
5月前
|
C++
C++ lambda表达式
C++ lambda表达式
|
6月前
|
算法 编译器 程序员
【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]
【C++入门到精通】 Lambda表达式 C++11 [ C++入门 ]
49 1