当前位置:   article > 正文

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

c语言++i和i++区别

1.++i

  ++i和等同于

1 i = i + 1;

2.i++

  i++可以等同于

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

3.相同点和不同点

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

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

  例子1:

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

  例子2:  

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

  例子3:

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/215310
推荐阅读
相关标签
  

闽ICP备14008679号