早教吧作业答案频道 -->其他-->
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)+...的网友还看了以下:
设A为n阶矩阵,证明:R(A+I)+R(A-I)>=n已知R(A)=R(kA),k≠0;R(A+B 2020-05-14 …
Iwas的过去式可以用I'm吗.Iwas加上‘是不是还是I'm.没听说过I’as什么的. 2020-05-20 …
i的i次方等于多少,写成x+yi的形式如题:i^i=?写成x+yi的形式,其中要求x和y都是实数. 2020-06-12 …
一直z=(2+i)(1+1/i){i为虚数单位}则复数Z在复平面上所对应的点位于几象限我算的是3+ 2020-07-03 …
P=A(1+i)^-1+A(1+i)^-2+A(i+i)^-3+……A(1+i)^-n(1)将两边 2020-07-25 …
已知复数ω满足ω-4=(3-2ω)i(i为虚数单位),z=5/ω+|z-2|,若z的平方根为a=b 2020-08-02 …
电力系统的S=根号3×U×I为什么乘根号3我知道这个是3相的功率但为什么乘根号3而不是3另外为什么 2020-08-03 …
一道挺难的数学题i*i=-1则x*x=-1可变为x=+i或-ii还具有以下性质:i=ii*i=-1i 2020-11-01 …
strTemp.Delete(strLength-i,i);strTemp是一个CString类的变 2020-11-16 …
英语的几个问题1.pencil的i是不发音的,能否解释一下I在什么情况下不发音,再举三个以上的例子. 2020-12-13 …