Chulainn 发表于 2017-10-25 08:52:20

新人求教一道自增自减的题

#include <stdio.h>
void main()
{
        int i=5,j=5,k=5,l=5,p,q,w,e;
        p=(i++)+(i++)+(i++);
        q=(++j)+(++j)+(++j);
        w=k++ + k++ + k++;
        e=++l + ++l + ++l;
        printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",p,q,w,e,i,j,k,l);
}


求教为什么q是22?而不是21

丶忘却的年少o 发表于 2017-10-25 09:35:51

7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算出j的值,因为++运算的优先级大于+的优先级,得到 j = 7,然后7+7=14,这时算是就变成了 14+(++j),14+8 = 22

BngThea 发表于 2017-10-25 09:56:41

q=(++j)+(++j)+(++j);
等价于:
q = ((++j) + (++j)) + (++j);
等价于
ans = (++j) + (++j); //这里,ans算出来为 7+7
q = ans + (++j); // 这里,q = 14 + 8

ba21 发表于 2017-10-25 10:20:53


因为加加减减运算符放在标识符后面的话,下一条语句才生效。所以,i++,i-- 这些其实并不会影响到 i 当前打印的值。

而如果将加加减减运算符放在标识符前面的话,是即时生效的。又因为参数传递通常是自右向左依次入栈

这主要看编译器。不同的编译器结果可能不同



微笑向暖~ 发表于 2017-10-28 20:30:14

丶忘却的年少o 发表于 2017-10-25 09:35
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算 ...

怎么运算呢?能详细一点么?多谢!!!

丶忘却的年少o 发表于 2017-10-28 20:31:06

微笑向暖~ 发表于 2017-10-28 20:30
怎么运算呢?能详细一点么?多谢!!!

你看楼上 版主 的反汇编,有具体的

微笑向暖~ 发表于 2017-10-28 20:35:36

丶忘却的年少o 发表于 2017-10-28 20:31
你看楼上 版主 的反汇编,有具体的

还是有点看不懂,我以前看过甲鱼老师的和这个有关的视频,,我找不到在哪了,汇编是刚学的,有点看不懂

微笑向暖~ 发表于 2017-10-28 20:58:02

BngThea 发表于 2017-10-25 09:56
q=(++j)+(++j)+(++j);
等价于:
q = ((++j) + (++j)) + (++j);


ans = (++j) + (++j); //这里,ans算出来为 7+7

这个为什么是是7+7呢?初始值 j=5,还是有点想不明白

BngThea 发表于 2017-10-28 21:26:26

微笑向暖~ 发表于 2017-10-28 20:58
ans = (++j) + (++j); //这里,ans算出来为 7+7

这个为什么是是7+7呢?初始值 j=5,还是有点想不明白

ans = (++j) + (++j);
因为++操作符先执行,所以j自增了两次变成了7

Chulainn 发表于 2017-11-5 18:13:07

丶忘却的年少o 发表于 2017-10-25 09:35
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算 ...

首先,对不起,我把这个问题忘了,隔这么多天才回复。
22计算,这次真是学到了,感谢大佬

Chulainn 发表于 2017-11-5 18:15:12

BngThea 发表于 2017-10-25 09:56
q=(++j)+(++j)+(++j);
等价于:
q = ((++j) + (++j)) + (++j);


楼下版主 的反汇编图片,运算是从右向左进行的,是8+(7+7),而不是(7+7)+8.
还有,抱歉,我把这个问题忘了,隔了这么多天才回复,抱歉

Chulainn 发表于 2017-11-5 18:17:44

ba21 发表于 2017-10-25 10:20
因为加加减减运算符放在标识符后面的话,下一条语句才生效。所以,i++,i-- 这些其实并不会影响到 i 当前 ...

版主你好,你跟楼上一个人说的有一点一样,就是按照运算顺序是22结合算的,即8+(7+7)。
这个按照运算顺序22结合的特性适用于整个c语言的运算吗?
ps:抱歉,我把这个问题忘了,所以隔了这么多天才回复,抱歉

BngThea 发表于 2017-11-5 18:25:27

Chulainn 发表于 2017-11-5 18:15
楼下版主 的反汇编图片,运算是从右向左进行的,是8+(7+7),而不是(7+7)+8.
还有,抱歉,我把这个问题忘 ...

不同的编译器解释起来可能存在区别
所以不建议写这种代码
页: [1]
查看完整版本: 新人求教一道自增自减的题