游戏开发论坛

 找回密码
 立即注册
搜索
楼主: 知川内酷

问一个关于i++的幼稚问题

[复制链接]

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 01:54:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

004119F9  int         3   
004119FA  int         3   
004119FB  int         3   
004119FC  int         3   
004119FD  int         3   
004119FE  int         3   
004119FF  int         3   
00411A00  int         3   
00411A01  int         3   
00411A02  int         3   
00411A03  int         3   
00411A04  int         3   
00411A05  int         3   
00411A06  int         3   
00411A07  int         3   
00411A08  int         3   
00411A09  int         3   
00411A0A  int         3   
00411A0B  int         3   
00411A0C  int         3   
00411A0D  int         3   
00411A0E  int         3   
00411A0F  int         3   
00411A10  int         3   
00411A11  int         3   
00411A12  int         3   
00411A13  int         3   
00411A14  int         3   
00411A15  int         3   
00411A16  int         3   
00411A17  int         3   
00411A18  int         3   
00411A19  int         3   
00411A1A  int         3   
00411A1B  int         3   
00411A1C  int         3   
00411A1D  int         3   
00411A1E  int         3   
00411A1F  int         3   
00411A20  int         3   
00411A21  int         3   
00411A22  int         3   
00411A23  int         3   
00411A24  int         3   
00411A25  int         3   
00411A26  int         3   
00411A27  int         3   
00411A28  int         3   
00411A29  int         3   
00411A2A  int         3   
00411A2B  int         3   
00411A2C  int         3   
00411A2D  int         3   
00411A2E  int         3   
00411A2F  int         3   
--- d:\temp\visual studio projects\dfg\dfg\sdf.cpp -----------------------------
        #include <stdio.h>




void main()
{
00411A30  push        ebp  
00411A31  mov         ebp,esp
00411A33  sub         esp,0D0h
00411A39  push        ebx  
00411A3A  push        esi  
00411A3B  push        edi  
00411A3C  lea         edi,[ebp-0D0h]
00411A42  mov         ecx,34h
00411A47  mov         eax,0CCCCCCCCh
00411A4C  rep stos    dword ptr [edi]
int i=3;
00411A4E  mov         dword ptr ,3
printf ("%i,%i ",i,i++);
00411A55  mov         eax,dword ptr
00411A58  mov         dword ptr [ebp-0D0h],eax
00411A5E  mov         ecx,dword ptr
00411A61  add         ecx,1
00411A64  mov         dword ptr ,ecx
00411A67  mov         edx,dword ptr [ebp-0D0h]
00411A6D  push        edx  
00411A6E  mov         eax,dword ptr
00411A71  push        eax  
00411A72  push        offset string "%i,%i " (42401Ch)
00411A77  call        @ILT+1170(_printf) (411497h)
00411A7C  add         esp,0Ch

}
00411A7F  xor         eax,eax
00411A81  pop         edi  
00411A82  pop         esi  
00411A83  pop         ebx  
00411A84  add         esp,0D0h
00411A8A  cmp         ebp,esp
00411A8C  call        @ILT+935(__RTC_CheckEsp) (4113ACh)
00411A91  mov         esp,ebp
00411A93  pop         ebp  
00411A94  ret              
--- 无源文件 -----------------------------------------------------------------------
00411A95  int         3   
00411A96  int         3   
00411A97  int         3   
00411A98  int         3   
00411A99  int         3   
00411A9A  int         3   
00411A9B  int         3   
00411A9C  int         3   
00411A9D  int         3   
00411A9E  int         3   
00411A9F  int         3   
00411AA0  int         3   
00411AA1  int         3   
00411AA2  int         3   
00411AA3  int         3   
00411AA4  int         3   
00411AA5  int         3   
00411AA6  int         3   
00411AA7  int         3   
00411AA8  int         3   
00411AA9  int         3   
00411AAA  int         3   
00411AAB  int         3   
00411AAC  int         3   
00411AAD  int         3   
00411AAE  int         3   
00411AAF  int         3   
--- f:\vs70builds\3077\vc\crtbld\crt\src\printf.c ------------------------------
/***
*printf.c - print formatted
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines printf() - print formatted data
*
*******************************************************************************/

