在一个群里遇到一哥们问表达式运算顺序:
int main(int argc, char* argv[])
{
int i = 2;
int j ;
j = ( i++ ) *( --i )/ (i << 1);
return 0;
}
结果为:
i=2
j=0
查看汇编代码:
9: int i = 2;
00401028 mov dword ptr [ebp-4],2
10: int j ;
11: j = ( i++ ) *( --i )/ (i << 1);
0040102F mov eax,dword ptr [ebp-4]
00401032 sub eax,1
00401035 mov dword ptr [ebp-4],eax
00401038 mov eax,dword ptr [ebp-4]
0040103B imul eax,dword ptr [ebp-4]
0040103F mov ecx,dword ptr [ebp-4]
00401042 shl ecx,1
00401044 cdq
00401045 idiv eax,ecx
00401047 mov dword ptr [ebp-8],eax
0040104A mov edx,dword ptr [ebp-4]
0040104D add edx,1
00401050 mov dword ptr [ebp-4],edx
12: return 0;
其中:
变量 i 对应 dword ptr [ebp-4]
变量 j 对应 dword ptr [ebp-8]
运算过程为:
--i
0040102F mov eax,dword ptr [ebp-4]
00401032 sub eax,1
00401035 mov dword ptr [ebp-4],eax
*
00401038 mov eax,dword ptr [ebp-4]
0040103B imul eax,dword ptr [ebp-4]
<<
0040103F mov ecx,dword ptr [ebp-4]
00401042 shl ecx,1
00401044 cdq
/
00401045 idiv eax,ecx
=
00401047 mov dword ptr [ebp-8],eax
i++
0040104A mov edx,dword ptr [ebp-4]
0040104D add edx,1
00401050 mov dword ptr [ebp-4],edx
首先 --i,自减,i=1;
然后 *,相乘,1*1=1;
然后 << ,左移,1<<1=2;
然后 /,相除,1/2=0;
然后 =,赋值,j=0;
最后 i++,自加,i=2。
过程还挺复杂的,不看汇编代码,真不好理解。
分享到:
相关推荐
代码示例中,定义了一个双精度浮点数栈结构(Dstack),包含数据数组和栈顶索引。Dpush函数用于入栈,Dpop函数用于出栈,它们是实现算法的基础。 总结这两种方法,我们可以看到它们都有效地解决了表达式运算的问题...
本课程设计报告主要探讨了如何实现一个简单的算术表达式求值系统,该系统能够处理不含变量的、基于字符序列的算术表达式,并按照运算优先级顺序进行运算。以下是详细的知识点说明: 1. **输入与输出**: - 用户...
在本文中,我们将深入探讨算术表达式运算算法,了解如何在程序中处理像"65+5*(78+32)-80/4+17"这样的表达式,并获取其准确的结果。 首先,我们需要理解的是算术运算符的优先级和结合性。在上述表达式中,乘法(*)...
"11 计算浮点数相除的余数.py"讲解的是除法的另一个方面——取模运算,但针对的是浮点数,这在实际编程中不常见,因为浮点数除法通常不会得到整数余数。 "18 等差数列末项计算.py"涉及到等差数列的数学知识,如求解...
2. 从左到右遍历中缀表达式的每一个字符: - 如果是数字,直接将其添加到后缀表达式中。 - 如果是操作符,判断其优先级与栈顶操作符的优先级: - 如果栈为空,或者当前操作符优先级高于或等于栈顶操作符,将当前...
"calculate.rar_java表达式运算" 提供的资源可能是一个简单的计算器程序,它支持加法、减法、乘法和除法,以及更复杂的表达式计算。下面我们将深入探讨Java中的表达式运算及其相关知识点。 1. **基本运算符**: - ...
在上述问题中,程序从上至下逐行读取输入,执行相应的算术运算,并按顺序输出结果。 3. 输入输出操作:在C++等编程语言中,输入输出是与外界交互的基本方式。程序需要从标准输入(例如键盘、文件)读取数据,并将...
本题主要考察的是栈这一数据结构在解决实际问题中的运用,特别是如何利用顺序栈来检查一个给定的表达式中的括号是否匹配正确。 首先,我们需要了解栈的基本概念。栈是一种后进先出(LIFO)的数据结构,即最后进入的...
四则运算表达式计算器是一种能够处理加法、减法、乘法和除法的计算...通过以上步骤,我们可以创建一个能够处理任意长度四则运算表达式的计算器,无论是用于学习编程概念,还是作为实际应用中的计算工具,都能满足需求。
本文将深入解析一个程序,该程序能够处理逆波兰表示法(也称为后缀表示法)的四则运算表达式,包括构建表达式树、输出表达式树的不同遍历方式以及最终删除表达式树。 #### 主要功能 1. **逆波兰表示法输入的算术...
例如,栈可以用来处理中缀表达式到后缀表达式的转换,通过分析运算符的优先级和处理括号来确定运算顺序。 算法设计通常包括以下几个步骤: 1. 从键盘读入中缀表达式。 2. 将中缀表达式转换为后缀表达式,这个过程...
后缀表达式可以直接构建表达式二叉树,因为每个操作数对应一个叶子节点,每个运算符对应一个内部节点,且运算符的左右子树分别对应其后缀表达式中的左操作数和右操作数。例如,后缀表达式2 3 4 * +对应如下二叉树: ...
这种方式的解析非常直观,因为运算顺序由操作数的位置决定:运算符前面的操作数先进行计算。后缀表达式在计算时通常使用栈(Stack)数据结构,使得计算过程更为简单。 中缀表达式转后缀表达式的过程主要分为以下几...
本问题中,我们关注的是如何实现一个算法来正确地计算给定的类似“1+2*(3+5)-7”这样的字符串表达式。 首先,我们需要理解表达式的结构。四则运算遵循特定的运算顺序规则,即先乘除后加减,以及先括号内的运算。...
《数据结构》课程设计报告书中的主题是表达式求值问题,主要涵盖了两个核心知识点:中缀表达式转后缀表达式以及后缀表达式的求值。以下是这两个知识点的详细说明: 1. 中缀表达式转后缀表达式: 在计算机科学中,...
这款软件的核心特点在于其高度智能化的解析机制,用户可以直接输入完整的数学表达式,无需担心运算顺序的问题。这意味着,即使是包含括号、指数、根号等复杂结构的表达式,也能轻松处理。这种设计极大地简化了用户的...
正则表达式是一种强大的文本处理工具,用于在字符串中匹配特定模式。...在编写时,记得考虑优先级顺序,合理使用括号来明确分组和控制运算顺序,避免产生歧义。通过实践和测试,可以逐步提升正则表达式的编写技巧。
我们可以将运算符压入栈中,每当遇到一个操作数就与栈顶的运算符进行运算,直到遇到更高优先级的运算符或左括号。右括号出现时,会触发一系列弹栈操作,直到找到匹配的左括号。例如,解析表达式"2.5 * (3.2 - 1.8) /...
在这个项目中,我们将聚焦于一个特定的应用领域:表达式求值问题。这个主题通常涉及如何解析、构建和计算数学或逻辑表达式。 表达式求值问题的核心在于理解和实现两种主要的数据结构:操作符栈和表达式树。操作符栈...
程序执行的终止条件是运算符栈为空,这意味着表达式的起始和结束符号已经相遇,运算数栈中的最后一个元素就是表达式的结果。 在数据结构的选择上,我们使用了两个自定义类型的栈,一个`stack1`类型用于运算符,另一...