首页 > 其他分享 >彻底搞定++i与i++的区别

彻底搞定++i与i++的区别

时间:2024-02-13 22:00:54浏览次数:29  
标签:搞定 变量 彻底 区别 ++ 代码 mov int

i++与++i单独用时的效果是一模一样的,但是如果突然要你说他们俩的区别,你又能不能回答上来呢?这篇博文,我们就完全弄懂他们俩兄弟的区别!

基本概念

i++和++i要是单独使用的话效果是一样的,都是i=i+1,实验证明:
i++ 代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int i = 0;
    i++;
    cout << i;
    return 0;
}

i++ 运行结果:

1

++i 代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int i = 0;
    ++i;
    cout << i;
    return 0;
}

++i 运行结果:

1

区别

方法1:测试

我们假设一个变量是a,那么a=i++与a=++i的运行结果就不太一样了,我们分别说明
i++:
i++其实就是先干活后吃饭,这里的干活就是指被赋值到变量a的上面,吃饭就是自增1
++i:
++i和i++相反,即先吃饭后干活,先执行的是i=i+1,再被赋值到变量a中
这里给大家准备了一个比较好理解的图片:

我们依然以一个实验来证明:
代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int i = 3;
	cout << "This is i++:\n";
	int a1 = i++;
	cout << "i:" << i << " a:" << a1 << "\n";
	cout << "This is ++i:\n";
	i = 3;
	int a2 = ++i;
	cout << "i:" << i << " a:" << a2 << "\n";  
	return 0;
} 

运行结果:

This is i++:
i:4 a:3
This is ++i:
i:4 a:4

方法2:看汇编代码

汇编代码这里就不给大家截图了,大家可以自己去试一试
i++先是3次mov(移动),然后才add(增加),最后再来一次mov,而++i先1次mov,接着直接自增,最后再3次mov

效率

之前我做过一个实验,也就是看控制台下方的时间,结果就是++i比i++要稍快一些,但是这两段代码的区别不大,要是极度追求效率,推荐++i
那么这是为什么呢?
回到他们俩之间的区别,a = i++时a为3,其实这个3在一些人的理解中并不是原先的i,而是i++时生成的一个临时变量,这个临时变量的生成拖延了i++的时间,而++i就是直接干脆利落的i+=1,并没有其他什么麻烦的操作
这个结论在基本编程中没有太多应用,但是在自定义类型中,应该尽量使用快一点的++i

标签:搞定,变量,彻底,区别,++,代码,mov,int
From: https://www.cnblogs.com/charzie-blog/p/18014874

相关文章

  • C++——编译和链接原理笔记
    我们在学习和开发C++程序中,理解编译和链接的原理至关重要。下面将学习一下C++程序是如何从源代码转换为可执行文件的过程,并结合示例代码进行说明。也是为了解开自己在刚学习C++的时候,编译时间长的疑惑。为了不让自己的学习之路这么枯燥,我按照一个正常的开发流程梳理一下......
  • c++定义类的时候,只提供拷贝构造函数而不提供默认(无参)构造函数和有参构造函数会怎样?
    4.2.4构造函数调用规则默认情况下,c++编译器至少给一个类添加三个函数:默认构造函数(无参,函数体为空)默认析构函数(无参,函数体为空)默认拷贝构造函数(对属性进行值拷贝)构造函数调用规则:如果用户定义有参构造函数,编译器不会提供默认(无参)构造,但是会提供默认拷贝构造函数如果用户......
  • C++——异常处理模块笔记
    异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况。异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误、访问无效内存等。C++提供了一套异常处理机制,使得程序可以优雅地处理这些异常,提高程序的可靠性和健壮性。异常是一种程序......
  • 【C++】两两交换链表中的节点
    #include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};ListNode*swapPairs1(ListNode*head){ListNode*dummyHead=newListNode(0);dummyHead......
  • 【C++】给定两个增序的链表,试将其合并成一个增序的链表。
    给定两个增序的链表,试将其合并成一个增序的链表。#include<iostream>#include<stack>usingnamespacestd;structListNode{intval;ListNode*next;ListNode(intx):val(x),next(nullptr){}};voidprintList(ListNode*head){while(head){std:......
  • 【C++】假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
    题目:假设链表中每一个节点的值都在0-9之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。数据范围:0≤n,m≤1000000,链表任意值0≤val≤9要求:空间复杂度O(n),时间复杂度O(n)例如:链表1为9->3->7,链表2为6->3,最后生成新的结果链表......
  • 6个步骤搞定云原生应用监控和告警(建议收藏)
    云原生系统搭建完毕之后,要建立可观测性和告警,有利于了解整个系统的运行状况。基于Prometheus搭建的云原生监控和告警是业内常用解决方案,每个云原生参与者都需要了解。本文主要以springboot应用为例,讲解云原生应用监控和告警的实操,对于理论知识讲解不多。等朋友们把实操都理顺之后......
  • C++11 用户定义字面量
    C++11用户定义字面量C++11引入了一项功能,称为用户自定义字面量(user-definedliterals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。内置字面量C++自带4种字面量:整形123浮点型12.3字符'1'字符串"123"字面量又可添加后缀来表明具体类型,建议大写:无符......
  • 【C++】STL string类例题新思路记录(编写一个程序,告诉用户输入的句子包含多少个元音字
    题干:编写一个程序,告诉用户输入的句子包含多少个元音字母。 方案一:1、创建一个普通函数,依次传入5个元音字母对查找字符串进行检测。2、函数通过依次传入的单个元音字母,循环查找整个字符串最后返回统计值。1#include<string>2#include<iostream>3usingnamespace......
  • C++Primer
    前言固然,轻薄短小的书籍乍见之下让所有读者心情轻松,但如果舍弃太多应该深入的地方不谈,也难免令人行止失据,进退两难。……作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度。起步固然可从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只......