鱼C论坛

 找回密码
 立即注册
查看: 4331|回复: 10

q=(++j)+(++j)+(++j);问题

[复制链接]
发表于 2012-3-20 21:20:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ℡.xiao敏 于 2012-3-20 21:41 编辑

#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);
}

编译出来的结果j=8 怎么q=22啊?实在想不明白,后来我直接用q=(++j)+(++j)来测试,结果是q=14,j=7这好像才符合逻辑啊、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-20 21:23:01 | 显示全部楼层
q不是应该等于24吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-3-20 21:41:12 | 显示全部楼层
自己用反汇编看了下代码……

7:        q=(++j)+(++j)+(++j);
0040D73D   mov         ecx,dword ptr [ebp-8]
0040D740   add         ecx,1
0040D743   mov         dword ptr [ebp-8],ecx
0040D746   mov         edx,dword ptr [ebp-8]
0040D749   add         edx,1
0040D74C   mov         dword ptr [ebp-8],edx
0040D74F   mov         eax,dword ptr [ebp-8]
0040D752   add         eax,dword ptr [ebp-8]
0040D755   mov         ecx,dword ptr [ebp-8]
0040D758   add         ecx,1
0040D75B   mov         dword ptr [ebp-8],ecx
0040D75E   add         eax,dword ptr [ebp-8]
0040D761   mov         dword ptr [ebp-10h],eax

原来是第一个j和第二个j先自增1 2次之后相加了,再第三次自增1。。。这是vc的问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-7 00:00:59 | 显示全部楼层
我试过了,在visual studio 2010中运行是24.看了楼主的解释,豁然开朗啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-7 21:56:46 | 显示全部楼层
说实话,纠结这些东西都是没有意义的,这些都不是规范的书写方法,除非你的目的就是写别人看不懂的程序。否则,千万不要写这种语句,最好的方法是吧    ++语句 与 赋值语句 分开来写
++j;
q=j;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-15 11:37:22 | 显示全部楼层
我也是纠结这个问题....  想不通...:Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-15 21:23:00 | 显示全部楼层
换个编译器 也许就能看到你想看到的24了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-16 16:48:09 | 显示全部楼层
这个问题我也纠结着呢:Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-17 16:52:26 | 显示全部楼层
我感觉(++i )+( ++i )+ (++i)相当于
((++i)+(++i))+(++i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-3-19 23:59:34 | 显示全部楼层
℡.xiao敏 发表于 2012-3-20 21:23
q不是应该等于24吗

我为什么算的是21呢,大佬能说说吗?我想的是q=6+7+8=21,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 11:37:11 | 显示全部楼层
这个问题是因为部分编译器的内部的表达式是使用的前缀式计算,会将((++j)+(++j))先计算了,然后在计算+ (++j)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-13 20:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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