在一个群里遇到一哥们问表达式运算顺序:
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。
过程还挺复杂的,不看汇编代码,真不好理解。
分享到:
相关推荐
(1) 输入:输入一个算术表达式,以#结束 (2) 输出:输出数据栈栈顶元素和最后表达式的运算结果 (3) 程序功能:完成包含加、减、乘、除运算,包含括号的基本整数表达式的运算,可实现动态的输入,实时的输出。 ...
博主于16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果。当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的...
程序从标准输入上读入一行字符串,是一个合法的后缀表达式,数字和运算符之间由空格分隔。其中的数字可以是整数,也可以是带有小数部分的浮点数。 【输出形式】 向标准输出打印结果。 输出只有一行,是转换后的...
可以计算数学表达式的小软件。包括几十种数学函数。直接输入无需考虑运算顺序。
表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 11+)和前缀式(如...
本资源是数据结构中利用顺序栈计算中缀表达式的一个C++代码,仅供参考,不足之处请大神们指正.
另一个称作OPND,用以寄存操作数或运算结果。此处采用的顺序栈结构如下: #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef strict{ SElemType *base; SElemType *top; int stacksize;}SqStack; ...
当顺序点用,结合顺序是从左至右,用来顺序求值,完毕之后整个表达式的值是最后一个表达式的值。 示例: #include int main() { int a, s, d; s = 2; d = 3; a = (s + 2, d + 4); printf(%d\n, a); return 0...
输入为一个表达式,表达式由两个非负整数x,y和一个运算符op构成,x,y和op之间以空格分隔,但顺序不确定。 x和y均不大于10000000,op可以是+,-,*,/,%中的任意一种,分表表示加法,减法,乘法,除法和求余。 除...
1、正则表达式运算顺序 ( ) 圆括号因为是内存处理所以最高* ? + { } 重复匹配内容其次^ $ \b 边界处理第三| 条件处理第四最后按照运算顺序计算匹配2、正则表达式模式修正符i 正则内容在匹配时候不区分大小写...
它即是方便实用的数字计算器,又是一个输入表达式就会运算的超级新颖的多功能公式化运算器。它包括四则运算、逻辑处理、数值处理、三角函数等模块,可综合性的计算各种多层嵌套、复杂的函数表达式。你只要象在纸上列...
软件介绍 1、正则表达式运算顺序 ( ) 圆括号因为是内存处理所以最高 * ? { } 重复匹配内容其次 ^ $ \b 边界处理第三 | 条件处理第四 最后按照运算顺序计算匹配 2、正则表达式模式修正符 i 正则内容在...
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。 相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序: 运算符 描述 ...
使用两个栈,stack0用于存储操作数,stack1用于存储操作符 从左往右扫描,遇到操作数入栈stack0 遇到操作符时,如果优先级低于或等于栈顶操作符优先级,则从stack0弹出两个元素进行计算,并压入stack0,继续与栈顶...
1、实现一个栈数据结构。 2、利用栈实现中缀表达式与前缀表达式的转换。 三、相关内容介绍 标准的表达式如"A+B",在数学上学名叫中缀表达式(Infix Notation),原因是运算符号在两个运算对象的中间。相对应的还有...
问题描述:以字符序列的形式从终端输入语法正确的,不含变量的整数表达式,按照算术运算优先级顺序,实现基本算术表达式的运算过程。 提示: 优先级从低到高:+ - * / () 数据结构:利用栈来实现对算术四则运算...
正则表达式运算,表结构,正则表达式运算符的优先级顺序
算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符 序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个...
首先通过键盘输入表达式并将字符串入栈,然后按从左到右的循环判断表达式的格式正确与否,当表达式的+,-,×,/,( )等运算符号间有两个小数点时,表达式为错误,给出错误提示并转到起始环节,然后根据给定运算顺序来...
表示输出指定变量的值,则可以设计出比较复杂的表达式(即一个可顺序执行语句序列)。例如,如果有如下语句段: abc=10 def=8 c=abc+def abc=abc+5-c*2 ? c ? abc end 则输出为: c=18 abc=-21 注意:为了简化...