一叶花落不留尘 发表于 2020-6-18 21:37:38

++i的应用问题

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

int i = 8;
printf("%d\n%d\n",++i,--i);
结果为什么是
8
8
求大神帮忙解释一下{:5_100:}
还有
int i=8;
printf("%d\n%d\n",i++,--i);
输出的结果为什么是
7
8

一叶花落不留尘 发表于 2020-6-18 21:48:58

Hello. 发表于 2020-6-18 21:47
先加1再减1所以不变啊

不应该是输出
9
8
不应该是这个结果吗

Hello. 发表于 2020-6-18 21:51:12

一叶花落不留尘 发表于 2020-6-18 21:48
不应该是输出
9
8


这个问题很复杂,你反汇编看一下就明白了

一叶花落不留尘 发表于 2020-6-18 21:55:15

Hello. 发表于 2020-6-18 21:51
这个问题很复杂,你反汇编看一下就明白了

这个不会。。。。。。

Hello. 发表于 2020-6-18 21:56:26

本帖最后由 Hello. 于 2020-6-18 21:58 编辑

输出结果与编译器有关
因为顺序是不定的
printf是从最后一个参数开始

赚小钱 发表于 2020-6-18 22:06:59

才疏学浅,在不反汇编的情况完全不理解。测试代码如下

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

char *test2() {
    char buf = {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


徐颖科 发表于 2020-6-18 22:39:30

彻底弄懂这个问题,你得看编译原理、计算机操作系统、……

但是这些不需要深入,你只需要记得,它是从左往右执行的就行了。以后还会遇到从右往左执行的,遇到再说。

WindRoa 发表于 2020-6-19 01:34:41

这个也不是这个阶段该思考的问题啊,这个阶段只要知道i++和++i之间的区别就好了,这种在同一个函数里对一个变量做两次运算实际情况可能也不怎么会遇到吧……

Darth_EF 发表于 2020-6-19 03:19:48

不要在调用函数的时候在实参里用单目运算符,编译器不一样结果也会不一样的。
这是常识吧?

4goodworld 发表于 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了

405794672 发表于 2020-6-19 09:34:17

自己找规律啊。我换了不同的写法,测出了它的规律。但没鸟用。实际用不到。
页: [1]
查看完整版本: ++i的应用问题