注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境: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)编译器读入空格后立即对之前读入的符号进行处理