不主动 发表于 2018-6-2 09:37:09

累加问题

#include "stdio.h"
voidmain()
{
        int i ,j ,p ,q ;
        i=5,j=5;
        p=(i++)+(i++)+(i++);
        q=(++j)+(++j)+(++j);
        printf("i=%d j=%d p=%d q=%d\n",i,j,p,q);
}
        i=8,j=8,p=15,q=22;

求解释

理想小青年 发表于 2018-6-2 09:40:56

原来很迷茫 现在在学习汇编,然后知道编译器的问题
其实你不用懂你只要知道i++ --i 语法意思就可以 后面学习玩C,从汇编层面来看就会迎刃而解,现在讲也都是字面意思还是会忘

不主动 发表于 2018-6-2 10:16:45

{:5_99:}

不主动 发表于 2018-6-2 10:17:59

不主动 发表于 2018-6-2 10:16


还是想知道字面意思{:5_109:}

BngThea 发表于 2018-6-2 10:23:56

首先同意二楼的说法

这里简单解释一下结果
ij为8因为都自增了3次,容易理解
p为15因为后置加加是先使用再自增,所以为三个5的和
关键是q,求解过程这样的,注意看括号
((++j)+(++j))+(++j)
先完成两次自增变为7相加得到14
然后变成
14+(++j)
j自增变成8,最终即为22

不主动 发表于 2018-6-2 10:39:21

BngThea 发表于 2018-6-2 10:23
首先同意二楼的说法

这里简单解释一下结果


使用加法是不是必须要确定加号两边的值才可以相加{:5_104:}

BngThea 发表于 2018-6-2 12:05:27

不主动 发表于 2018-6-2 10:39
使用加法是不是必须要确定加号两边的值才可以相加

那是当然

人造人 发表于 2018-6-2 14:08:30

人造人 发表于 2018-6-2 14:09:50

不要说代码和你的不一样
完全复制你的代码

人造人 发表于 2018-6-2 14:24:11

#include <stdio.h>

int main(void)
{
        int i, j, p, q;
        i = 5, j = 5;

        p = (i++) + (i++) + (i++);
        q = (++j) + (++j) + (++j);
       
        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);

        return 0;
}


int main(void)
{
010A7700push      ebp
010A7701mov         ebp,esp
010A7703sub         esp,0F0h
010A7709push      ebx
010A770Apush      esi
010A770Bpush      edi
010A770Clea         edi,
010A7712mov         ecx,3Ch
010A7717mov         eax,0CCCCCCCCh
010A771Crep stos    dword ptr es:
        int i, j, p, q;
        i = 5, j = 5;
010A771Emov         dword ptr ,5
010A7725mov         dword ptr ,5

        p = (i++) + (i++) + (i++);
010A772Cmov         eax,dword ptr
010A772Fadd         eax,dword ptr
010A7732add         eax,dword ptr
010A7735mov         dword ptr ,eax
010A7738mov         ecx,dword ptr
010A773Badd         ecx,1
010A773Emov         dword ptr ,ecx
010A7741mov         edx,dword ptr
010A7744add         edx,1
010A7747mov         dword ptr ,edx
010A774Amov         eax,dword ptr
010A774Dadd         eax,1
010A7750mov         dword ptr ,eax
        q = (++j) + (++j) + (++j);
010A7753mov         eax,dword ptr
010A7756add         eax,1
010A7759mov         dword ptr ,eax
010A775Cmov         ecx,dword ptr
010A775Fadd         ecx,1
010A7762mov         dword ptr ,ecx
010A7765mov         edx,dword ptr
010A7768add         edx,1
010A776Bmov         dword ptr ,edx
010A776Emov         eax,dword ptr
010A7771add         eax,dword ptr
010A7774add         eax,dword ptr
010A7777mov         dword ptr ,eax
       
        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
010A777Amov         eax,dword ptr
010A777Dpush      eax
010A777Emov         ecx,dword ptr
010A7781push      ecx
010A7782mov         edx,dword ptr
010A7785push      edx
010A7786mov         eax,dword ptr
010A7789push      eax
010A778Apush      offset string "i=%d j=%d p=%d q=%d\n" (01133E50h)
010A778Fcall      _printf (0109BD9Bh)
010A7794add         esp,14h

        return 0;
010A7797xor         eax,eax
}
010A7799pop         edi
010A779Apop         esi
010A779Bpop         ebx
010A779Cadd         esp,0F0h
010A77A2cmp         ebp,esp
010A77A4call      __RTC_CheckEsp (0109A383h)
010A77A9mov         esp,ebp
010A77ABpop         ebp
010A77ACret





#include <stdio.h>

int main(void)
{
        int i, j, p, q;
        i = 5, j = 5;


        // *******************************
        p = i + i + i;
        i++;
        i++;
        i++;

        p = (i++) + (i++) + (i++);
        // *******************************
        ++j;
        ++j;
        ++j;
        q = j + j + j;

        q = (++j) + (++j) + (++j);
        // *******************************

        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);

        return 0;
}


