博文内容:
深刻认识C语言的++/--操作
本讲将会教你如何理解前置++,后置++问题
★博文转载请注明出处。
++、--操作
基操:
在这里++和 -- 的执行顺序一致,我们就以++为例
#include <stdio.h> int main() { int a = 10; int b = ++a; //前置++, 先自增在使用 printf("%d, %d\n", a, b); //11,11 return 0; }
#include <stdio.h> int main() { int a = 10; int b = a++; //后置++, 先使用在自增 printf("%d, %d\n", a, b); //11, 10 return 0; }
前置++、-- :都是先自增再使用
后置++、-- :都是先使用再自增
深刻理解 a++
int main() { int a = 0xDD; int b = a++; //有b接收,那么a的先使用是将a的值(内容),放到b中 int c = 0xEE; c++; //没有接收方,那么"先使用",如何理解? return 0; }
这里的具体理解是需要用到汇编语言的,汇编语言不是本节的重点,我们直接记一下结论:
a++完整的含义是先使用,在自增。如果没有变量接收,那么直接自增
复杂表达式
#include <stdio.h> int main() { int i = 1; int j = (++i)+(++i)+(++i); printf("%d\n", j); return 0; }
三个自增符连接起来后构成的表达式,我们可以计算一下这个表达式的结果,然后再把代码复制到编译器中自己运行一下试试看,这个问题是没有正解的,为什么呢?下面我们来分析一下原因。
在vs中,输出结果为12,而在Linux中输出结果就为10
vs是把三个i++全部执行后再把数据拿到寄存器中相加计算,也就是四个4相加
而在linux下的gcc编译器是想把前两个先计算出来,是两个3相加,之后再和后一个(4)相加,为10
总结:
在复杂表达式中,尤其是计算路径不唯一的场景中,由于很多编译器加载进内存中的顺序不同,最后导致计算路径不唯一,计算结果也就不唯一
后记: