++和 - - 操作符分析1:本质
在C语言中:
++ 和 - -操作符对应两条汇编指令
前置
- 变量自增(减) 1
- 取变量值
后置
- 取变量值
- 变量自增(减) 1
++和 - - 操作符分析2:C语言中的灰色地带
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;
}
在vc编译器中运行结果
i = 3
r = 0
i = 6
r = 18
解析:r = (i++) + (i++) + (i++);
编译器先连续 3 次取变量值相加(r = 0 + 0 + 0 = 0), 再自增 3 次。 所以 r = 0,i = 3
r = (++i) + (++i) + (++i);
然后编译器先自增 3 次, i = 6,再连续 3 次取变量值相加(r = 6 + 6 + 6 = 18) 。所以 r = 18, i = 6
在gcc编译器中运行结果
i = 3
r = 0
i = 6
r = 16
解析:r = (i++) + (i++) + (i++);
编译器先连续 3 次取变量值相加(r = 0 + 0 + 0 = 0), 再自增 3 次。 所以 r = 0,i = 3
r = (++i) + (++i) + (++i);
编译器先自增 2 次, 再取 2 次值相加,在自增 1 次, 再取值相加。所以 r = (5 + 5 + 6 = 16), i = 6
++和 - - 操作符分析3:贪心法
贪心法: ++ , - - 表达式的阅读技巧
编译器处理的每个符号应该尽可能多的包含字符
编译器以从左到右的顺序一个一个尽可能多的读入字符
当要读入的字符不可能和已读入的字符组成合法符号为止
/*测试代码*/
#include <stdio.h>
int i = 0;
// 解析:读入+(合法),读入++(合法),读入++i(合法),读入++i+(合法),读入++i++(合法),读入++i+++(不合法)
// 计算 ++i++ ==> 1++(语法错误)
int j = ++i+++i+++i; // error
int a = 1;
int b = 2;
// 解析:读入a(合法), 读入a+(合法), 读入a++(合法), 读入a+++(合法), 读入a+++b(合法), 读入a+++b;(合法)
// 计算 a+++b ==> 1 + 2 ==> 3
int c = a+++b; // c = 3, a = 2, b = 2
知识点:
空格可以作为C语言中一个完整符号的休止符
编译器读入空格后立即对之前读入的符号进行处理