新人求教一道自增自减的题
#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
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算出j的值,因为++运算的优先级大于+的优先级,得到 j = 7,然后7+7=14,这时算是就变成了 14+(++j),14+8 = 22 q=(++j)+(++j)+(++j);
等价于:
q = ((++j) + (++j)) + (++j);
等价于
ans = (++j) + (++j); //这里,ans算出来为 7+7
q = ans + (++j); // 这里,q = 14 + 8
因为加加减减运算符放在标识符后面的话,下一条语句才生效。所以,i++,i-- 这些其实并不会影响到 i 当前打印的值。
而如果将加加减减运算符放在标识符前面的话,是即时生效的。又因为参数传递通常是自右向左依次入栈
这主要看编译器。不同的编译器结果可能不同
丶忘却的年少o 发表于 2017-10-25 09:35
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算 ...
怎么运算呢?能详细一点么?多谢!!! 微笑向暖~ 发表于 2017-10-28 20:30
怎么运算呢?能详细一点么?多谢!!!
你看楼上 版主 的反汇编,有具体的 丶忘却的年少o 发表于 2017-10-28 20:31
你看楼上 版主 的反汇编,有具体的
还是有点看不懂,我以前看过甲鱼老师的和这个有关的视频,,我找不到在哪了,汇编是刚学的,有点看不懂 BngThea 发表于 2017-10-25 09:56
q=(++j)+(++j)+(++j);
等价于:
q = ((++j) + (++j)) + (++j);
ans = (++j) + (++j); //这里,ans算出来为 7+7
这个为什么是是7+7呢?初始值 j=5,还是有点想不明白 微笑向暖~ 发表于 2017-10-28 20:58
ans = (++j) + (++j); //这里,ans算出来为 7+7
这个为什么是是7+7呢?初始值 j=5,还是有点想不明白
ans = (++j) + (++j);
因为++操作符先执行,所以j自增了两次变成了7 丶忘却的年少o 发表于 2017-10-25 09:35
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算 ...
首先,对不起,我把这个问题忘了,隔这么多天才回复。
22计算,这次真是学到了,感谢大佬
BngThea 发表于 2017-10-25 09:56
q=(++j)+(++j)+(++j);
等价于:
q = ((++j) + (++j)) + (++j);
楼下版主 的反汇编图片,运算是从右向左进行的,是8+(7+7),而不是(7+7)+8.
还有,抱歉,我把这个问题忘了,隔了这么多天才回复,抱歉 ba21 发表于 2017-10-25 10:20
因为加加减减运算符放在标识符后面的话,下一条语句才生效。所以,i++,i-- 这些其实并不会影响到 i 当前 ...
版主你好,你跟楼上一个人说的有一点一样,就是按照运算顺序是22结合算的,即8+(7+7)。
这个按照运算顺序22结合的特性适用于整个c语言的运算吗?
ps:抱歉,我把这个问题忘了,所以隔了这么多天才回复,抱歉 Chulainn 发表于 2017-11-5 18:15
楼下版主 的反汇编图片,运算是从右向左进行的,是8+(7+7),而不是(7+7)+8.
还有,抱歉,我把这个问题忘 ...
不同的编译器解释起来可能存在区别
所以不建议写这种代码
页:
[1]