C语言中++i和i++的详细区别

1.++i

  ++i和等同于

1 i = i + 1;

2.i++

  i++可以等同于

1 int temp = i;  // 一个与i类型相同的临时变量
2 i = i + 1;

3.相同点和不同点

  相同点:i最后都会被加1;

  不同点:在i++中多了一个与i类型相同的临时变量,i++是右值,++i是左值。

  例子1:

 1 int a = 1, b = 2;
 2 int *pt;
 3 pt = &a;
 4 
 5 pt++ = &b;   // 错误
 6 //上式等价于    
 7 //int *temp = pt;
 8 //temp = &b;   给一个临时指针变量赋值无意义 
 9 //pt = pt + 1;
10 
11 *pt++ = b;   // 正确
12 //int *temp = pt;
13 // *temp = b; =>  a = b;  起到临时指针变量的作用
14 // pt = pt + 1; 

  例子2:  

 1 int fun()
 2 {
 3   int i = 0;
 4   return i++;    
 5 }
 6 // 等价于
 7 int fun()
 8 {
 9   int i = 0;
10   int temp = i;
11   i = i+ 1;  
12   return temp;    
13 }
14 // 根据C11,i++和return之间存在序列点,i++在序列点之前,序列
15 //点之前的表达式及其副作用会被先计算,计算完之后return才会被执行

  例子3:

 1 #include <stdio.h>    
 2 int main(void)    
 3 {    
 4   int a = 5;    
 5   int *p = &a;    
 6   int b = (*p)++; //等价于b = a++; 即b = a; a = a + 1;    
 7   int c = ++(*p); //等价于c = ++a; 即a = a + 1; c = a;     
 8   printf("b = %d, c = %d\n", b, c);    
 9   printf("(*p)++ = %d, ++(*p) = %d\n", (*p)++, ++(*p));       
10   return 0;    
11 }   
12 例子输出结果:   
13  b = 5, c = 7  ;  
14 (*p)++ = 8, ++(*p) = 8  

  对于行9的情况应该避免,作为printf函数的参数(*p)++和 ++(*p)的计算没有先后顺序,依赖于编译器,因此在不同的编译器会产生不同的结果。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值