17_++和--操作符分析

关键词:++--操作符的本质、++--操作符使用分析、贪心法:++--表达式的阅读技巧

1.++--操作符的本质

  • ++--操作符对于两条汇编指令
  • 前置:先将变量自增(减)1,然后取变量值
  • 后置:先取变量值,然后将变量自增(减)1

2. ++--操作符使用分析

#include <stdio.h>

int main()
{
    int i = 0;
    int r = 0;
    
    r = (i++) + (i++) + (i++);
    
    printf("i = %d, r = %d\n", i, r);
    
    r = (++i) + (++i) + (++i);
    
    printf("i = %d, r = %d\n", i, r);

    return 0;
}

在vs下的输出结果:

i = 3, r = 0
i = 6, r = 18

在gcc下的输出结果:

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

总结:在vs编译器下和在gcc编译器下的输出结果不同,表达式r = (++i) + (++i) + (++i);在不同的编译器下运行方式不一样,在vs编译器下先执行三次++i然后再做加法运算;再gcc编译器下,先执行两次++i,然后做加法运算,然后再执行一次++i`,然后再做加法运行。

  • C语言中只规定了++--对应指令的相对执行次序
  • ++--对应的汇编指令不一定连续运行
  • 在混合运算中,++--的汇编指令可能被打断执行
  • ++--参与混合运算结果是不确定的

3. 贪心法:++--表达式的阅读技巧

  • 编译器处理的每个符号应该尽可能多的包含字符
  • 编译器以从左向右的顺序一个一个尽可能多的读入字符
  • 当读入的字符不可能和已读入的字符组合成合法符号为止
  • 空格可以作为C语言中一个完整符号的休止符,编译器读入空格后立即对之前读入的符号进行处理

4. 小结

  • ++--操作符在混合运算中的行为可能不同
  • 编译器通过贪心法处理表达式中的子表达式
  • 空格可以作为C语言中一个完整符号的休止符
  • 编译器读入空格后立即对之前读入的符号进行处理

声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

    原文作者:jacob2359
    原文地址: https://www.jianshu.com/p/99d418eeca8b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