浅谈C/C++中运算符的优先级、运算符的结合性以及操作数的求值顺序

简介:

一.运算符的优先级

    在C++ Primer一书中,对于运算符的优先级是这样描述的:

    Precedence specifies how the operands are grouped. It says nothing about the order in which the operands are evaluated.

    意识是说优先级规定操作数的结合方式,但并未说明操作数的计算顺序。举个例子:

    6+3*4+2

    如果直接按照从左到右的计算次序得到的结果是:38,但是在C/C++中它的值为20。

    因为乘法运算符的优先级高于加法的优先级,因此3是和4分组到一起的,并不是6与3进行分组。这就是运算符优先级的含义。

二.运算符的结合性

    Associativity specifies how to group operators at the same precedence level.

    结合性规定了具有相同优先级的运算符如何进行分组。

    举个例子:

    a=b=c=d;

    由于该表达式中有多个赋值运算符,到底是如何进行分组的,此时就要看赋值运算符的结合性了。因为赋值运算符是右结合性,因此该表达式等同于(a=(b=(c=d))),而不是(a=(b=c)=d)这样进行分组的。

    同理如m=a+b+c;

   等同于m=(a+b)+c;而不是m=a+(b+c);

三.操作数的求值顺序

   在C/C++中规定了所有运算符的优先级以及结合性,但是并不是所有的运算符都被规定了操作数的计算次序。在C/C++中只有4个运算符被规定了操作数的计算次序,它们是&&,||,逗号运算符(,),条件运算符(?:)。

   如m=f1()+f2();

   在这里是先调用f1(),还是先调用f2()?不清楚,不同的编译器有不同的调用顺序,甚至相同的编译器不同的版本会有不同的调用顺序。只要最终结果与调用次序无关,这个语句就是正确的。这里要分清楚操作数的求值顺序和运算符的结合性这两个概念,可能有时候会这样去理解,因为加法操作符的结合性是左结合性,因此先调用f1(),再调用f2(),这种理解是不正确的。结合性是确定操作符的对象,并不是操作数的求值顺序。

    同理2+3*4+5;

    它的结合性是(2+(3*4))+5,但是不代表3*4是最先计算的,它的计算次序是未知的,未定义的。

    比如3*4->2+3*4->2+3*4+5

    以及2->3*4->2+3*4->2+3*4+5和5->3*4->2+3*4->2+3*4+5这些次序都是有可能的。虽然它们的计算次序不同,但是对最终结果是没有影响的。

   

本文转载自海 子博客园博客,原文链接:http://www.cnblogs.com/dolphin0520/archive/2011/04/20/2022120.html如需转载自行联系原作者


相关文章
|
2月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
44 0
|
8月前
|
C++
C++程序中的赋值运算符
C++程序中的赋值运算符
89 2
|
4月前
|
C++
【C++基础】运算符详解
这篇文章详细解释了C++中运算符的用法,包括算术运算符、赋值运算符、比较运算符和逻辑运算符,以及它们在表达式中的作用和示例。
56 2
|
5月前
|
C++
c++学习笔记02 运算符
C++学习笔记,介绍了C++中的运算符,包括基本的加减乘除、求模、前后置递增递减、赋值运算符、比较运算符和逻辑运算符的使用及其注意事项。
49 6
|
5月前
|
存储 设计模式 算法
【C++】deque以及优先级队列
【C++】deque以及优先级队列
|
7月前
|
C++
C++之运算符
C++之运算符
|
7月前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
53 2
|
7月前
|
C++
C++一分钟之-理解C++的运算符与表达式
【6月更文挑战第18C++的运算符和表达式构成了编程的基础,涉及数学计算、逻辑判断、对象操作和内存管理。算术、关系、逻辑、位、赋值运算符各有用途,如`+`、`-`做加减,`==`、`!=`做比较。理解运算符优先级和结合律至关重要。常见错误包括优先级混淆、整数除法截断、逻辑运算符误用和位运算误解。解决策略包括明确优先级、确保浮点数除法、正确使用逻辑运算符和谨慎进行位运算。通过实例代码学习,如 `(a > b) ? "greater" : "not greater"`,能够帮助更好地理解和应用这些概念。掌握这些基础知识是编写高效、清晰C++代码的关键。
53 3
|
8月前
|
C++ 编译器