鱼C论坛

 找回密码
 立即注册
查看: 2939|回复: 12

[已解决]新人求教一道自增自减的题

[复制链接]
发表于 2017-10-25 08:52:20 | 显示全部楼层 |阅读模式

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

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

x
#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
最佳答案
2017-10-25 10:20:53

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

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

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


2017-10-25_101844.png

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

使用道具 举报

发表于 2017-10-25 09:35:51 | 显示全部楼层
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算出j的值,因为++运算的优先级大于+的优先级,得到 j = 7,然后7+7=14,这时算是就变成了 14+(++j),14+8 = 22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-25 10:20:53 | 显示全部楼层    本楼为最佳答案   

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

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

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


2017-10-25_101844.png

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

使用道具 举报

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

怎么运算呢?能详细一点么?多谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 20:31:06 | 显示全部楼层
微笑向暖~ 发表于 2017-10-28 20:30
怎么运算呢?能详细一点么?多谢!!!

你看楼上 版主 的反汇编,有具体的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 20:35:36 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-28 20:31
你看楼上 版主 的反汇编,有具体的

还是有点看不懂,我以前看过甲鱼老师的和这个有关的视频,,我找不到在哪了,汇编是刚学的,有点看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,还是有点想不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-5 18:13:07 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-25 09:35
7+7+8 = 22。
计算机不会三个元素一起运算,是两两运算完再去运算别的。根据两两原则,两个++j先自己运算 ...

首先,对不起,我把这个问题忘了,隔这么多天才回复。
22计算,这次真是学到了,感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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.
还有,抱歉,我把这个问题忘了,隔了这么多天才回复,抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

版主你好,你跟楼上一个人说的有一点一样,就是按照运算顺序是22结合算的,即8+(7+7)。
这个按照运算顺序22结合的特性适用于整个c语言的运算吗?
ps:抱歉,我把这个问题忘了,所以隔了这么多天才回复,抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不同的编译器解释起来可能存在区别
所以不建议写这种代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 20:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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