`

++i和i++

 
阅读更多

记得刚开始学编程的时候还是从c语言开始的,还是看的谭浩强写的那本书,上面对介绍i++和++i的区别如下:
i++是先赋值,然后再自增;++i是先自增,后赋值。
用代码表示就是:
若 a = i++; 则等价于 a=i;i=i+1;
而 a = ++i; 则等价于 i=i+1;a=i;

那么事实真是这样么,只是曾经我深信不疑,但是直到我看到下面这段代码:

 @Test
  public void test(){
      int i = 0;
      i=i++;
      System.out.println(i);
  }

如果按原先定义,就应该是i=i;i=i+1; 那么结果就应该是1;但是很遗憾结果是0;所以得知原先定义有误,至少是不准确的。

那么真实的机制是怎么样的呢?我简单用代码模拟如下真实流程:
   int i;

   @Test
   public void testAddI() {
       i = 0;
       i = lastAdd();
       System.out.println(i);
       i = 0;
       i = firstAdd();
       System.out.println(i);
   }


   //模拟i++的机制
   public int lastAdd() {
       //操作i前对其值保留副本
       int temp = i;
       i = i + 1;
       //返回副本
       return temp;
   }

   //模拟++i的机制
   public int firstAdd() {
       i = i + 1;
       return i;
   }

输出结果为0和1,和i=i++以及i=++i的结果一致。

结论:在java的执行过程中,i++和++i都直接对i进行了i=i+1的操作,但是不同的是i++得到的是i未进行加法操作的前的值的副本,而++i直接得到计算后的值。 
A: String newPageNumber = "page_number=" + (++j);
B: String newPageNumber = "page_number=" + (j++); 
假如 j = 0;
A的结果为page_number=1
B的结果为page_number=0
转载:https://blog.csdn.net/c15158032319/article/details/78209740
 
分享到:
评论

相关推荐

    yang-mall-++i和i++

    然而,在标题中提到的"++i和i++"指的是两种不同的自增表达式,在大多数编程语言中,这两种表达式虽然在数值上会产生相同的结果,但它们在表达式执行的过程和时机上存在着微妙的差别。 "++i"通常被称为前缀自增操作...

    ++i,i++,--i,i--终结

    #### 二、++i 和 i++ 的区别 **++i (前缀自增)**:这种形式的自增运算符会立即执行加1操作,并返回加1后的结果。例如: ```c++ int i = 1; int j = ++i; // 此时i=2, j=2 ``` **i++ (后缀自增)**:这种形式的自增...

    ++i和i++d的区别.docx

    在C语言和许多其他类似的编程语言中,递增操作符有两种形式,即前缀递增(++i)和后缀递增(i++)。这两种操作符的共同作用是将变量的值增加1,但它们在变量值更新和参与运算的时序上存在差异。 前缀递增(++i)...

    测试i++和++i的区别

    使用++i和i++可以使迭代操作变得容易,但是两者到底区别在哪可以从这个程序中得知,使用java语言编写

    ++i和i++的区别 c/c++开发中

    在C/C++语言中,自增运算符是使用频率非常高的一个操作符,它有两种形式:前缀自增(++i)和后缀自增(i++)。这两种形式虽然在表面上看似相同,都是将变量的值增加1,但在实际的程序执行过程中,它们却有着本质上的...

    关于i++和++i以及左值,右值

    在性能方面,对于内置类型,i++和++i在大多数编译器中执行效率相同,因为编译器往往对此类操作进行了优化。然而,对于自定义类型,尤其是当重载了前缀和后缀自增运算符时,使用++i通常更为高效,原因在于编译器能够...

    C++编程教程之自增运算符++i和i++详解

    内容概要:本文通过三个版本的示例代码详细介绍了C++中前缀自增++i和后缀自增i++的区别及其具体应用场景。从初学者友好版本逐渐过渡到可选择自增方式的互动版,再到针对数据结构中使用的进阶版本。通过对每个版本的...

    C++面试题:++i和i++哪个效率高?

     2、我们自定的数据类型,++i效率高于i++,通过运算符重载来给大家说明这一点。 Operator Operator::operator++() { ++value; //内部成员变量 return *this; } Operator Operator::operator++(int) { ...

    如何理解i=i++和i=++i.docx

    这是因为i++和++i已经包含了赋值的含义,意味着它们会将增加后的值赋给原来的变量,所以不需要额外的赋值步骤。 另外,即使在表面上看似简单的自增操作中,也存在着编译器优化、指令重排等因素的影响,这些都可能...

    I++ DME2.0

    1. **目标与宗旨**:I++ 工作组的目标是尽快在相关的软件包中全面实施 I++ DME 和 I++ DMS 接口。成员公司放弃了许可费用的权利,并承诺不会对专利法提出任何索赔。 2. **使用自由性**:工作组致力于消除任何限制...

    快速区分一元运算符i++和++i.docx

    在JavaScript编程语言中,一元运算符`i++`和`++i`是常见的自增操作,它们在处理变量的值时有不同的行为和顺序。理解这两种运算符的区别对于编写高效和无误的代码至关重要。 首先,`i++`称为后置自增运算符。它的...

    I++ DME Specification Document

    这是一本关于I++DME规范的详细介绍,里面定义了对象模型、类、操作方法等

    c++的左值右值 i++与++i的区别.docx

    C++ 中的左值和右值、i++ 与 ++i 的区别 在 C++ 编程语言中,左值(Lvalue)和右值(Rvalue)是两个重要的概念,它们在变量和表达式中的角色不同,理解这两个概念对于编写正确和高效的代码非常重要。 左值(Lvalue...

    I++ DME1.7

    I++ DME的目标是实现软件包中I++ DME和I++ DMS接口的全面覆盖,并尽可能快地实施这些接口。通过这种方式,可以促进不同制造商之间的测量设备与软件系统的互操作性,降低集成成本,提高生产效率。 - **无许可费用**...

    compat-libstdc++-33 32位i686版

    `compat-libstdc++-33 32位i686版` 是一个针对32位系统的软件包,主要用于支持某些旧版本的C++应用程序。...`compat-libstdc++-33-3.2.3-69.el6.i686.rpm`是这个库的RPM安装包,可以使用RPM工具进行安装和管理。

    理解++i与i++的区别.txt

    在C/C++中,自增运算符有两种形式:前缀自增(++i)和后缀自增(i++)。前缀自增是先将变量i的值加1,然后返回该值。后缀自增则是先返回变量i的当前值,然后再将其值加1。这种区别在不同的上下文中会导致不同的效果...

    【驱动程序】USBCAN-I_I+_II_II+_2A_I-MINI驱动安装.zip

    《USBCAN-I/I+ II/II+ 2A I-MINI驱动安装详解》 在IT行业中,设备的正常运行离不开驱动程序的支持。本篇将详细介绍"USBCAN-I/I+ II/II+ 2A I-MINI"驱动的安装过程,以及其在不同Windows操作系统(包括win10、win7、...

    浅析PHP中的i++与++i的区分及效率_.docx

    从效率角度来说,i++ 和 ++i 都是 O(1) 的操作,无论是前缀递增还是后缀递增,都不会对性能产生影响。 PHP session 传递方式 在 PHP 中,session 可以通过多种方式来传递,包括 GET 方式、表单隐蔽值方式和文件...

    java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0

    当它作为后缀(如`i++`)出现在表达式中时,首先返回变量的当前值,然后将变量的值增加1。这种行为可以理解为下面两个步骤: 1. **获取当前值**:首先获取变量`i`的当前值。 2. **增加变量值**:然后将变量`i`的值...

    AD+MAC+IAS的802.1x无线认证局域网

    AD+MAC+IAS的802.1x无线认证局域网 之前在网上看过相关的文章介绍,要实现 AD + MAC + IAS 的 802.1x 无线认证,要么交换机要支持 802.1x 协议,要么无线 AP 或无线控制器要支持基于 Radius 的 MAC 地址认证功能。...

Global site tag (gtag.js) - Google Analytics