i++与++i的区别

i++与++i的意思都是i自身加1,不过这个两个语句却有很大的区别。

++i,就是直接在i上再加1,这个无需多解释。

i++会稍微特殊些,他会在下次执行语句,再遇到i时,才会在i身上加1。

打个比方,来看看这个语句。

int i = 2;

i = 7 + i++;

这两个语句结束后,i的值为9,如果等到下一次有语句再会用到i这个变量的话,i的值就会变成10。假如我们在刚才的语句下面再加一句话的话,就会是这样:

int i = 2;

i = 7 + i++;

int u = i + 5;

语句执行完毕后,u的值为15,因为在第3句话执行的时候,i的值就从9变成10了。

所以i++的使用,是一个非常危险的行为,可能会导致难以检查的错误,我们来看下面一个例子:

int i = 6;
i++;
if( i = 6)
{
  printf("test1\n");
}
if (i = 7)
{
  printf("test2\n");
}

输出结果为:

test1

tese2

我们可以看到,在上面这个例子中,两个if语句中的内容,都被执行了,这一点是和人们的惯性思维相悖的,所以从这一点来将的话,我们在编程的过程中,为了保证代码的安全性,应该尽可能的使用++i这样的形式,避免使用i++这样形式的代码

转载于:https://www.cnblogs.com/zhaoX/p/4474621.html

<think>嗯,用户现在问的是i++++i的区别。这个问题看起来是编程基础中的常见问题,尤其是对于刚学C语言或者类似语言的新手来说。我需要先回忆一下这两者的区别,然后想想怎么用中文解释清楚。 首先,i++是后置递增,而++i是前置递增。它们的区别主要在于表达式的值和副作用发生的时机。比如,当在表达式中使用它们时,i++会先返回原来的值,然后再递增,而++i则是先递增,再返回新的值。比如说,如果i初始是5,那么i++的值是5,之后i变成6;而++i的值是6,i同样变成6。 不过,用户可能需要的不仅仅是这个基本的区别。他们可能在实际编程中遇到问题,比如在循环或者复杂表达式中使用这两个操作符导致的结果差异。比如,在for循环中使用i++++i,其实在循环结束后i的值是一样的,但如果在循环体内有其他操作,可能会影响结果。不过,在大多数现代编译器中,这两种写法在循环中的效率可能没有区别,因为编译器会优化。 还需要注意,在C++中,如果i是一个对象(比如迭代器),++i可能会更高效,因为后置递增通常需要创建一个临时对象来保存旧值,而前置递增直接修改对象本身。所以在这种情况下,推荐使用++i。 另外,用户可能会混淆这两个操作符的优先级和结合性。比如,在表达式里混合使用它们和其他操作符时,可能出现预期外的结果。需要提醒用户注意运算符的优先级问题,必要时使用括号来明确运算顺序。 可能用户在学习过程中遇到了因为这两个操作符导致的bug,所以才来询问。需要举一些例子来说明不同的使用场景下的结果,帮助他们理解。 总结一下,回答的结构应该是先解释基本区别,再通过例子说明,然后讨论使用场景和注意事项,最后总结两者的适用情况。同时,需要避免使用过于专业的术语,保持语言通俗易懂。</think>### **i++ ++i 的区别** 在编程中,`i++`(后置递增)和 `++i`(前置递增)是常见的**递增操作符**,主要用于对变量进行**自增操作**。它们的核心区别在于**返回值**和**执行顺序**。 --- ### **一、基本区别** 1. **`i++`(后置递增)** - **返回值**:先返回变量原来的值,再对变量加1。 - **执行顺序**: ```c int temp = i; // 保存原值 i = i + 1; // 自增 return temp; // 返回原值 ``` 2. **`++i`(前置递增)** - **返回值**:先对变量加1,再返回新值。 - **执行顺序**: ```c i = i + 1; // 自增 return i; // 返回新值 ``` --- ### **二、举例说明** 假设初始值 `i = 5`: | 操作 | 表达式值 | 操作后i的值 | |------------|----------|-------------| | `i++` | 5 | 6 | | `++i` | 6 | 6 | #### **示例代码** ```c int a = 5; int b = a++; // b = 5,然后a变为6 int c = ++a; // a先变为7,然后c = 7 ``` --- ### **三、关键差异** 1. **在表达式中使用** - `i++` 会先用原值参运算,再自增。 - `++i` 会先自增,再用新值参运算。 ```c int x = 3; int y = x++ * 2; // y = 3*2=6,然后x=4 int z = ++x * 2; // x先变为5,然后z=5*2=10 ``` 2. **性能差异(针对对象)** - 在C++中,若 `i` 是复杂对象(如迭代器),`++i` 可能更高效,因为 `i++` 需生成临时副本保存原值。 - 对基本类型(`int`, `float` 等),现代编译器会优化,两者性能无差异。 3. **循环中的应用** - 在 `for` 循环中,`i++` `++i` 效果相同(循环体执行后才自增),但习惯上更推荐 `++i`(尤其在C++中)。 ```c for (int i = 0; i < 10; i++) { ... } // 等价于 ++i ``` --- ### **四、常见误区** 1. **优先级问题** - `++` 的优先级高于大多数运算符,但建议用括号明确意图。 ```c int i = 5; int j = i++ + 1; // j = 5 + 1 = 6,i变为6 int k = ++i + 1; // i先变为7,k = 7 + 1 = 8 ``` 2. **未定义行为** - 同一表达式中对同一变量多次使用 `i++` 或 `++i` 可能导致未定义行为。 ```c int i = 5; int x = i++ + i++; // 未定义!不同编译器结果可能不同 ``` --- ### **五、总结** | 特性 | `i++` | `++i` | |---------------|---------------------------|---------------------------| | **返回值** | 原值 | 新值 | | **适用场景** | 需要先使用原值的场景 | 需要直接使用新值的场景 | | **性能建议** | 基本类型无差异,对象优先用 `++i` | 基本类型无差异,对象更高效 | **核心口诀**: - **`i++`**:先用后加(“原来的我,用完再变”)。 - **`++i`**:先加后用(“立刻升级,全新出发”)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值