++i与i++

i++与++i是特殊的自增运算,类似的还有自减操作运算i--与--i。下面从C与C++两个角度来比较这两种形式的运算方式.

1.C中

简单的地说,++i和i++,作为一个语句单独使用时(如i++;或者++i;),就是i = i + 1,它们之间没有区别。而在作为语句的一部分时,a = ++i相当于i = i + 1; a = i;通过表达式就可以看出,因为++在前,所以是先执行加1操作,再执行赋值操作。而a = i++相当于a = i; i = i + 1;++在后,所以是先执行赋值操作,再执行加1操作。 

      问题:试分析下面的代码在x86/Linux上的输出结果。 

      代码1: 

                int main(int argc,int * argv[])

               {

                      long i=0;

                      printf("%ld\n",(++i)+(++i)+(++i));

                      i=0;

                      printf("%ld\n",(++i)+((++i)+(++i)));

                     return 0;

               }

      结果:x86/Linux:  7  9 

                 SPARC/Solaris:  6  6 

在x86/Linux平台上专门有一条指令用于++i操作,那就是INC指令。INC指令直接对i进行加1操作,并将结果保存在i中,而不是寄存器中,而在SPARC/Solaris系统上,由于不存在INC指令,计算的结果将保存在寄存器中,因此运算结果为6。 

      下面来分析一下在x86/Linux上发生了什么: 
      (++i) + (++i) + (++i) 
      ++i:i = 1; 
      ++i:i = 2; 
      ((++i) + (++i)):i = 2;((++i) + (++i)) = 4 
      ((++i) + (++i) + (++i)):i = 3;(((++i) + (++i)) + (++i)) = 3 + 4 = 7


      (++i) + ((++i) + (++i)) 
      ++i:i = 1; 
      ++i:i = 2; 
      ++i:i = 3; 
      ((++i) + (++i)):i = 3;((++i) + (++i)) = 6 
      (++i) + ((++i) + (++i)):i = 3;(++i) + ((++i) + (++i)) = 3 + 6 = 9


2.C++中


      在C++中,简单类型的i++和++i与C相同。但由于在C++中可以重载运算符,所以在实现新的类型对象时重载i++和++i操作与C不同。例如: 

          class A

      {

        public:

                  A & operator++();               //++i

                 const A operator++(int);      //i++

      };

      

     A& A::operator++()

     {

              *this +=1;       //先加1

              return *this; //返回加1后的的值     

     }


     const A A::operator++(int)

     {

            A oldValue = *this;     //返回旧值

            ++(*this);                   //再加1

            return oldValue;

     }


      从上面的++i与i++的实现看出,在C++中,对于非内建类型来说,前自增运算(++i)返回的是对象的引用,而后自增运算返回的是对象,返回对象将造成成拷贝构造函数更多的调用,所以++i的效率要高于i++。但是对于内建类型,i++与++i的效率几乎没有区别(因为内建类型没有拷贝构造函数)。于此类似的是i--和--i。(注:因为后自增运算返回的是const型对象因此后自增运算不能做左值)。


http://blog.youkuaiyun.com/wyunteng/article/details/6375692#comments

++i i++ 都是用于对变量 i 进行自增操作,相当于 i = i + 1,但它们在执行顺序和返回值上存在区别,以下是详细介绍: ### 区别 - **执行顺序**:i++ 是先使用变量 i 的当前值进行表达式的计算,然后再将 i 的值加 1;而 ++i 是先将 i 的值加 1,然后再使用更新后的值进行表达式的计算[^1][^2][^3]。 - **返回值**:i++ 返回的是自增前的值,而 ++i 返回的是自增后的值[^1]。 ### 示例 ```java public class TestAdd { public static void main(String[] args) { int a = 3; int b = a++; System.out.println("a=" + a); // 输出 a=4 System.out.println("b=" + b); // 输出 b=3 int x = 3; int y = ++x; System.out.println("x=" + x); // 输出 x=4 System.out.println("y=" + y); // 输出 y=4 } } ``` 在上述代码中,`b = a++` 先将 a 的值 3 赋给 b,然后 a 自增为 4;而 `y = ++x` 先将 x 自增为 4,然后将自增后的值 4 赋给 y [^2]。 ### 应用场景 - **i++ 的应用场景**:当需要先使用变量的当前值,再进行自增操作时,使用 i++。例如在遍历数组时,先使用当前索引访问数组元素,再将索引加 1。 ```java int[] arr = {1, 2, 3, 4, 5}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } ``` - **++i 的应用场景**:当需要先对变量进行自增操作,再使用更新后的值时,使用 ++i。例如在某些算法中,需要先将计数器加 1,再使用新的计数器值进行后续计算。 ```java int count = 0; while (++count < 10) { System.out.println(count); } ``` ### 注意事项 在某些复杂的表达式中,使用 i++++i 可能会导致结果不同,因此需要仔细考虑它们的执行顺序和返回值。例如在 `while` 循环中,`while (i++ < 10)` 和 `while (++i < 10)` 的初始判断条件不同,前者从 0 开始判断,后者从 1 开始判断 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值