int i=3; printf("%d,%d,%d",i,i++,i++);结果是3,3,3,而int i=3; printf("%d,%d,%d",i+8,i
答案:4 悬赏:20 手机版
解决时间 2021-04-06 11:51
- 提问者网友:贪了杯
- 2021-04-06 01:40
int i=3; printf("%d,%d,%d",i,i++,i++);结果是3,3,3,而int i=3; printf("%d,%d,%d",i+8,i+=5,i--);
最佳答案
- 五星知识达人网友:拾荒鲤
- 2021-04-06 02:18
像这种计算循序的问题答案不是确定的,不同的编译器规定的计算循序是不一样的。你这个结果估计是在vc6.0上计算出来的,我用的是VS2012,得到的结果就和你的不一样。我得到的结果是5,4,3和17,9,5.有图有证据,图如下:
这样的题目很多,我教你一种分析的方法,以后碰到这样的题目就不怕了。
按F10进入调试状态;
在写代码的区域右键,选择转到反汇编;
看汇编是怎么写的一目了然。下面我把vs2012上反汇编出来的代码贴出来给你讲解一下。
#include
int main()
{
push ebp
mov ebp,esp
sub esp,0D4h
push ebx
push esi
push edi
lea edi,[ebp-0D4h]
mov ecx,35h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
int i = 3;
mov dword ptr [i],3 //mov是移动指令,把3移到i中
printf("%d,%d,%d", i, i++, i++);
mov eax,dword ptr [i] //把i(也就是3)移到eax寄存器中
mov dword ptr [ebp-0D0h],eax //把eax(即3)移到ebp-0D0h这个相对地址中
mov ecx,dword ptr [i] //把i(也就是3)移到ecx寄存器中
add ecx,1 //add是加指令,把ecx中的数值加1,即为4
mov dword ptr [i],ecx //把ecx(其值为4)移到i中
mov edx,dword ptr [i] //把i(也就是4)移到edx寄存器中
mov dword ptr [ebp-0D4h],edx //把edx(即4)移到ebp-0D4h这个相对地址中
mov eax,dword ptr [i] //把i(也就是4)移到eax寄存器中
add eax,1 //把eax中的数值加1,即eax中的值为5
mov dword ptr [i],eax //把eax(即5)移到i中
mov esi,esp
mov ecx,dword ptr [ebp-0D0h] //移动ebp-0D0h地址中的值,即3到ecx
push ecx //3压栈
mov edx,dword ptr [ebp-0D4h] //移动ebp-0D4h地址中的值,即4到edx
push edx //4压栈
mov eax,dword ptr [i] //5移到eax中
push eax //5压栈
push 10C5858h
call dword ptr ds:[10C92BCh]
add esp,10h
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
printf("
");
mov esi,esp
push 10C5FD8h
call dword ptr ds:[10C92BCh]
add esp,4
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
printf("%d,%d,%d", i + 8, i += 5, i--);
mov eax,dword ptr [i]
mov dword ptr [ebp-0D0h],eax
mov ecx,dword ptr [i]
printf("%d,%d,%d", i + 8, i += 5, i--);
sub ecx,1
mov dword ptr [i],ecx
mov edx,dword ptr [i]
add edx,5
mov dword ptr [i],edx
mov esi,esp
mov eax,dword ptr [ebp-0D0h]
push eax
mov ecx,dword ptr [i]
push ecx
mov edx,dword ptr [i]
add edx,8
push edx
push 10C5858h
call dword ptr ds:[10C92BCh]
add esp,10h
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
printf("
");
mov esi,esp
printf("
");
push 10C5FD8h
call dword ptr ds:[10C92BCh]
add esp,4
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
return 0;
xor eax,eax
} 我只分析了一部分,经过压栈操作,最后出来的数就是5,4,3了。第一个也类似分析。
会看汇编就容易多了。
这样的题目很多,我教你一种分析的方法,以后碰到这样的题目就不怕了。
按F10进入调试状态;
在写代码的区域右键,选择转到反汇编;
看汇编是怎么写的一目了然。下面我把vs2012上反汇编出来的代码贴出来给你讲解一下。
#include
int main()
{
push ebp
mov ebp,esp
sub esp,0D4h
push ebx
push esi
push edi
lea edi,[ebp-0D4h]
mov ecx,35h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
int i = 3;
mov dword ptr [i],3 //mov是移动指令,把3移到i中
printf("%d,%d,%d", i, i++, i++);
mov eax,dword ptr [i] //把i(也就是3)移到eax寄存器中
mov dword ptr [ebp-0D0h],eax //把eax(即3)移到ebp-0D0h这个相对地址中
mov ecx,dword ptr [i] //把i(也就是3)移到ecx寄存器中
add ecx,1 //add是加指令,把ecx中的数值加1,即为4
mov dword ptr [i],ecx //把ecx(其值为4)移到i中
mov edx,dword ptr [i] //把i(也就是4)移到edx寄存器中
mov dword ptr [ebp-0D4h],edx //把edx(即4)移到ebp-0D4h这个相对地址中
mov eax,dword ptr [i] //把i(也就是4)移到eax寄存器中
add eax,1 //把eax中的数值加1,即eax中的值为5
mov dword ptr [i],eax //把eax(即5)移到i中
mov esi,esp
mov ecx,dword ptr [ebp-0D0h] //移动ebp-0D0h地址中的值,即3到ecx
push ecx //3压栈
mov edx,dword ptr [ebp-0D4h] //移动ebp-0D4h地址中的值,即4到edx
push edx //4压栈
mov eax,dword ptr [i] //5移到eax中
push eax //5压栈
push 10C5858h
call dword ptr ds:[10C92BCh]
add esp,10h
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
printf("
");
mov esi,esp
push 10C5FD8h
call dword ptr ds:[10C92BCh]
add esp,4
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
printf("%d,%d,%d", i + 8, i += 5, i--);
mov eax,dword ptr [i]
mov dword ptr [ebp-0D0h],eax
mov ecx,dword ptr [i]
printf("%d,%d,%d", i + 8, i += 5, i--);
sub ecx,1
mov dword ptr [i],ecx
mov edx,dword ptr [i]
add edx,5
mov dword ptr [i],edx
mov esi,esp
mov eax,dword ptr [ebp-0D0h]
push eax
mov ecx,dword ptr [i]
push ecx
mov edx,dword ptr [i]
add edx,8
push edx
push 10C5858h
call dword ptr ds:[10C92BCh]
add esp,10h
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
printf("
");
mov esi,esp
printf("
");
push 10C5FD8h
call dword ptr ds:[10C92BCh]
add esp,4
cmp esi,esp
call __RTC_CheckEsp (010C113Bh)
return 0;
xor eax,eax
} 我只分析了一部分,经过压栈操作,最后出来的数就是5,4,3了。第一个也类似分析。
会看汇编就容易多了。
全部回答
- 1楼网友:像个废品
- 2021-04-06 04:38
第一个5,4,3;第二个15,7,3。请使用符合C标准的编译器。
你既然都知道是从右向左了,怎么还把第一个的答案预测错了?
int i=3;,那么i++的值是3,i++执行完后i的值是4。
你既然都知道是从右向左了,怎么还把第一个的答案预测错了?
int i=3;,那么i++的值是3,i++执行完后i的值是4。
- 2楼网友:平生事
- 2021-04-06 03:30
第一个中,是先输出,后++的。所以都是三。
- 3楼网友:夜风逐马
- 2021-04-06 02:35
printf("%d,%d,%d",i,i++,i++);输出3,3,3正确。有两个原因供参考:
i++是后++,要等输出结束后才执行加1运算;
即便是前++,如printf("%d,%d,%d",i,++i,++i);,输出也不会是3,4,5,而应该是5,5,4。因为最后一个i变成4后就压栈了,中间一个在4基础上+1自然是5,最前面的一个i值未变。当然这还与编译器有点关系,如果某编译器要等把所有列表项计算完再压栈,那这里输出就应该是5,5,5了!
按照这些规则,printf("%d,%d,%d",i+8,i+=5,i--);的输出应该是16,8,3而不应该是16,8,4。
回答 “风雷雪电”:
#include "stdio.h"
void main(void){
int i=3;
printf("%d,%d,%d ",i,i++,i++);
}
别忘了i++,i++都是后++……
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