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

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:4.4.5

一、++,--操作符的本质

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

 - 前置(先递增,再使用数值)

   *变量自增(减)1

   *取变量值

 - 后置(先使用数值,再递增)

   *取变量值

   *变量自增(减)1

二、++,--操作符使用分析

1)一对令人头疼的兄弟

int i = 0;
   
(i++)+(i++)+(i++);
(++i)+(++i)+(++i);

你觉得这两个表达式的值分别是什么?

实例分析
令人头疼的兄弟
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;
}

三、++,--操作符使用分析

1)C语言中只规定了++和--对应指令的相对执行次序  

2)++和--对应的汇编指令不一定连续运行           

3)在混合运算中,++和--的汇编指令可能被打断执行 

    ++和--参与混合运算结果是不确定的。

警告:结果不确定,依赖于编译器,要想学好一门语言必须深入了解编译器。

4)笔试面试中的"奇葩"题

5)贪心法:++, -- 表达式的阅读技巧

  - 编译器处理的每个符号应该尽可能多的包含字符

  - 编译器以从左向右的顺序一个一个尽可能多的读入字符

  - 当读入的字符不可能和已读入的字符组合成合法符号为止

理解:尽可能多的读入字符,组成合法使用的符号

例如,a+++b ===> (a++)+b

实例分析
贪心法阅读示例
17-2.c
  
#include <stdio.h>

int main()
{
    int i = 0;
    //int j = ++i+++i+++i; //++i++ ==> 1++ 报错    后置++优先级高,结果++1非法

    int a = 1;
    int b = 4;
    int c = a+++b;	//a+++b; 1 + 4 ==> 5   a ==> 2
 
    int* p = &a;

    b = b/*p;		//编译器认为/和*是一起的,证明编译器很贪心

    printf("i = %d\n",i);
    //printf("j = %d\n",j);
    printf("a = %d\n",a);
    printf("b = %d\n",b);
    printf("c = %d\n",c);

    return 0;
}

空格可以作为C 语言中一个完整符号的休止符,编译器读入空格后立即对之前读入的符号进行处理

注意:难怪敲代码时有些时候要空格,尤其是运算。

小结:

1)++和-- 操作符在混合运算中的行为可能不同

2)编译器通过贪心法处理表达式中的子表达式

3)空格可以作为C语言中一个完整符号的休止符

4)编译器读入空格后立即对之前读入的符号进行处理

发布了40 篇原创文章 · 获赞 1 · 访问量 1765

猜你喜欢

转载自blog.csdn.net/piaoguo60/article/details/103881664