鱼C论坛

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

[已解决]++i的应用问题

[复制链接]
发表于 2020-6-18 21:37:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 一叶花落不留尘 于 2020-6-18 21:52 编辑

int i = 8;
printf("%d\n%d\n",++i,--i);
结果为什么是
8
8
求大神帮忙解释一下
还有
int i=8;
printf("%d\n%d\n",i++,--i);
输出的结果为什么是
7
8
最佳答案
2020-6-18 21:56:26
本帖最后由 Hello. 于 2020-6-18 21:58 编辑

输出结果与编译器有关
因为顺序是不定的
printf是从最后一个参数开始
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-18 21:48:58 | 显示全部楼层
Hello. 发表于 2020-6-18 21:47
先加1再减1所以不变啊

不应该是输出
9
8
不应该是这个结果吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 21:51:12 | 显示全部楼层

这个问题很复杂,你反汇编看一下就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-18 21:55:15 | 显示全部楼层
Hello. 发表于 2020-6-18 21:51
这个问题很复杂,你反汇编看一下就明白了

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

使用道具 举报

发表于 2020-6-18 21:56:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Hello. 于 2020-6-18 21:58 编辑

输出结果与编译器有关
因为顺序是不定的
printf是从最后一个参数开始
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-18 22:06:59 | 显示全部楼层
才疏学浅,在不反汇编的情况完全不理解。测试代码如下
char *test1() {
    char buf[1024] = {0};
    sprintf(buf, "%s", __FUNCTION__);
    printf("in function: %s\n", __FUNCTION__);
    return strdup(buf);
}

char *test2() {
    char buf[1024] = {0};
    sprintf(buf, "%s", __FUNCTION__);
    printf("in function: %s\n", __FUNCTION__);
    return strdup(buf);
}

void params_order() {
    printf("%s\n%s\n", test1(), test2());
    int i = 8;
    printf("%d\n%d\n", i++, i--);
    printf("i = %d\n", i);
    int j = ++i;
    printf("i = %d, j = %d\n", i, j);
    printf("%d-%d\n", i++, i++);
    printf("%d-%d\n", ++i, ++i);
}

输出为
in function: test2
in function: test1
test1
test2
7
8
i = 8
i = 9, j = 9
10-9
13-13


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

使用道具 举报

发表于 2020-6-18 22:39:30 | 显示全部楼层
彻底弄懂这个问题,你得看编译原理、计算机操作系统、……

但是这些不需要深入,你只需要记得,它是从左往右执行的就行了。以后还会遇到从右往左执行的,遇到再说。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 01:34:41 From FishC Mobile | 显示全部楼层
这个也不是这个阶段该思考的问题啊,这个阶段只要知道i++和++i之间的区别就好了,这种在同一个函数里对一个变量做两次运算实际情况可能也不怎么会遇到吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 03:19:48 | 显示全部楼层
不要在调用函数的时候在实参里用单目运算符,编译器不一样结果也会不一样的。
这是常识吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 09:14:15 | 显示全部楼层
我觉得这个是编译器的锅,不同的编译器处理的方式不一样,结果就不一样
比如我用的是vc6.0的编译器,处理printf("%d\n%d\n",i++,--i)结果是
7
7
首先处理的是 --i,然后在处理i++,它是一个从右到左执行的过程
那么 先看
--i,就是8-1=7,所以当执行完--i之后,这个i=7
然后接着是 i++
这个位置很特别,对于 printf而言,我只要看到i,我直接就返回了,我不考虑i++之后的结果,那是下一步考虑的事情,所以,在i++没执行前,i=7,printf接收后,直接返回了7了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-19 09:34:17 | 显示全部楼层
自己找规律啊。我换了不同的写法,测出了它的规律。但没鸟用。实际用不到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 15:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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