i++;++i;i--;--i 的区别

本文详细解析了C语言中自增运算符的使用方式及其在条件判断中的表现,并通过两个具体示例展示了如何根据输入的不同得到相应的输出结果。
两次运行下面的程序,如果从键盘上分别输入6和3,则输出结果是(     )。
int x;
scanf("%d",&x);
if(x++>5)   printf("%d",x);
else   printf("%d\n",x - -);
A. 7和5      
B. 6和3      
C. 7和4       

D. 6和4

++i, 表示参与运算之前先自加1.
i++,表示参与运算以后再加1.
--i, i-- 类似。 
在C++里面,可以通过运算符重载修改这种默认行为,在C语言理解或者其他计算机语言里面这点都是一样的。

1. x = 6;
if(x++>5) //条件判断的时候 6 >5
printf("%d",x); //所以执行。 但判断语句执行完成以后 x 自加1, 所以打印出来7.

2. x=3;
if(x++>5) //条件判断的时候,3 >5,不成立,这句执行完成以后 x 自加1,现在x为4.
printf("%d",x);  //此句不会执行。
else
printf("%d\n",x - -); //打印时候 x为4, 这句执行完成以后 x 自减1.

所以结果是  7, 4.
但是如果是单独用的话,他们没有什么和其他东西的运算 
比如 i++ ,++i
那么就直接+1. 


### i++ --i 的区别及使用场景 #### 基本概念 `i++` 表示的是 **后置自增**,而 `--i` 则表示 **前置自减**。两者的主要差异在于运算符执行的时间点以及返回的结果不同。 - 后置自增 (`i++`):先返回变量的当前值,然后再对该变量进行加一操作。 - 前置自增 (`++i`):先对变量进行加一操作,再返回该变量的新值[^1]。 同理, - 后置自减 (`i--`):先返回变量的当前值,然后再对该变量进行减一操作。 - 前置自减 (`--i`):先对变量进行减一操作,再返回该变量的新值[^3]。 #### 使用场景分析 ##### 场景 1: 循环控制结构 在循环中,通常会用到自增或自减操作来更新计数器。例如: ```c++ for (int i = 0; i < 10; i++) { cout << i; } ``` 这里使用的 `i++` 是典型的后置自增方式,用于每次迭代结束之后增加计数值[^4]。 如果改写成前缀形式,则效果相同,但在某些情况下可能更高效(具体取决于编译器优化)。例如: ```c++ for (int i = 0; i < 10; ++i) { cout << i; } ``` ##### 场景 2: 高并发环境下的安全性问题 当涉及到多线程程序设计时,`i++` 或者其他类似的非原子操作可能会引发竞态条件(race condition),从而导致不可预测的行为。这是因为 `i++` 实际上包含了三个独立的动作——读取旧值、计算新值并存储回内存。这些动作并非天然同步完成,在多个线程同时访问同一共享资源的情况下容易出现问题[^2]。 为了应对这种挑战,可以采用如下几种方法之一: - 使用互斥锁(`mutex`)或其他同步机制保护临界区; - 应用高级别的抽象类库如 Java 中的 AtomicIntegerFieldUpdater 提供的支持原语; 需要注意的是简单地将字段声明为 volatile 并不足以解决问题,因为虽然这能确保可见性有序性,却不能保障复合操作的整体一致性[^2]。 #### 示例对比 考虑一段 C/C++ 程序片段展示两者的细微差别: ```cpp #include <iostream> using namespace std; int main(){ int x=5,y,z; y=x++; //y gets the original value of x which is 5 then increments it to become 6. //So after this line executes, we have : x=6 and y=5 z=++x;//Firstly increment happens making new value as 7 before assigning so now both will hold same values ie.,z=7,x=7 cout<<"Value Of X After Postfix Operation:"<<x<<endl; cout<<"Value Assigned To Y During Postfix Operation:"<<y<<endl; cout<<"Value Of Z After Prefix Operation:"<<z<<endl; return 0; } ``` 运行结果将是: ``` Value Of X After Postfix Operation:6 Value Assigned To Y During Postfix Operation:5 Value Of Z After Prefix Operation:7 ``` 此例子清楚表明了前后位置对于最终赋值得影响[^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值