请注意,这里说的是运算数的求值顺序。而非运算符,运算符的求值顺序我们比较熟悉。比如
a * b + c;
1,先算乘方,再算乘除,最后算加减
2,有括号,先算括号里面的,同一级运算按照从左到右的顺序依次进行
这一点所有的程序设计语言都采取数学中数字的计算顺序。当然程序设计语言中还有一些不同于数学中的运算符。那运算数的求值顺序是如何的呢?
如下
// 求 a 和 b的和
sum = a + b;
1,从内存中取a的值
2,从内存中取b的值
3,进行相加运算
描述的很弱智,理所当然就是这样的。有人可能觉得先取b的值,再取a,然后相加。这样最后的结果也是一样的。的确是这样。但如果运算数是一个函数执行呢?
sum = a + fun();
假设fun函数中仅return 一个数字。这时无论是先取a的值,再去fun执行后的值也是无所谓的。最终的结果都一样。说到这里,仍然没有新鲜,纠结的地方。
但如果fun不仅返回了数字,还改变了a呢? 比如以下JavaScript代码
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
因此,只有当函数有副作用的时候,运算数的求值顺序不同会导致结果不同。很明显,各个语言实现不同。
JavaScript语言中,从左到右,a取5,fun执行后返回20,最后是 5+20。注意,虽然参与此次运算时a取5,但a值实际上已经改变了。如下
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = a + fun(); // b 的值?
alert(a); // 10
C语言中,先执行fun,fun中改变了a的值,为10,取a为10参与本次 “加”运算,fun返回20。结果是 10+20。
可以看到,无论是JavaScript还是C。a的值最后都改变了,为10。区别在于:参与相加运算时,JavaScript 取未被改变的值5, C取改变了的值10。
C语言中,运算也是从左到右的。但当有函数作为运算数时,会先执行函数。而改函数如果有副作用时,取被改变后的a值参与本次运算。无论fun和a的顺序。如下将fun放在前面,在C语言中结果仍然是30
int a = 5;
int fun(){
a = 10;
return 20;
}
int b = fun() + a; // 30
JavaScript中如果fun与a交换了顺序,则结果不是25了。
var a = 5;
function fun(){
a = 10;
return 20;
}
var b = fun() + a; // b为30
分享到:
相关推荐
在计算机科学和程序设计领域,运算数求值顺序是一个基础而重要的概念。了解这一点对于编写正确的、可预测的程序至关重要,尤其是在不同的编程语言之间,对于求值顺序的实现可能会有所不同,这直接关系到程序的运行...
该文档涉及的知识点主要集中在C语言中如何使用顺序栈实现表达式求值,特别是涉及到小数点运算。这里我们将详细探讨这个过程。 首先,我们创建了两个顺序栈:`seqstack optr` 和 `seqstack opnd`。`optr` 用于存储...
【数与式的运算与求值】是中考数学中常见的题型,主要涉及到实数运算、整式化简、分式运算等内容。以下是对这些知识点的详细解析: **实数的运算**: 实数运算包括加减乘除、幂次运算、根号、绝对值以及特殊角的...
本课程设计报告主要探讨了如何实现一个简单的算术表达式求值系统,该系统能够处理不含变量的、基于字符序列的算术表达式,并按照运算优先级顺序进行运算。以下是详细的知识点说明: 1. **输入与输出**: - 用户...
在计算机科学中,四则运算表达式的求值是计算科学中的基本问题,它涉及到解析、处理和计算包含加法、减法、乘法和除法的数学表达式。本问题中,我们关注的是如何实现一个算法来正确地计算给定的类似“1+2*(3+5)-7”...
在RPN中,运算符位于其操作数之后,使得求值过程简化。例如,算术表达式 "2 + 3 * 4" 的RPN形式为 "2 3 4 * + "。 2. **基于栈的RPN求值**:对于RPN表达式,我们可以使用两个栈:一个存储数字,另一个存储运算符。...
利用C++,实现线性表的顺序存储,并利用线性表的顺序存储结构求解一元多项式的值。顺序表是数据结构课程中的重要的基础内容,应该熟练掌握。
本篇文章将详细探讨如何使用C++类来实现顺序表的基本运算,而非使用结构体,因为类在封装、继承和多态等方面具有更强大的功能。 首先,我们需要创建一个表示顺序表的类,我们可以命名为`SequentialList`。这个类应...
### 表达式求值与栈实现(C++支持加减乘除运算) #### 标题解析 **表达式求值栈实现 C++ 支持加减乘除运算** 此标题明确指出了本文的主要内容是关于如何利用栈这种数据结构在C++中实现基本算术表达式的求值功能。...
通过将操作数压入堆栈,然后遇到运算符时弹出相应的操作数进行计算,我们可以按照正确的运算顺序处理表达式。 具体来说,当输入一个表达式,例如"2+3*4",计算器首先会将数字2压入堆栈,然后遇到"+",但由于乘法...
用栈来对一位数的四则运算表达式计算结果。 本文主要讲解如何使用栈来计算一位数的四则运算表达式的结果。栈是一种数据结构,通过使用栈,可以实现对表达式的计算。下面将详细讲解栈的使用、创建、进栈和出栈等操作...
数据结构实习报告:设计一个演示用运算优先法对算数表达式求值过程的程序。 一、知识点总结 1. 数据结构:栈(Stack)、抽象数据类型(ADT)、操作数栈(SqStack1)、操作符栈(SqStack2) 2. 算数表达式求值:...
博主于16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果。当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的...
在C++编程语言中,实现一个能够处理表达式求值、具有较强的错误检测能力,并且支持负数和括号运算的程序是一项常见的挑战。这样的程序通常涉及到解析、语法分析、计算以及异常处理等多个方面。下面将详细介绍这个...
后缀表达式,又称逆波兰表示法,是一种不使用括号的数学表达式表示方法,主要依靠运算符出现在操作数之后这一特性来确定运算顺序。在计算机科学中,后缀表达式常用于利用栈实现表达式的求值。在这个实验中,目标是...
- **GetElem(L, i)**:获取顺序表L中下标为i的元素值。 - **LocateElem(L, e)**:查找元素e在顺序表L中的位置,如果不存在则返回0。 - **ListDelete(A, i)**:删除顺序表A中下标为i的元素。 ### 三、程序流程解析 ...
数据结构课程设计算数表达式求值是指编写算法能够进行整型和实型数的表达式求值,能够根据运算的数据选择正确的运算结果的数据类型。该课程设计的目的是为了让学生掌握基本的数据结构和算法设计能力,提高学生的编程...
后缀表达式的求值非常简单,只需一个栈即可,因为每个操作数遇到后立即压栈,遇到运算符时,弹出栈顶的两个操作数进行运算,并将结果压回栈。对于"2 3 4 *",先将2和3压栈,然后遇到"*",弹出3和2相乘得到12,再将12...