鱼C论坛

 找回密码
 立即注册
查看: 2160|回复: 12

[已解决]累加问题

[复制链接]
发表于 2018-6-2 09:37:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include "stdio.h"
void  main()
{
        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 10:23:56
首先同意二楼的说法

这里简单解释一下结果
ij为8因为都自增了3次,容易理解
p为15因为后置加加是先使用再自增,所以为三个5的和
关键是q,求解过程这样的,注意看括号
((++j)+(++j))+(++j)
先完成两次自增变为7相加得到14
然后变成
14+(++j)
j自增变成8,最终即为22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-2 09:40:56 | 显示全部楼层
原来很迷茫 现在在学习汇编,然后知道编译器的问题
其实你不用懂  你只要知道i++ --i 语法意思就可以 后面学习玩C,从汇编层面来看就会迎刃而解,现在讲也都是字面意思还是会忘
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-6-2 10:16:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-6-2 10:17:59 | 显示全部楼层

还是想知道字面意思  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 10:23:56 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
首先同意二楼的说法

这里简单解释一下结果
ij为8因为都自增了3次,容易理解
p为15因为后置加加是先使用再自增,所以为三个5的和
关键是q,求解过程这样的,注意看括号
((++j)+(++j))+(++j)
先完成两次自增变为7相加得到14
然后变成
14+(++j)
j自增变成8,最终即为22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 10:39:21 | 显示全部楼层
BngThea 发表于 2018-6-2 10:23
首先同意二楼的说法

这里简单解释一下结果

使用加法是不是必须要确定加号两边的值才可以相加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 12:05:27 From FishC Mobile | 显示全部楼层
不主动 发表于 2018-6-2 10:39
使用加法是不是必须要确定加号两边的值才可以相加

那是当然
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:08:30 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:09:50 | 显示全部楼层
不要说代码和你的不一样
完全复制你的代码

2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
{
010A7700  push        ebp  
010A7701  mov         ebp,esp  
010A7703  sub         esp,0F0h  
010A7709  push        ebx  
010A770A  push        esi  
010A770B  push        edi  
010A770C  lea         edi,[ebp-0F0h]  
010A7712  mov         ecx,3Ch  
010A7717  mov         eax,0CCCCCCCCh  
010A771C  rep stos    dword ptr es:[edi]  
        int i, j, p, q;
        i = 5, j = 5;
010A771E  mov         dword ptr [i],5  
010A7725  mov         dword ptr [j],5  

        p = (i++) + (i++) + (i++);
010A772C  mov         eax,dword ptr [i]  
010A772F  add         eax,dword ptr [i]  
010A7732  add         eax,dword ptr [i]  
010A7735  mov         dword ptr [p],eax  
010A7738  mov         ecx,dword ptr [i]  
010A773B  add         ecx,1  
010A773E  mov         dword ptr [i],ecx  
010A7741  mov         edx,dword ptr [i]  
010A7744  add         edx,1  
010A7747  mov         dword ptr [i],edx  
010A774A  mov         eax,dword ptr [i]  
010A774D  add         eax,1  
010A7750  mov         dword ptr [i],eax  
        q = (++j) + (++j) + (++j);
010A7753  mov         eax,dword ptr [j]  
010A7756  add         eax,1  
010A7759  mov         dword ptr [j],eax  
010A775C  mov         ecx,dword ptr [j]  
010A775F  add         ecx,1  
010A7762  mov         dword ptr [j],ecx  
010A7765  mov         edx,dword ptr [j]  
010A7768  add         edx,1  
010A776B  mov         dword ptr [j],edx  
010A776E  mov         eax,dword ptr [j]  
010A7771  add         eax,dword ptr [j]  
010A7774  add         eax,dword ptr [j]  
010A7777  mov         dword ptr [q],eax  
        
        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
010A777A  mov         eax,dword ptr [q]  
010A777D  push        eax  
010A777E  mov         ecx,dword ptr [p]  
010A7781  push        ecx  
010A7782  mov         edx,dword ptr [j]  
010A7785  push        edx  
010A7786  mov         eax,dword ptr [i]  
010A7789  push        eax  
010A778A  push        offset string "i=%d j=%d p=%d q=%d\n" (01133E50h)  
010A778F  call        _printf (0109BD9Bh)  
010A7794  add         esp,14h  

        return 0;
010A7797  xor         eax,eax  
}
010A7799  pop         edi  
010A779A  pop         esi  
010A779B  pop         ebx  
010A779C  add         esp,0F0h  
010A77A2  cmp         ebp,esp  
010A77A4  call        __RTC_CheckEsp (0109A383h)  
010A77A9  mov         esp,ebp  
010A77AB  pop         ebp  
010A77AC  ret  




#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)
{
00C37700  push        ebp  
00C37701  mov         ebp,esp  
00C37703  sub         esp,0F0h  
00C37709  push        ebx  
00C3770A  push        esi  
00C3770B  push        edi  
00C3770C  lea         edi,[ebp-0F0h]  
00C37712  mov         ecx,3Ch  
00C37717  mov         eax,0CCCCCCCCh  
00C3771C  rep stos    dword ptr es:[edi]  
        int i, j, p, q;
        i = 5, j = 5;
00C3771E  mov         dword ptr [i],5  
00C37725  mov         dword ptr [j],5  


        // *******************************
        p = i + i + i;
00C3772C  mov         eax,dword ptr [i]  
00C3772F  add         eax,dword ptr [i]  
00C37732  add         eax,dword ptr [i]  
00C37735  mov         dword ptr [p],eax  
        i++;
00C37738  mov         eax,dword ptr [i]  
00C3773B  add         eax,1  
00C3773E  mov         dword ptr [i],eax  
        i++;
00C37741  mov         eax,dword ptr [i]  
00C37744  add         eax,1  
00C37747  mov         dword ptr [i],eax  
        i++;
00C3774A  mov         eax,dword ptr [i]  
00C3774D  add         eax,1  
00C37750  mov         dword ptr [i],eax  

        p = (i++) + (i++) + (i++);
00C37753  mov         eax,dword ptr [i]  
00C37756  add         eax,dword ptr [i]  
00C37759  add         eax,dword ptr [i]  
00C3775C  mov         dword ptr [p],eax  
00C3775F  mov         ecx,dword ptr [i]  
00C37762  add         ecx,1  
00C37765  mov         dword ptr [i],ecx  
00C37768  mov         edx,dword ptr [i]  
00C3776B  add         edx,1  
00C3776E  mov         dword ptr [i],edx  
00C37771  mov         eax,dword ptr [i]  
00C37774  add         eax,1  
00C37777  mov         dword ptr [i],eax  
        // *******************************
        ++j;
00C3777A  mov         eax,dword ptr [j]  
00C3777D  add         eax,1  
00C37780  mov         dword ptr [j],eax  
        ++j;
00C37783  mov         eax,dword ptr [j]  
00C37786  add         eax,1  
00C37789  mov         dword ptr [j],eax  
        ++j;
00C3778C  mov         eax,dword ptr [j]  
        ++j;
00C3778F  add         eax,1  
00C37792  mov         dword ptr [j],eax  
        q = j + j + j;
00C37795  mov         eax,dword ptr [j]  
00C37798  add         eax,dword ptr [j]  
00C3779B  add         eax,dword ptr [j]  
00C3779E  mov         dword ptr [q],eax  

        q = (++j) + (++j) + (++j);
00C377A1  mov         eax,dword ptr [j]  
00C377A4  add         eax,1  
00C377A7  mov         dword ptr [j],eax  
00C377AA  mov         ecx,dword ptr [j]  
00C377AD  add         ecx,1  
00C377B0  mov         dword ptr [j],ecx  
00C377B3  mov         edx,dword ptr [j]  
00C377B6  add         edx,1  
00C377B9  mov         dword ptr [j],edx  
00C377BC  mov         eax,dword ptr [j]  
00C377BF  add         eax,dword ptr [j]  
00C377C2  add         eax,dword ptr [j]  
00C377C5  mov         dword ptr [q],eax  
        // *******************************

        printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
00C377C8  mov         eax,dword ptr [q]  
00C377CB  push        eax  
00C377CC  mov         ecx,dword ptr [p]  
00C377CF  push        ecx  
00C377D0  mov         edx,dword ptr [j]  
00C377D3  push        edx  
00C377D4  mov         eax,dword ptr [i]  
00C377D7  push        eax  
00C377D8  push        offset string "i=%d j=%d p=%d q=%d\n" (0CC3E50h)  
00C377DD  call        _printf (0C2BD9Bh)  
        // *******************************

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

        return 0;
00C377E5  xor         eax,eax  
}
00C377E7  pop         edi  
00C377E8  pop         esi  
00C377E9  pop         ebx  
00C377EA  add         esp,0F0h  
00C377F0  cmp         ebp,esp  
00C377F2  call        __RTC_CheckEsp (0C2A383h)  
00C377F7  mov         esp,ebp  
00C377F9  pop         ebp  
00C377FA  ret  


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


        ++j;
        ++j;
        ++j;
        q = j + j + j;
相当于
q = (++j) + (++j) + (++j);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 14:38:32 | 显示全部楼层
人造人 发表于 2018-6-2 14:09
不要说代码和你的不一样
完全复制你的代码

  不知道了   我的运行出来是22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-2 14:40:00 | 显示全部楼层
人造人 发表于 2018-6-2 14:24
可以看到

相当于

辛苦了  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-2 14:41:41 | 显示全部楼层
不主动 发表于 2018-6-2 14:38
不知道了   我的运行出来是22

嗯,这类语法在标准中的定义是"未定义"的,也就是说不同的编译器可能会有不同的结果
说白了就是编译器爱咋搞就咋搞
^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 22:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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