++i和i++ 以及其底层实现

【程序设计】i++++i的底层汇编分析 阅读详情

有这么一个题目:

#include <iostream>
using namespace std;

int main()
{
	int i = 100;
	i += (i++);
	cout << i << endl;

	i = 100;
	i += (++i);
	cout << i << endl;

	return 0;
}


输出结果是什么?

 

这个题目主要是考察i++和++i的区别,之前一直被这类问题困扰,一直搞不清楚这2个的区别,直到有一天看到这么一份资料:

	//i++实现 最后虽然本身值改变了,但返回的是之前的值
	int nTemp;
	nTemp = i;
	i = i+1;
	return nTemp;


 

	//++i实现 最后本身值改变了,返回也是值本身
	i = i+1;
	return i;

于是,i += (i++);可以这样理解:

	i += i;	//100+100 = 200
	i += 1;	//200+1 = 201

i += (++i);可以这样理解:

	i += 1;	//100+1 = 101
	i += i;	//101+101 = 202


所以,输出的结果是:

201

202


 


 

 

【C++语言】彻底搞懂++ii++ 目录 1 概念 2 前缀递增示例 2.1 示例代码 2.2 解题思路 3 后缀递增示例 3.1 示例代码 3.2 解题思路 4 混合表达式示例 4.1 示例代码 4.2 解题思路 1 概念 ++是单目运算符:++i是前缀递增,先参与表达式运算,然后再自增;i++是后缀递增,表示先进行递增,然后再参与表达式运算。 2 前缀递增示例 2.1 示例代码 #include<iostream> using namespace std; int main(int arg. 阅读详情

相关推荐

allegro转AD-(附工具)

本文介绍了将Allegro的.brd文件转换为Altium Designer可用的.alg文件的操作流程。首先需要下载专用转换工具,然后通过运行.bat脚本将.brd文件转换为.alg格式。最后在Altium Designer中使用导入向导完成文件转换,生成可用的PCB设计文件。整个过程简单快捷,只需三个步骤即可实现Allegro到Altium Designer的工程文件转换。

weixin_50120208的博客 1555

【汇编 C】i++++i底层刨析

不过++ii输出的是+1之后的变量,而ii++输出的则是+1之前备份的临时变量。代码的逻辑很简单,简单到没有逻辑。都是先+1,然后再输出。

qq_52572621的博客 1046

Visual Studio 2013 + Intel(R) Visual Fortran 安装教程

安装了好几遍,ivf都不能加载到vs中,中途放弃了vs,又改用codeblocks编译器,依然在写fortran的时候出现了各种问题,于是又放弃了codeblocks改回vs,总之是折腾了好久,终于装明白了ivf并且将fortran模板成功加载到vs中。 PS:一定要安装Intel Visual Fortran.Composer XE.2013-SP1,不要用Intel Visual Fortr...

Coco_wjy的博客 12万+

【计算机系统】微妙的 i++++i——底层实现,原理应用for循环,i赋值

微妙的 i++++i——底层实现,原理应用for循环,i赋值 区别: i++ 返回的值是新建的一个临时的tmp值,保存的是i增加前的值, 实际的i值已经被改变了,任何类似*(i++)的操作都会报错,因为i++创建的这个临时值,很快(快到你刚刚获取到i的值)就会被内存删掉,取地址将会导致非法内存引用。 ++i 返回 的值是i本身取地址后增加的值,所以会比i++返回的值大1。 int i = 0; int *p1 = &(++i); //正确 int *p2 = &(i++); //错误

清凌的博客 1905

显微镜下的 i++++i

注意,以下讨论的语言是 Java这个问题被网上的好多文章写烂了,但基本重复度很高,我看过后的感觉是,大部分都是错误的、误导读者的。随便百度一下,我们打开第一条。上来先说个结论i++ 先赋...

程序员吴师兄的博客 1169

关于i++底层实现原理

大家都知道i++在做运算的时候,是先赋值再自加1,但底层究竟是怎样实现的呢?下面,就三个例子来说明一下i++底层实现原理。 第一个例子: public class Test1{ public static void main(String [] args){ int i = 10; i = i++; System.out.println(i); } }程序输出为

zhangpeng759的专栏 6877

i++++i底层原理实现

1.1、i++ int i=0; for(int j=0;i<50;j++){ i=i++; } ------编译后指令------- //通过:javap 类名.class 反解析 iload_0 将局部变量表slot=0的变量(i),加载到操作数栈上 iinc 对局部变量表slot=0的变量(i)直接加1,但是操作数栈还是0 istore_o 将栈顶元素出栈赋值给局部变量表slot=0的变量。 //此时,局部变量i又被赋值为0 1.2、++i ii...

qq_37922915的博客 413

【秒懂i++运算】关于i++底层实现原理

