自增自减运算符

由于不同的平台,不同的编译器对存在多个自增自减运算的处理方法不一样,最后运行的结果也存在不同。

因此,本文中的部分含有多个自增自减运算符的代码只是为了帮助你理解运算的过程,在实际的项目工程中一定不要使用!

#include <stdio.h>

int main(void) {
  /*
   * 自增自减运算符:
   * ++ 和 -- 放在变量的前面或后面,单独写一行的结果是一样的
   * int b = a++; 是先用后加,先取值,后增减,此时 b == a
   * int b = ++a; 是先加后用,先增减,后取值,此时 b == a + 1
   * 但是无论是哪一种,当此行代码结束之后,b == a + 1
   * */

  int a = 10;  // a == 10
  int b = a++; // b == a == 10, a == 11
  int c = 10;  // c == 10
  int d = ++c; // c == 11, d == c == 11
  // a = 11, b = 10, c = 11, d = 11

  int e = 10;  // e == 10
  int f = e++; // f == e == 10, e == 11
  int g = ++e; // e == 12, g == e == 12
  // e = 12, f = 10, g = 12

  /*
   * 遵循一样的规则,前缀先加再用,后缀先用再加
   *
   * Windows:
   *     > 前后缀的优先级不同,前缀优先于后缀
   *     > 前缀先统一自增/自减,再把结果拿出来用
   * 如:
   *   int i = 10;
   *   ++i + ++i;
   *    12    12  = 24
   *     > 后缀统一先用,等整个表达式中的变量用完了,再进行自增
   * 如:
   *   int i = 10;
   *   i++ + i++;
   *   10    10   = 20
   *
   * Mac/Linux:
   *     > 前后缀的优先级是一样的,从左到右依次计算
   *     > 每一个前缀和后缀都是一个独立的个体
   * 如:
   *   int i = 10;
   *   ++i + ++i;
   *    11    12  = 23
   * */

  int h = 10; // h == 10
  int i = 5;  // i == 5
  int j = h++ + ++h - --i - h--;
  /*
   * Windows:
   *     前缀先统一自增,此时:h = 11, i = 4
   *     进行计算,此时:j = 11 + 11 - 4 - 11 = 7
   *     后缀再进行自增,此时:h = 11(:11 + 1 - 1), i = 4
   * Mac/Linux:
   *     从左到右依次计算,此时:
   *     h++(:10) + ++h(:11 + 1) - --i(:5 - 1) - h--(:12)
   *     j = 10 + 12 - 4 - 12 = 6, h = 11(:12 - 1)
   * */

  int k = 10;
  int l = k++ + k++;
  int m = ++k + ++k;
  int n = ++k + k++;
  int o = k++ + ++k;
  /*
   * Windows:
   *   k = 10
   *   l = k++(:10) + k++(:10) = 20, k = 12
   *   m = ++k(:14) + ++k(:14) = 28, k = 14
   *   n - ++k(:15) + k++(:15) = 30, k = 16
   *   o = k++(:17) + ++k(:17) = 34, k = 18
   * > k = 18, l = 20, m = 28, n = 30, o = 34
   *
   * Mac/Linux:
   *   clang:
   *     k = 10
   *     l = k++(:10) + k++(:11) = 21, k = 12
   *     m = ++k(:13) + ++k(:14) = 27, k = 14
   *     n = ++k(:15) + k++(:15) = 30, k = 16
   *     o = k++(:16) + ++k(:18) = 34, k = 18
   *   > k = 18, l = 21, m = 27, n = 30, o = 34
   * */

  int p = 10;
  int q = p++ + p++ + p;
  int r = ++p + ++p + p;
  int s = ++p + p++ + p;
  int t = p++ + ++p + p;
  /*
   * Windows:
   *   p = 10
   *   q = p++(:10) + p++(:10) + p(:10) = 30, p = 12
   *   r = ++p(:14) + ++p(:14) + p(:14) = 42, p = 14
   *   s = ++p(:15) + p++(:15) + p(:15) = 45, p = 16
   *   t = p++(:17) + ++p(:17) + p(:17) = 51, p = 18
   *
   * Mac/Linux:
   *   clang:
   *     p = 10
   *     q = p++(:10) + p++(:11) + p(:12) = 33, p = 12
   *     r = ++p(:13) + ++p(:14) + p(:14) = 41, p = 14
   *     s = ++p(:15) + p++(:15) + p(:16) = 46, p = 16
   *     t = p++(:16) + ++p(:18) + p(:18) = 52, p = 18
   * */

  return 0;
}
posted @ 2026-01-09 14:08  Zhuye_inking  阅读(47)  评论(0)    收藏  举报