表达式根据其运算符的优先级和分组来计算。

计算顺序请看以下示例:

// expre_pluslang__pluslang_Order_of_Evaluation.cpp

// compile with: /EHsc

#include

using namespace std;

int main()

{

int a = 2, b = 4, c = 9;

cout << a + b * c << "\n";

cout << a + (b * c) << "\n";

cout << (a + b) * c << "\n";

}

Output:

38

38

54

表达式计算顺序上图中显示的表达式的计算顺序取决于运算符的优先级和关联性:

乘法 (*) 在此表达式中具有最高优先级;因此子表达式 b * c 首先计算。

加法 (+) 具有第二高的优先级,因此,a 将与 b 和 c 的乘积相加。

左移 (<

当使用括号为子表达式分组时,它们将更改表达式的计算优先级和顺序,如下图所示。

带括号的表达式计算顺序

类似于上图的表达式的计算纯粹是为了展示副作用 - 在本例中是将信息转移到标准输出设备。

表达式中的表示法

在指定操作数时,C++ 语言指定某些兼容性。下表显示需要类型为 type 的操作数的运算符可接受的操作数的类型。

运算符可接受的操作数类型

HHHHHHHHHHHHHHHHHHH1

不明确的表达式

某些表达式的意义不明确。当在同一表达式中多次修改对象的值时,这些表达式最常见。当语言没有定义表达式的计算顺序时,这些表达式依赖于特定的顺序计算。请看下面的示例:

int i = 7;

func( i, ++i );

C++ 语言不保证计算函数调用的参数的顺序。因此,在前面的示例中,func 的参数可以接受值 7 和 8 或 8 和 8,取决于参数是从左到右还是从右到左计算。

C++ 序列点(Microsoft 专用)在连续的“序列点”之间,表达式只能修改对象的值一次。

C++ 语言定义当前未指定序列点。Microsoft C++ 对涉及 C 运算符但不涉及重载运算符的任何表达式使用与 ANSI C 相同的序列点。当重载运算符时,语义从运算符排序更改为函数调用排序。Microsoft C++ 使用以下序列点:

逻辑“与”运算符 (&&) 的左操作数。完全计算逻辑“与”运算符的左操作数,并在继续之前完成所有副作用。不保证一定会计算逻辑“与”运算符的右操作数。

逻辑“或”运算符 (||) 的左操作数。完全计算逻辑“或”运算符的左操作数,并在继续之前完成所有副作用。不保证一定会计算逻辑“或”运算符的右操作数。

逗号运算符的左操作数。完全计算逗号运算符的左操作数,并在继续之前完成所有副作用。始终计算逗号运算符的两个操作数。

函数调用运算符。计算函数调用表达式以及函数的所有参数(包括默认参数),并在进入函数之前完成所有副作用。在参数或函数调用表达式之间没有指定的计算顺序。

条件运算符的第一个操作数。完全计算条件运算符的第一个操作数,并在继续之前完成所有副作用。

完整的初始化表达式的末尾,如声明语句中的初始化的末尾。

表达式语句中的表达式。表达式语句由可选表达式后跟分号 (;) 组成。表达式为其副作用完全计算。

选择(if 或 switch)语句中的控制表达式。完全计算该表达式,并在执行依赖于选择的代码之前完成所有副作用。

while 或 do 语句的控制表达式。完全计算该表达式,并在执行 while 或 do 循环的下一次迭代中的任何语句之前完成所有副作用。

for 语句的所有三个表达式。完全计算每个表达式,并在移动到下一个表达式之前完成所有副作用。

return 语句中的表达式。完全计算该表达式,并在控制权返回到调用函数之前完成所有副作用。

C程序语言表达式运算顺序,详解C++编程中表达式的语义与计算顺序相关推荐

  1. C 语言 运算符怎么使用,详解C++编程中运算符的使用

    C++的运算符十分丰富,使得C++的运算十分灵活方便.例如把赋值号(=)也作为运算符处理,这样,a=b=c=4就是合法的表达式,这是与其他语言不同的.C++提供了以下运算符: 算术运算符 +(加)  ...

  2. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

  3. java让线程空转_详解Java编程中对线程的中断处理

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时--都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...

  4. for循环嵌套,C语言for循环嵌套详解!编程使我快乐!

    虽说是多层,事实上 for 循环嵌套的层数也不能太多.通常为两个 for 循环的嵌套,超过两个的极少使用. 与单个 for 循环相比,多个 for 循环的嵌套在逻辑上更复杂一点,但并不难懂. 直接给大 ...

  5. c语言之 malloc函数详解 在堆中动态分配内存malloc和new的区别

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  6. c语言 头文件卫士详解,C/C++中的“头文件卫士”

    在Objective C中可以用#import来防止重复包含,但在C/C++中就不同了,只能用"头文件卫士"了. 下面的程序是有错误的: // global.h 文件 // #if ...

  7. java super关键字的作用_详解Java编程中super关键字的用法

    通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...

  8. Java中throw re_详解Java编程中throw和throws子句的使用方法

    java throw:异常的抛出程序可以用throw语句抛出明确的异常.throw语句的通常形式如下: throw throwableinstance; 这里,throwableinstance一定是 ...

  9. java策略管理_详解Java编程中的策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式 ...

最新文章

  1. 汇编语言---计算表达式的值
  2. (7)UART接收verilog与Systemverilog编码
  3. 105款移动应用程序就此被清理下架!
  4. linux2019内核版本发布,新兴的桌面发行版 Septor Linux 发布 2019 版
  5. 行业大佬集体唱衰教育O2O,强管控的B2C模式将是唯一出路
  6. orientation|keyboardHidden
  7. NV12转化为BMP函数
  8. python数据分析课后习题
  9. puts()函数详解
  10. CANopen协议解读
  11. 为什么一个盘里的文件夹都不见了,里面一片空白,但那些文件所占的内存却还在的,但好像没被删除
  12. ZYNQ+NVMe 小型化全国产存储方案
  13. Altium Designer-快速画封装,图解
  14. 一个大学生屌丝心中的seo梦
  15. 互联网面试——WPF面试问题
  16. 阿里巴巴-数据平台事业部-数据产品部:寻找真爱
  17. 国内哪家云服务器好?
  18. 张五常经济学三大公理
  19. 共享文件夹服务器内存资源不足,『excel文件打开就提示可用资源不足,无法完成此任务』共享文件夹怎么设置...
  20. Python 修改文件名加前缀

热门文章

  1. yum 找不到程序,yum更换国内阿里源
  2. jmeter5实现mysql数据库值提取--单sql提取
  3. 由汉诺塔引起的对递归的思考
  4. 2016 pku campus/OpenJ_POJ - C16H(推公式+矩阵快速幂)
  5. 阮一峰的Javascript模块化编程(三):require.js的用法
  6. 1.12.05 统计单词数
  7. SpatiaLite空间索引(一)
  8. 如何创建脱机数据库应用程序思路
  9. KOA中的ejs的基本使用
  10. Nodejs cqmanager项目