在编程学习中,好多人对于i++++i非常得混乱,这里可能有人会说那有什么难的,i++是先用后自增,++i是先自增后调用,是的没错,既然那么自信,请往下阅读吧! 既然都知道i++在做运算的时候,是先赋值再自加1,但底层究竟是怎样实现的呢? 问题1: public class test1 { public static void main(String[] args) { int i=5; i=i++; System.out.println(i); .

A-Itfuture的博客 1869

为什么i++不能作为左值

今天Mayuyu带大家一起来搞清楚i++++i的区别。或许你在C++编程中经常使用它们,但是却不知道它们背后的原 理。同样Mayuyu也不知道,那么今天很有必要搞清楚它们。现在就让Mayuyu带领大家一起学习吧。。。   首先,说到i++++i的区别,那么就先要了解它们的底层实现细节。下面是它们的实现代码   对于i++是 int tmp; tmp = i; i =

渡辺麻友 1986

CAS是什么?AtomicInteger为什么使用CAS? AtomicInteger的底层原理是什么?

1、CAS 即 Compare -And- Swap 比较并交换; 2、 通过AtomicInteger.compareAndSet();方法能够解决多线程模式下i++计算结果出现的数据不一致的问题。 /** * @program: mybatis * @description: CAS * @author: Miller.FAN * @create: 2019-11-11 ...

weixin_41670928的博客 539

i++++i的真正区别详解

在解释这两个运算之前,先引入局部变量表操作数栈。 i++的通俗的解释即是先赋值再自增,其实这里赋值的值是从操作数栈取的值,也就是说先将i的值压入栈中, 而自增是局部变量表的值自增。 而++i则相反,是先自增后赋值,就是局部变量表的自增,然后把局部变量表的值压入栈中。 现在我们用一道经典题来从底层原理解释这两个运算操作 public static void mian(string[] ar...

wenchang-的博客 6万+

图解i++++i,从底层搞懂它们的原理

今天突然看到一个题,是有关于 i++++i,对于他们的结果一直以来只是记住口诀,并不知道原理,使用起来也不那么顺畅。 i++:先取值,后计算 ++i:先计算,后取值 若当题目仅仅是 i = i++;时,自己能迅速求出结果,但要是题目是 i = i + ++i + i++;的时候就有点头疼了,还很可能会搞错。 到底++计算过程是怎么样的呢,我于是就好奇了,到底他们是怎么实现的呢,今天就将它们的原理说一下。 图解i++++i,从底层搞懂它们的原理几个相关的考题i ++++ i最终考题 几个相关的考题

尼尧Nier的博客 4784

C++中的i++++i的区别

i++++i主要有两方面的区别:一、是赋值顺序上;二、是效率上 一、赋值顺序 在赋值上: i++ 是先赋值,再进行++操作。 ++i 是先进行++操作,再执行赋值操作。 具体实例如下 int i = 0, j = 0, k = 0; k = i++; // 此时 k=0,i=1。后置版本得到递增之前的值 k = ++j; // 此时 k=1,i=1。前置版本得到递增之后的值 二、...

Jeffxu_lib的博客 3708

Java ++i 与 i++ 底层原理

本文详细解析了Java字节码中局部变量表操作数栈的工作原理。通过具体示例演示了i++++i操作的字节码执行差异:i++先取值后自增,++i先自增后取值。重点分析了复合表达式i+++i++i+++++i的字节码执行过程,展示了操作数栈的动态变化。其中i+++i++结果为3(i=3),i+++++i结果为8(i=5)。文章采用字节码指令逐步解析的方式,直观呈现了变量自增运算在JVM层面的实现机制。

叉烧钵钵鸡的博客 1277

JVM解释i++++i底层区别

一个程序解释i++++i前言代码实现字节码指令解释以上运行结果第一类问题总结第二类问题第三类问题第四类问题 前言 如果只用普通的知识解释i++++i的话 i++ 先将i赋值再++ ==i 先++再赋值 但是这简单的回答并不能入吸引面试官的眼球,如果用java字节码指令分析则效果完全不同 代码实现 /** * @author wxy * @create 2020 下午 10:25 */ public class OperandStackTest { /** 程序员面试过程中, 常见的i++

wxyBlog 1303

C#中i++++i的底层原理

我们都知道,i++是先取值,后计算。++i是先计算,后取值。下面说下它的底层原理i++先入栈再+1,++i先+1再入栈。

L的博客 1707

C++复习整理---i++++i

理论上++i更快,实际与编译器优化有关,通常几乎无差别。 //i++实现代码为: int operator++(int) { int temp = *this; ++*this; re

DannieG的博客 1273

【Java】i++++i的不同,从底层效率上比较

以前书本、视频网站上但到i++++i的区别,都是简单,两句话。 i++,先运算,后赋值 ++i,先赋值,后运算 举个例子:(Java语言) int i = 1; System.out.print(i++); int j = 1;//为了明显区分,这里再声明一个j System.out.print(++j); 答案分别是12;i++++i不能查源码,我可能一辈子

大船 4790

【c++】语言基础:++i & i++底层区别

++i i++底层区别 ++i,是先取 i 的地址,增加它的内容 ,然后把值放到寄存器中 i++,是先取 i 的地址,把它的值装入寄存器,然后增加内存中 i 的值 关于 ++i 是左值,而 i++ 是右值的问题 ++i,返回值是 i 本身自己,是一个变量 i++,返回值是 i 之前的一个数值,是一个数,不是变量 因此 ++(i++) 这就是错误的,因为 i++ 返回的是右值,而不能 ++右值。

二十三小时 1682

C++中的自增运算符:++i i++

C++中的自增运算符:++i i++在C++编程中,自增运算符是一种常用的操作符。其中 ++i i++ 就是两种不同的自增运算符。

qq_37934722的博客 2933

PyAudio-0.2.11-cp311-cp311-win_amd64.whl.rar

python whl离线安装包pip安装失败可以尝试使用whl离线安装包安装第一步 下载whl文件,注意需要与python版本配套python版本号、32位64位、arm或amd64均有区别第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径WHL文件是以Wheel格式保存的Python安装包,Wheel是Python发行版的标准内置包格式。在本质上是一个压缩包,WHL文件中包含了Python安装的py文件元数据,以及经过编译的pyd文件,这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。为什么会用到whl文件来安装python库文件呢?在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包,大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

上一篇: gethostbyname出错 获取错误描述 Host name lookup failure
下一篇: TCHAR、WCHAR、CHAR以及WideCharToMultiByte、MultiByteToWideChar
胡老哈
博客等级 码龄16年 50粉丝 130原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值