鱼C论坛

 找回密码
 立即注册
查看: 1573|回复: 8

[已解决]初学者求解答

[复制链接]
发表于 2018-7-26 12:41:05 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>


void main()
{
    int i = 5,j=5,p,q;
    p=(i++)+(i++)+(i++);
    q=(++j)+(++j)+(++j);
    printf("%d,%d,%d,%d",i,j,p,q);
}

答案分别是 8 8 15 22   

明白为什么是15 不明白其他三个
最佳答案
2018-7-26 14:00:32
1.png
2.png
        int i = 5, j = 5, p, q;
01014D3E C7 45 F8 05 00 00 00 mov         dword ptr [i],5  
01014D45 C7 45 EC 05 00 00 00 mov         dword ptr [j],5  
        p = (i++) + (i++) + (i++);
01014D4C 8B 45 F8             mov         eax,dword ptr [i]  
01014D4F 03 45 F8             add         eax,dword ptr [i]  
01014D52 03 45 F8             add         eax,dword ptr [i]  
01014D55 89 45 E0             mov         dword ptr [p],eax  
01014D58 8B 4D F8             mov         ecx,dword ptr [i]  
01014D5B 83 C1 01             add         ecx,1  
01014D5E 89 4D F8             mov         dword ptr [i],ecx  
01014D61 8B 55 F8             mov         edx,dword ptr [i]  
01014D64 83 C2 01             add         edx,1  
01014D67 89 55 F8             mov         dword ptr [i],edx  
01014D6A 8B 45 F8             mov         eax,dword ptr [i]  
01014D6D 83 C0 01             add         eax,1  
01014D70 89 45 F8             mov         dword ptr [i],eax  
        q = (++j) + (++j) + (++j);
01014D73 8B 45 EC             mov         eax,dword ptr [j]  
01014D76 83 C0 01             add         eax,1  
01014D79 89 45 EC             mov         dword ptr [j],eax  
01014D7C 8B 4D EC             mov         ecx,dword ptr [j]  
01014D7F 83 C1 01             add         ecx,1  
01014D82 89 4D EC             mov         dword ptr [j],ecx  
01014D85 8B 55 EC             mov         edx,dword ptr [j]  
01014D88 83 C2 01             add         edx,1  
01014D8B 89 55 EC             mov         dword ptr [j],edx  
01014D8E 8B 45 EC             mov         eax,dword ptr [j]  
01014D91 03 45 EC             add         eax,dword ptr [j]  
01014D94 03 45 EC             add         eax,dword ptr [j]  
01014D97 89 45 D4             mov         dword ptr [q],eax  

也就是说,我的编译器是这样做的
p = i + i + i;
i += 1;
i += 1;
i += 1;

j += 1;
j += 1;
j += 1;
q = j + j + j;

3.png
#include <stdio.h>

