VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 532|回复: 6

[已解决]自增运算

[复制链接]
71_avatar_middle
最佳答案
0 
在线会员 发表于 2021-10-15 09:43:26 | 显示全部楼层 |阅读模式
int        i=3,j=3,a,b;
a=(i++)+(i++)+(i++);
b=(j++)+(j++)+(j++);
有没有人给我讲解一下这种是怎么运算的?
最佳答案
00_avatar_small
2021-10-15 11:08:12
本帖最后由 tk3184020 于 2021-10-15 11:18 编辑

首先是 j++ ,是取完值再加1,如果按照正常人类的思维方式来计算,从左到右

1. i++这次取到的值应该是3,然后式子变成 3+(i++)+......。这个时候+的应该是4,因为上一步已经加1了,但是是i++所以要先取值再加1
2. 以此类推,它实际上最后的式子应该是   a = 3 + 4 + 5;
这是按照正常人类思维来的


================================================
(简述,你要是真的想自己看,那就去反汇编吧,一目了然,简单学一下OD,做个实验)
他的具体运行机制就涉及到编译器的问题了,我的编译器 a b最后都得12得看它压栈的顺序。

C/C++代码,最后都要编译成01汇编机器码,然后给CPU运行,这个时候就有一个东西叫栈。

(了解栈这段可以不看)
栈你可以简单理解为一个数组,它只有一端能取到值,也就是说a[10],只能取到a9的值,,a9取出来之后就只能取到a8的值,永远取最顶部的值。

栈是先进后出的,只有一个出口,你可以把栈想象成一个管子,这个管子每次只能放入一个与管子直径一样大的带编号的小球,这样你放进第一个放进去的小球要最后才能取出来。
================================================

这里的i++就是这样的,它会压栈处理,也就是说自增1的相关操作(此处简述)会压进栈里面,按照从左到右(具体看什么编译器,什么编译规则,我的这个就是从左到右了)依次压进去,最后的栈就是这样的(部分)
a = (i++) + (i++) + (i++);
栈:
i++    ——   他是最右面的
i++    ——   他是中间的
i++    ——   他是最左面的

那么在计算的时候,出栈的顺序就应该是 最右面的先出来,最左面的i++最后出来,这样形成了一个和人类思维相反的计算顺序

这个时候你的式子应该是  a = 5 + 4 + 3,这个demo结果都一样了,有些式子,这两种不同的运算顺序就不一样了


================================================
最后就是烂好人环节:
看你这个问题应该是初学者,如果是应付考试,那就不要在乎这里的得失了,把结果背下来(多背几个),就可以去考试了

如果是自己真的想研究研究,那么建议直接去学反汇编,学学汇编代码,先从x86指令集开始慢慢学

如果是真实开发,那就不要写这样人机差异的代码,我们懂了,计算机并不懂0.0




上一篇:VS2019使用URLDownloadToFile函数为什么下载不了?
下一篇:edit编辑框控件
00_avatar_middle
最佳答案
9 
在线会员 发表于 2021-10-15 11:08:12 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 tk3184020 于 2021-10-15 11:18 编辑

首先是 j++ ,是取完值再加1,如果按照正常人类的思维方式来计算,从左到右

1. i++这次取到的值应该是3,然后式子变成 3+(i++)+......。这个时候+的应该是4,因为上一步已经加1了,但是是i++所以要先取值再加1
2. 以此类推,它实际上最后的式子应该是   a = 3 + 4 + 5;
这是按照正常人类思维来的


================================================
(简述,你要是真的想自己看,那就去反汇编吧,一目了然,简单学一下OD,做个实验)
他的具体运行机制就涉及到编译器的问题了,我的编译器 a b最后都得12得看它压栈的顺序。

C/C++代码,最后都要编译成01汇编机器码,然后给CPU运行,这个时候就有一个东西叫栈。

(了解栈这段可以不看)
栈你可以简单理解为一个数组,它只有一端能取到值,也就是说a[10],只能取到a9的值,,a9取出来之后就只能取到a8的值,永远取最顶部的值。

栈是先进后出的,只有一个出口,你可以把栈想象成一个管子,这个管子每次只能放入一个与管子直径一样大的带编号的小球,这样你放进第一个放进去的小球要最后才能取出来。
================================================

这里的i++就是这样的,它会压栈处理,也就是说自增1的相关操作(此处简述)会压进栈里面,按照从左到右(具体看什么编译器,什么编译规则,我的这个就是从左到右了)依次压进去,最后的栈就是这样的(部分)
a = (i++) + (i++) + (i++);
栈:
i++    ——   他是最右面的
i++    ——   他是中间的
i++    ——   他是最左面的

那么在计算的时候,出栈的顺序就应该是 最右面的先出来,最左面的i++最后出来,这样形成了一个和人类思维相反的计算顺序

这个时候你的式子应该是  a = 5 + 4 + 3,这个demo结果都一样了,有些式子,这两种不同的运算顺序就不一样了


================================================
最后就是烂好人环节:
看你这个问题应该是初学者,如果是应付考试,那就不要在乎这里的得失了,把结果背下来(多背几个),就可以去考试了

如果是自己真的想研究研究,那么建议直接去学反汇编,学学汇编代码,先从x86指令集开始慢慢学

如果是真实开发,那就不要写这样人机差异的代码,我们懂了,计算机并不懂0.0

评分

参与人数 1热心值 +3 收起 理由
75_avatar_small wl1383838438 + 3 赞一个!

查看全部评分

07_avatar_middle
最佳答案
8 
在线会员 发表于 2021-10-15 11:36:24 | 显示全部楼层
工作中写这种代码,会不会被后面维护的人问候祖宗18代。。。。

技术上看起来一行代码干了很多事,
但这样写可读性太差了,对后面接手的人技术水平要求太高。。。
71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-10-15 23:19:03 | 显示全部楼层
谢谢大佬讲解,刚学到这块,好奇问一下
98_avatar_middle
最佳答案
0 
在线会员 发表于 2021-10-17 09:38:21 | 显示全部楼层
谢谢讲解,平易近人,易懂
35_avatar_middle
最佳答案
0 
在线会员 发表于 2021-10-18 22:48:10 | 显示全部楼层
我是不敢这样写,明天认真看一下。
13_avatar_middle
最佳答案
0 
在线会员 发表于 2021-10-23 09:05:34 来自手机 | 显示全部楼层
#include<iostream>
using namespace std;

int main()
{
    int i=3,j=3,a,b;
    a=(i++)+(i++)+(i++);
    b=(++j)+(++j)+(++j);
    cout <<a<< endl;
    cout <<b<< endl;
}

我试了下这段,发现结果a是12,b是16  这个b是16怎么来的又搞不明白了,就算是4+5+6,不也应该是15吗
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-11-30 02:14

Powered by CcTry.CoM

© 2009-2021 cctry.com

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