#include <cruntime.h>
#include <stdio.h>
#include <dbgint.h>
#include <stdarg.h>
#include <file2.h>
#include <internal.h>
#include <mtdll.h>

/***
*int printf(format, ...) - print formatted data
*
*Purpose:
*       Prints formatted data on stdout using the format string to
*       format data and getting as many arguments as called for
*       Uses temporary buffering to improve efficiency.
*       _output does the real work here
*
*Entry:
*       char *format - format string to control data format/number of arguments
*       followed by list of arguments, number and type controlled by
*       format string
*
*Exit:
*       returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/

int __cdecl printf (
        const char *format,
        ...
        )
/*
* stdout 'PRINT', 'F'ormatted
*/
{
00411AB0  push        ebp  
00411AB1  mov         ebp,esp
00411AB3  sub         esp,0Ch
        va_list arglist;
        int buffing;
        int retval;

        va_start(arglist, format);
00411AB6  lea         eax,[ebp+0Ch]
00411AB9  mov         dword ptr [arglist],eax

        _ASSERTE(format != NULL);
00411ABC  cmp         dword ptr [format],0
00411AC0  jne         printf+30h (411AE0h)
00411AC2  push        offset string "format != NULL" (424030h)
00411AC7  push        0   
00411AC9  push        36h  
00411ACB  push        offset string "printf.c" (424024h)
00411AD0  push        2   
00411AD2  call        @ILT+365(__CrtDbgReport) (411172h)
00411AD7  add         esp,14h
00411ADA  cmp         eax,1
00411ADD  jne         printf+30h (411AE0h)
00411ADF  int         3   

#ifdef _MT
        _lock_str2(1, stdout);
        __try {
#endif  /* _MT */

        buffing = _stbuf(stdout);
00411AE0  push        offset __iob+20h (427B78h)
00411AE5  call        @ILT+285(__stbuf) (411122h)
00411AEA  add         esp,4
00411AED  mov         dword ptr [buffing],eax

        retval = _output(stdout,format,arglist);
00411AF0  mov         edx,dword ptr [arglist]
00411AF3  push        edx  
00411AF4  mov         eax,dword ptr [format]
00411AF7  push        eax  
00411AF8  push        offset __iob+20h (427B78h)
00411AFD  call        @ILT+730(__output) (4112DFh)
00411B02  add         esp,0Ch
00411B05  mov         dword ptr [retval],eax

        _ftbuf(buffing, stdout);
00411B08  push        offset __iob+20h (427B78h)
00411B0D  mov         ecx,dword ptr [buffing]
00411B10  push        ecx  
00411B11  call        @ILT+1155(__ftbuf) (411488h)
00411B16  add         esp,8

#ifdef _MT
        }
        __finally {
            _unlock_str2(1, stdout);
        }
#endif  /* _MT */

        return(retval);
00411B19  mov         eax,dword ptr [retval]
}
00411B1C  mov         esp,ebp
00411B1E  pop         ebp  
00411B1F  ret              
--- 无源文件 -----------------------------------------------------------------------
00411B20  int         3   
00411B21  int         3   
00411B22  int         3   
00411B23  int         3   
00411B24  int         3   
00411B25  int         3   
00411B26  int         3   
00411B27  int         3   
00411B28  int         3   
00411B29  int         3   
00411B2A  int         3   
00411B2B  int         3   
00411B2C  int         3   
00411B2D  int         3   
00411B2E  int         3   
00411B2F  int         3   
00411B30  int         3   
00411B31  int         3   
00411B32  int         3   
00411B33  int         3   
00411B34  int         3   
00411B35  int         3   
00411B36  int         3   
00411B37  int         3   
00411B38  int         3   
00411B39  int         3   
00411B3A  int         3   
00411B3B  int         3   

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 01:58:00 | 显示全部楼层

Re: 问一个关于i++的幼稚问题

#include <stdio.h>//换这个文件了 也是这个结果

void main()
{
int i=3;
printf ("%i,%i ",i,i++);

}
我没学过反汇编
看不懂
sf_20041061585.jpg

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 02:03:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

 . . . . 