int main(void)
{
        {
                int i = 5, j = 5, p, q;
                p = (i++) + (i++) + (i++);
                q = (++j) + (++j) + (++j);
                printf("%d,%d,%d,%d\n", i, j, p, q);
        }
        {
                int i = 5, j = 5, p, q;
                
                p = i + i + i;
                i += 1;
                i += 1;
                i += 1;

                j += 1;
                j += 1;
                j += 1;
                q = j + j + j;

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

        return 0;
}


#include <stdio.h>

int main(void)
{
        int i = 5, j = 5, p, q;
        p = (i++) + (i++) + (i++);
        q = (++j) + (++j) + (++j);
        printf("%d,%d,%d,%d", i, j, p, q);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-26 13:12:11 | 显示全部楼层
i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)
j是前置++,初始为5,先运算两个,j变成7,得
q=(7+7)+(++j) == 14+8 ==22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 13:49:39 | 显示全部楼层
BngThea 发表于 2018-7-26 13:12
i 和 j 最终都是自增3次,当然都为8
置于q,大概如下:
q=((++j)+(++j))+(++j)

不应该是6+7+8吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 13:52:10 | 显示全部楼层

++是前置,先执行再求和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 13:57:02 | 显示全部楼层
BngThea 发表于 2018-7-26 13:52
++是前置,先执行再求和

那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 14:00:32 | 显示全部楼层    本楼为最佳答案   
1.png
2.png
        int i = 5, j = 5, p, q;
01014D3E C7 45 F8 05 00 00 00 mov         dword ptr [i],5  
01014D45 C7 45 EC 05 00 00 00 mov         dword ptr [j],5  
        p = (i++) + (i++) + (i++);
01014D4C 8B 45 F8             mov         eax,dword ptr [i]  
01014D4F 03 45 F8             add         eax,dword ptr [i]  
01014D52 03 45 F8             add         eax,dword ptr [i]  
01014D55 89 45 E0             mov         dword ptr [p],eax  
01014D58 8B 4D F8             mov         ecx,dword ptr [i]  
01014D5B 83 C1 01             add         ecx,1  
01014D5E 89 4D F8             mov         dword ptr [i],ecx  
01014D61 8B 55 F8             mov         edx,dword ptr [i]  
01014D64 83 C2 01             add         edx,1  
01014D67 89 55 F8             mov         dword ptr [i],edx  
01014D6A 8B 45 F8             mov         eax,dword ptr [i]  
01014D6D 83 C0 01             add         eax,1  
01014D70 89 45 F8             mov         dword ptr [i],eax  
        q = (++j) + (++j) + (++j);
01014D73 8B 45 EC             mov         eax,dword ptr [j]  
01014D76 83 C0 01             add         eax,1  
01014D79 89 45 EC             mov         dword ptr [j],eax  
01014D7C 8B 4D EC             mov         ecx,dword ptr [j]  
01014D7F 83 C1 01             add         ecx,1  
01014D82 89 4D EC             mov         dword ptr [j],ecx  
01014D85 8B 55 EC             mov         edx,dword ptr [j]  
01014D88 83 C2 01             add         edx,1  
01014D8B 89 55 EC             mov         dword ptr [j],edx  
01014D8E 8B 45 EC             mov         eax,dword ptr [j]  
01014D91 03 45 EC             add         eax,dword ptr [j]  
01014D94 03 45 EC             add         eax,dword ptr [j]  
01014D97 89 45 D4             mov         dword ptr [q],eax  

也就是说,我的编译器是这样做的
p = i + i + i;
i += 1;
i += 1;
i += 1;

j += 1;
j += 1;
j += 1;
q = j + j + j;

3.png
#include <stdio.h>

int main(void)
{
        {
                int i = 5, j = 5, p, q;
                p = (i++) + (i++) + (i++);
                q = (++j) + (++j) + (++j);
                printf("%d,%d,%d,%d\n", i, j, p, q);
        }
        {
                int i = 5, j = 5, p, q;
                
                p = i + i + i;
                i += 1;
                i += 1;
                i += 1;

                j += 1;
                j += 1;
                j += 1;
                q = j + j + j;

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

        return 0;
}


#include <stdio.h>

int main(void)
{
        int i = 5, j = 5, p, q;
        p = (i++) + (i++) + (i++);
        q = (++j) + (++j) + (++j);
        printf("%d,%d,%d,%d", i, j, p, q);

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

使用道具 举报

发表于 2018-7-26 15:22:17 | 显示全部楼层
yxl015 发表于 2018-7-26 13:57
那样的话不应该是都先变成8在求和吗 新手问题多 麻烦了

就如6楼所示,每种编译器翻译的结果都可能不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 17:13:52 | 显示全部楼层
人造人 发表于 2018-7-26 14:00
也就是说,我的编译器是这样做的

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

使用道具 举报

 楼主| 发表于 2018-7-26 17:15:19 | 显示全部楼层
BngThea 发表于 2018-7-26 15:22
就如6楼所示,每种编译器翻译的结果都可能不同

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 02:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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