鱼C论坛

 找回密码
 立即注册
查看: 3164|回复: 11

新人求教,关于自增自减运算符

[复制链接]
发表于 2017-7-10 08:09:54 | 显示全部楼层 |阅读模式

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

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

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",p,q,i,j);
}
为什么q的结果是22呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-10 09:34:21 | 显示全部楼层
#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",p,q,i,j);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 10:37:18 | 显示全部楼层
本帖最后由 ba21 于 2017-7-10 14:41 编辑


不同的编译器运算结果有差别。总的而言要看运算的优先循序。

2017-07-10_103558.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-10 10:51:32 | 显示全部楼层
#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", p, q, i, j);

        return 0;
}
15,24,8,8请按任意键继续. . .

自己看吧
#include <stdio.h>

int main(void)
{
010C4010  xchg        ax,ax  
010C4012  push        ebp  
010C4013  mov         ebp,esp  
010C4015  sub         esp,0F0h  
010C401B  push        ebx  
010C401C  push        esi  
010C401D  push        edi  
010C401E  lea         edi,[ebp-0F0h]  
010C4024  mov         ecx,3Ch  
010C4029  mov         eax,0CCCCCCCCh  
010C402E  rep stos    dword ptr es:[edi]  
        int i = 5, j = 5, p, q;
010C4030  mov         dword ptr [i],5  
010C4037  mov         dword ptr [j],5  
        
        p = (i++) + (i++) + (i++);
010C403E  mov         eax,dword ptr [i]  
010C4041  add         eax,dword ptr [i]  
010C4044  add         eax,dword ptr [i]  
010C4047  mov         dword ptr [p],eax  
010C404A  mov         ecx,dword ptr [i]  
010C404D  add         ecx,1  
010C4050  mov         dword ptr [i],ecx  
010C4053  mov         edx,dword ptr [i]  
010C4056  add         edx,1  
010C4059  mov         dword ptr [i],edx  
010C405C  mov         eax,dword ptr [i]  
010C405F  add         eax,1  
010C4062  mov         dword ptr [i],eax  
        q = (++j) + (++j) + (++j);
010C4065  mov         eax,dword ptr [j]  
010C4068  add         eax,1  
010C406B  mov         dword ptr [j],eax  
010C406E  mov         ecx,dword ptr [j]  
010C4071  add         ecx,1  
010C4074  mov         dword ptr [j],ecx  
010C4077  mov         edx,dword ptr [j]  
010C407A  add         edx,1  
010C407D  mov         dword ptr [j],edx  
010C4080  mov         eax,dword ptr [j]  
010C4083  add         eax,dword ptr [j]  
010C4086  add         eax,dword ptr [j]  
010C4089  mov         dword ptr [q],eax  
        printf("%d,%d,%d,%d", p, q, i, j);
010C408C  mov         eax,dword ptr [j]  
010C408F  push        eax  
010C4090  mov         ecx,dword ptr [i]  
010C4093  push        ecx  
010C4094  mov         edx,dword ptr [q]  
010C4097  push        edx  
010C4098  mov         eax,dword ptr [p]  
010C409B  push        eax  
010C409C  push        offset string "%d,%d,%d,%d" (010C6BCCh)  
010C40A1  call        _printf (010C1361h)  
010C40A6  add         esp,14h  

        return 0;
010C40A9  xor         eax,eax  
}
010C40AB  pop         edi  
}
010C40AC  pop         esi  
010C40AD  pop         ebx  
010C40AE  add         esp,0F0h  
010C40B4  cmp         ebp,esp  
010C40B6  call        __RTC_CheckEsp (010C1118h)  
010C40BB  mov         esp,ebp  
010C40BD  pop         ebp  
010C40BE  ret  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 12:43:19 | 显示全部楼层

vc++ 6.0
2017-07-10_124151.png

8:            q = (++j) + (++j) + (++j);
0040105D   mov         ecx,dword ptr [ebp-8]
00401060   add         ecx,1
00401063   mov         dword ptr [ebp-8],ecx
00401066   mov         edx,dword ptr [ebp-8]
00401069   add         edx,1
0040106C   mov         dword ptr [ebp-8],edx
0040106F   mov         eax,dword ptr [ebp-8]
00401072   add         eax,dword ptr [ebp-8]
00401075   mov         ecx,dword ptr [ebp-8]
00401078   add         ecx,1
0040107B   mov         dword ptr [ebp-8],ecx
0040107E   add         eax,dword ptr [ebp-8]
00401081   mov         dword ptr [ebp-10h],eax
9:            printf("%d,%d,%d,%d", p, q, i, j);
00401084   mov         edx,dword ptr [ebp-8]
00401087   push        edx
00401088   mov         eax,dword ptr [ebp-4]
0040108B   push        eax
0040108C   mov         ecx,dword ptr [ebp-10h]
0040108F   push        ecx
00401090   mov         edx,dword ptr [ebp-0Ch]
00401093   push        edx
00401094   push        offset string "%d,%d" (0042201c)
00401099   call        printf (004010e0)
0040109E   add         esp,14h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 13:10:16 | 显示全部楼层

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

使用道具 举报

发表于 2017-7-10 13:31:11 | 显示全部楼层

你得到的是24 ; 我这是22 不应该呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-10 14:09:35 | 显示全部楼层
ba21 发表于 2017-7-10 13:31
你得到的是24 ; 我这是22 不应该呀。

正常
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-10 14:25:52 | 显示全部楼层
不建议用这种“折磨人”的写法,语义不明,除了考试毫无用处
更重要的是,不同编译器的翻译也有区别,导致其计算结果存在区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-16 22:20:32 | 显示全部楼层

谢谢啦~貌似这是编译器的求值顺序问题。。它只能保证j最终是8来的。还有汇编语句看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-16 22:21:23 | 显示全部楼层
ba21 发表于 2017-7-10 10:37
不同的编译器运算结果有差别。总的而言要看运算的优先循序。

恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-16 22:23:09 | 显示全部楼层
沧海雨季 发表于 2017-7-16 22:21
恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。

按教课老师说的来咯。不过差不多也就2种情况。
你可以在各种编译器上都试下什么结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 10:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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