永发信息网

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了。第一个也类似分析。
会看汇编就容易多了。
全部回答
  • 1楼网友:像个废品
  • 2021-04-06 04:38
第一个5,4,3;第二个15,7,3。请使用符合C标准的编译器。
你既然都知道是从右向左了,怎么还把第一个的答案预测错了?
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++都是后++……
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