第13课 - ++,--操作符使用分析
- 示例
#include<stdio.h>
int main()
{
int k;
int i = 3;
k = (++i) + (++i) + (++i);
printf("%d ",k);
}
我们看到这个程序,一般会以为,这个结果应该是15。但是编译器对这个处理和我们的想法是不一样的。
一种编译器会显示18,这是因为,编译器会认为在做加法之前,进行了三次的加一运算,也就是每个结果都是6,三个6相加,结果是18。
第二种编译器,会认为这三个加法运算是平等的,先算前两个加,和上面的分析一样,变成了5加5,再加(++i),最后的结果是16。
gcc的结果是16,g++的结果是16。
我们看到这样的程序,就要思考,我们究竟有没有必要这样写,当然没有。对于面试中,若是出现这样的题型,我们也可以说,不同的编译器有不同的思考。
- 逗号表达式
#include<stdio.h>
int main()
{
int x;
int i = 3;
x = (++i, i++, i+10);
printf("%d ",x);
}
运行结果:15
逗号表达式,是从左到右顺序求值,最后一个表达式的值,就是逗号表达式的值。
- 贪心法
(1) 编译器处理的每个符号应该尽可能多的包含字符。
(2) 编译器以从左向右的顺序一个一个尽可能多的读入字符。
(3) 当即将读入的字符不可能和已读入的字符组成合法符号为止。
#include <stdio.h>
int main()
{
int i = 0;
// int j = ++i+++i+++i;
// 编译器在读到++i++的时候就已经出错了,++i的值是2,2++就会出错。
int a = 1;
int b = 2;
int c = a+++b; //c = a++ +b;
printf("%d,%d ",c,a); //c=3, a=2
int* p = &a;
// b = b/*p;
// 贪心法会认为/*是一个注释符,改成b = b/ *p;
return 0;
}