• 学习交流加(可免费帮忙下载CSDN资源):
  • 个人微信: liu1126137994
  • 学习交流资源分享qq群1(已满): 962535112
  • 学习交流资源分享qq群2: 780902027

1 ++和–操作符的本质

  • ++ 和 - - 操作符对应两条汇编指令

    • 前置:

      • 变量自增(减)1
      • 取变量值
    • 后置

      • 取变量值
      • 变量字增(减)1

上述只是定义了 ++ 和 - - 操作符本身的取值与自增加减顺序。但是如果多个 ++ 或者 - - 操作符放在一起进行运算呢?像下面这样?

  • 你觉得上述两个表达式的值分别是多少?或许你心中已经有答案,但是我们不妨先写代码验证一下:

  • 代码 17-1.c

#include <stdio.h> 

int main()
{
    int i = 0;
    int r = 0;

    r = (i++) + (i++) + (i++);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    r = (++i) + (++i) + (++i);

    printf("i = %d\n", i);
    printf("r = %d\n", r);

    return 0;
}
  • 编译运行结果为:

i = 3
r = 0
i = 6
r = 16

  • 这个答案呢,与我们所想的稍微有所差别。最后一次r ,我们预想的应该是15 ,或者有的人认为应该是18 。但是最终结果却是16.这是为什么呢?

  • 因为在 ++ 和 - - 的混合运算中,它们并不是原子操作。它们所对应的两条汇编指令,有可能不是连续执行,导致最终结果有误。

  • 比如上述代码中,13行的计算中,(++i)+(++i)+(++i)中,有可能是第一个i先++,然后第一个i取值为4,然后第二个i再++不取值,第三个i再++不取值,然后第二个括号取值此时i=6,然后第三个括号取值i=6 。 那么整个表达式就是4+6+6=16 。当然,这只是一种情况,还有很多种情况,不同的情况,最终结果都有可能不一样。

  • 只是本次使用我的编译器,是这样的情况而已。使用其他编译器或许结果就是不一样的。

最终得出一个结论,就是 ++ 和 - -混合运算的计算结果是不确定的。

2 总结

  • ++ 和 - - 在混合运算中,行为可能不同

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112