int main(void)
{
00C37700push      ebp
00C37701mov         ebp,esp
00C37703sub         esp,0F0h
00C37709push      ebx
00C3770Apush      esi
00C3770Bpush      edi
00C3770Clea         edi,
00C37712mov         ecx,3Ch
00C37717mov         eax,0CCCCCCCCh
00C3771Crep stos    dword ptr es:
        int i, j, p, q;
        i = 5, j = 5;
00C3771Emov         dword ptr ,5
00C37725mov         dword ptr ,5


        // *******************************
        p = i + i + i;
00C3772Cmov         eax,dword ptr
00C3772Fadd         eax,dword ptr
00C37732add         eax,dword ptr
00C37735mov         dword ptr ,eax
        i++;
00C37738mov         eax,dword ptr
00C3773Badd         eax,1
00C3773Emov         dword ptr ,eax
        i++;
00C37741mov         eax,dword ptr
00C37744add         eax,1
00C37747mov         dword ptr ,eax
        i++;
00C3774Amov         eax,dword ptr
00C3774Dadd         eax,1
00C37750mov         dword ptr ,eax

        p = (i++) + (i++) + (i++);
00C37753mov         eax,dword ptr
00C37756add         eax,dword ptr
00C37759add         eax,dword ptr
00C3775Cmov         dword ptr ,eax
00C3775Fmov         ecx,dword ptr
00C37762add         ecx,1
00C37765mov         dword ptr ,ecx
00C37768mov         edx,dword ptr
00C3776Badd         edx,1
00C3776Emov         dword ptr ,edx
00C37771mov         eax,dword ptr
00C37774add         eax,1
00C37777mov         dword ptr ,eax
        // *******************************
        ++j;
00C3777Amov         eax,dword ptr
00C3777Dadd         eax,1
00C37780mov         dword ptr ,eax
        ++j;
00C37783mov         eax,dword ptr
00C37786add         eax,1
00C37789mov         dword ptr ,eax
        ++j;
00C3778Cmov         eax,dword ptr
        ++j;
00C3778Fadd         eax,1
00C37792mov         dword ptr ,eax
        q = j + j + j;
00C37795mov         eax,dword ptr
00C37798add         eax,dword ptr
00C3779Badd         eax,dword ptr
00C3779Emov         dword ptr ,eax

        q = (++j) + (++j) + (++j);
00C377A1mov         eax,dword ptr
00C377A4add         eax,1
00C377A7mov         dword ptr ,eax
00C377AAmov         ecx,dword ptr
00C377ADadd         ecx,1
00C377B0mov         dword ptr ,ecx
00C377B3mov         edx,dword ptr
00C377B6add         edx,1
00C377B9mov         dword ptr ,edx
00C377BCmov         eax,dword ptr
00C377BFadd         eax,dword ptr
00C377C2add         eax,dword ptr
00C377C5mov         dword ptr ,eax
        // *******************************

        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
00C377C8mov         eax,dword ptr
00C377CBpush      eax
00C377CCmov         ecx,dword ptr
00C377CFpush      ecx
00C377D0mov         edx,dword ptr
00C377D3push      edx
00C377D4mov         eax,dword ptr
00C377D7push      eax
00C377D8push      offset string "i=%d j=%d p=%d q=%d\n" (0CC3E50h)
00C377DDcall      _printf (0C2BD9Bh)
        // *******************************

        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
00C377E2add         esp,14h

        return 0;
00C377E5xor         eax,eax
}
00C377E7pop         edi
00C377E8pop         esi
00C377E9pop         ebx
00C377EAadd         esp,0F0h
00C377F0cmp         ebp,esp
00C377F2call      __RTC_CheckEsp (0C2A383h)
00C377F7mov         esp,ebp
00C377F9pop         ebp
00C377FAret


可以看到
        p = i + i + i;
        i++;
        i++;
        i++;
相当于
p = (i++) + (i++) + (i++);



        ++j;
        ++j;
        ++j;
        q = j + j + j;
相当于
q = (++j) + (++j) + (++j);

不主动 发表于 2018-6-2 14:38:32

人造人 发表于 2018-6-2 14:09
不要说代码和你的不一样
完全复制你的代码

{:10_243:}不知道了   我的运行出来是22

不主动 发表于 2018-6-2 14:40:00

人造人 发表于 2018-6-2 14:24
可以看到

相当于


辛苦了{:5_99:}

人造人 发表于 2018-6-2 14:41:41

不主动 发表于 2018-6-2 14:38
不知道了   我的运行出来是22

嗯,这类语法在标准中的定义是"未定义"的,也就是说不同的编译器可能会有不同的结果
说白了就是编译器爱咋搞就咋搞
^_^
页: [1]
查看完整版本: 累加问题