原来是这样 又是一个debug的错误??你在后面史用了i的吧?
release下面

void fuc_fd(int i) //我使用了这样防止c++优化掉i
{
        printf (" %d,%d %d",i++,i++,i++);
        printf (" %d,%d %d",i++,i++,i++);
}

        int i = 0;
        std::cin>>i;
        fuc_fd(i);
的到结果
00404299  mov         esi,dword ptr [esp+4]
0040429D  push        esi  
0040429E  push        esi  
0040429F  push        esi  
004042A0  push        offset string " %d,%d %d" (41221Ch)
004042A5  call        printf (4071DDh)
004042AA  lea         eax,[esi+3]
004042AD  push        eax  
004042AE  push        eax  
004042AF  push        eax  
004042B0  push        offset string " %d,%d %d" (41221Ch)
004042B5  call        printf (4071DDh)
004042BA  add         esp,20h


晕,不知道这个算不算ms的bug,debug下面居然ms真干出了这种事
                printf (" %d,%d %d",i++,i++,i++);
00427C63  mov         eax,dword ptr
00427C66  mov         dword ptr [ebp-0D0h],eax
00427C6C  mov         ecx,dword ptr
00427C6F  add         ecx,1
00427C72  mov         dword ptr ,ecx
00427C75  mov         edx,dword ptr
00427C78  mov         dword ptr [ebp-0D4h],edx
00427C7E  mov         eax,dword ptr
00427C81  add         eax,1
00427C84  mov         dword ptr ,eax
00427C87  mov         ecx,dword ptr
00427C8A  mov         dword ptr [ebp-0D8h],ecx
00427C90  mov         edx,dword ptr
00427C93  add         edx,1
00427C96  mov         dword ptr ,edx
00427C99  mov         eax,dword ptr [ebp-0D0h]
00427C9F  push        eax  
00427CA0  mov         ecx,dword ptr [ebp-0D4h]
00427CA6  push        ecx  
00427CA7  mov         edx,dword ptr [ebp-0D8h]
00427CAD  push        edx  
00427CAE  push        offset string " %d,%d %d" (4687A8h)
00427CB3  call        @ILT+5445(_printf) (42254Ah)
哎.....

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 02:09:00 | 显示全部楼层

Re: 问一个关于i++的幼稚问题

没有使用
#include <iostream>
void fuc_fd(int i)
{
printf (" %d,%d %d",i++,i,i++);//中间那个i没有++
printf (" %d,%d %d",i,i++,i++);//最左面的i没有++
}
void main()
{
int i = 0;
std::cin>>i;
fuc_fd(i);
}
这样执行还是我说的那种结果
输入3
4,5,3 第一行
7,6,5 第二行
sf_20041062940.jpg

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-10-6 02:14:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

和使用什么无关,debug下面,ms还真给每个后++做一个临时变量了,哎.....真是.

你去release看看,release才代表c++标准,这个错误应该向ms提出来
去睡觉了,困得不行了.

193

主题

870

帖子

903

积分

高级会员

Rank: 4

积分
903
QQ
发表于 2004-10-6 02:17:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

哦果然是debug和release的不同啊
看到了

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-10-6 06:20:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

原来VC还有中文版啊。。。-。-

翻译得还有板有眼的。。。再寒一个。。

所以如果真正想弄比较纯正的C/C++,建议不要用VC,而是用GCC
如果没有LINUX环境,可以装个CYGWIN来用GCC。

37

主题

727

帖子

740

积分

高级会员

Rank: 4

积分
740
 楼主| 发表于 2004-10-6 10:48:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题


真是受益匪浅耶
你们说的知识我先收下了
HOHO
谢谢大家了
书上说 每个编辑系统的算法不同
所以大家也不用计较D

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-10-6 11:04:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题

我的经验就是:不这么用,分开写

37

主题

727

帖子

740

积分

高级会员

Rank: 4

积分
740
 楼主| 发表于 2004-10-6 11:10:00 | 显示全部楼层

Re:问一个关于i++的幼稚问题


浩强哥也是什么说的
嘎嘎
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-22 17:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表