早教吧 育儿知识 作业答案 考试题库 百科 知识分享

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