早教吧作业答案频道 -->其他-->
s=(++i)+(++i)+(++i)为什么等于22说下运算的过程~~
题目详情
s=(++i)+(++i)+(++i)为什么等于22
说下运算的过程~~
说下运算的过程~~
▼优质解答
答案和解析
不同的编译器对于这种有歧义的语句有不同的解释,并且 CPU 内部的优化也有可能影响
一开始的 i 是多少?我在 GCC 4.3 下用 i = 5 模拟了你的过程,下面的过程是看汇编的结果
0.一开始 i = 5
1.第一个括号 ++i,i = 6
2.第二个括号 ++i,i = 7
3.计算第一个括号和第二个括号的和,@a = 7 + 7 = 14
3.第三个括号 ++i,i = 8
4.s = @a + 8 = 22
下面是我的 C 程序
#include
int main() {
int i = 5;
int s = (++i) + (++i) + (++i);
printf("%d\n",s);
return 0;
}
生成的汇编码:
\x05.file\x05"xxx.cc"
\x05.def\x05___main;\x05.scl\x052;\x05.type\x0532;\x05.endef
\x05.section .rdata,"dr"
LC0:
\x05.ascii "%d\12\0"
\x05.text
\x05.align 2
.globl _main
\x05.def\x05_main;\x05.scl\x052;\x05.type\x0532;\x05.endef
_main:
\x05pushl\x05%ebp
\x05movl\x05%esp,%ebp
\x05subl\x05$24,%esp
\x05andl\x05$-16,%esp
\x05movl\x05$0,%eax
\x05addl\x05$15,%eax
\x05addl\x05$15,%eax
\x05shrl\x05$4,%eax
\x05sall\x05$4,%eax
\x05movl\x05%eax,-12(%ebp)
\x05movl\x05-12(%ebp),%eax
\x05call\x05__alloca
\x05call\x05___main
\x05movl\x05$5,-4(%ebp)
\x05leal\x05-4(%ebp),%eax
\x05incl\x05(%eax)
\x05leal\x05-4(%ebp),%eax
\x05incl\x05(%eax)
\x05movl\x05-4(%ebp),%eax
\x05movl\x05-4(%ebp),%edx
\x05addl\x05%eax,%edx
\x05leal\x05-4(%ebp),%eax
\x05incl\x05(%eax)
\x05movl\x05%edx,%eax
\x05addl\x05-4(%ebp),%eax
\x05movl\x05%eax,-8(%ebp)
\x05movl\x05-8(%ebp),%eax
\x05movl\x05%eax,4(%esp)
\x05movl\x05$LC0,(%esp)
\x05call\x05_printf
\x05movl\x05$0,%eax
\x05leave
\x05ret
\x05.def\x05_printf;\x05.scl\x052;\x05.type\x0532;\x05.endef
一开始的 i 是多少?我在 GCC 4.3 下用 i = 5 模拟了你的过程,下面的过程是看汇编的结果
0.一开始 i = 5
1.第一个括号 ++i,i = 6
2.第二个括号 ++i,i = 7
3.计算第一个括号和第二个括号的和,@a = 7 + 7 = 14
3.第三个括号 ++i,i = 8
4.s = @a + 8 = 22
下面是我的 C 程序
#include
int main() {
int i = 5;
int s = (++i) + (++i) + (++i);
printf("%d\n",s);
return 0;
}
生成的汇编码:
\x05.file\x05"xxx.cc"
\x05.def\x05___main;\x05.scl\x052;\x05.type\x0532;\x05.endef
\x05.section .rdata,"dr"
LC0:
\x05.ascii "%d\12\0"
\x05.text
\x05.align 2
.globl _main
\x05.def\x05_main;\x05.scl\x052;\x05.type\x0532;\x05.endef
_main:
\x05pushl\x05%ebp
\x05movl\x05%esp,%ebp
\x05subl\x05$24,%esp
\x05andl\x05$-16,%esp
\x05movl\x05$0,%eax
\x05addl\x05$15,%eax
\x05addl\x05$15,%eax
\x05shrl\x05$4,%eax
\x05sall\x05$4,%eax
\x05movl\x05%eax,-12(%ebp)
\x05movl\x05-12(%ebp),%eax
\x05call\x05__alloca
\x05call\x05___main
\x05movl\x05$5,-4(%ebp)
\x05leal\x05-4(%ebp),%eax
\x05incl\x05(%eax)
\x05leal\x05-4(%ebp),%eax
\x05incl\x05(%eax)
\x05movl\x05-4(%ebp),%eax
\x05movl\x05-4(%ebp),%edx
\x05addl\x05%eax,%edx
\x05leal\x05-4(%ebp),%eax
\x05incl\x05(%eax)
\x05movl\x05%edx,%eax
\x05addl\x05-4(%ebp),%eax
\x05movl\x05%eax,-8(%ebp)
\x05movl\x05-8(%ebp),%eax
\x05movl\x05%eax,4(%esp)
\x05movl\x05$LC0,(%esp)
\x05call\x05_printf
\x05movl\x05$0,%eax
\x05leave
\x05ret
\x05.def\x05_printf;\x05.scl\x052;\x05.type\x0532;\x05.endef
看了 s=(++i)+(++i)+...的网友还看了以下:
matlab求积分,上下限为字母syms i I af2=i./2*log(2*I-i.*(1-c 2020-05-16 …
如图所示,在通电直导线下方,有一电子沿平行导线方向以速度v向左开始运动,则()A.将沿轨迹I运动, 2020-05-23 …
s=(++i)+(++i)+(++i)为什么等于22说下运算的过程~~ 2020-07-17 …
在VC中,为什么i=3输出y=++i值为4;而i=3,y=(++i)+(++i)值为10?在y=( 2020-07-26 …
为什么对于圆环来说I=1/2mr^2而对于圆盘来说I=mr^2.还有长方形的系数是1/12.为什么 2020-07-27 …
如图所示,在区域I和区域Ⅱ内分别存在与纸面垂直的匀强磁场,一带电粒子沿着弧线apb由区域I运动到区 2020-07-30 …
(1)关于单摆i运动有下列说法,正确i是(填入正确选项前i字母)①单摆i回复力是摆线i拉力与重力i 2020-07-31 …
利用运算律进行有理数的混合运算不但可以简化运算过程,降低计算的难度,而且还可以提高运算速度和准确率 2020-07-31 …
一道编程题:4位同学中的一人做了好事,校长问到,A说“不是我”,B说是C,C说是D,D说C胡说,下面 2020-11-30 …
如图所示,在区域I和区域II内分别存在与纸面垂直的匀强磁场,一带电粒子沿着弧线apb由区域I运动到区 2021-01-17 …