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

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

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

相关文章
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
228 4
|
2月前
|
程序员 编译器 C++
【实战指南】C++ lambda表达式使用总结
Lambda表达式是C++11引入的特性,简洁灵活,可作为匿名函数使用,支持捕获变量,提升代码可读性与开发效率。本文详解其基本用法与捕获机制。
126 33
|
5月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
164 12
|
10月前
|
算法 编译器 C++
【C++11】lambda表达式
C++11 引入了 Lambda 表达式,这是一种定义匿名函数的方式,极大提升了代码的简洁性和可维护性。本文详细介绍了 Lambda 表达式的语法、捕获机制及应用场景,包括在标准算法、排序和事件回调中的使用,以及高级特性如捕获 `this` 指针和可变 Lambda 表达式。通过这些内容,读者可以全面掌握 Lambda 表达式,提升 C++ 编程技能。
469 3
|
C++
【C/C++ 编程 入门篇】 if条件判断表达式的使用教程
https://developer.aliyun.com/article/1465430
336 0
|
C++ 算法
c++中 lambda 表达式 解析
c++中 lambda 表达式 解析
141 0
c++中 lambda 表达式 解析
|
12月前
|
算法 编译器 程序员
C++ 11新特性之Lambda表达式
C++ 11新特性之Lambda表达式
77 0
|
安全 编译器 C++
C++一分钟之-泛型Lambda表达式
【7月更文挑战第16天】C++14引入泛型lambda,允许lambda接受任意类型参数,如`[](auto a, auto b) { return a + b; }`。但这也带来类型推导失败、隐式转换和模板参数推导等问题。要避免这些问题,可以明确类型约束、限制隐式转换或显式指定模板参数。示例中,`safeAdd` lambda使用`static_assert`确保只对算术类型执行,展示了一种安全使用泛型lambda的方法。
176 1
|
算法 编译器 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++代码。
175 13
C++语言的lambda表达式
C++从函数对象到lambda表达式以及操作参数化