前言
本博客参考书籍:《C语言深度剖析第二版》,所有代码均由我本人测试无误。
运行平台为 win10下VS2019和Linux。
自加++ 自减-- 操作符
前置++ 先自加,再使用; 后置++ 先使用,再自加
后置++的 反汇编解释:
在有变量使用的时候,就直接给变量使用,在该变量使用完之后,再自加
但是如果没有变量使用,后置++的变量就 直接自增:
所以这里的后置++ 要这样理解:先使用 的含义是 是否有变量使用,如果没有变量使用,则直接自加,如果有变量使用,则先给变量使用,然后自加
所以在后面考虑后置和前置++时,没有根本区别,唯一的区别是否时候有变量要使用,如果有变量要使用,才会产生不同 在最常使用的 for 循环中,前置和后置++ 就没有任何区别
这里也可以理解为:不论是前置 还是 后置,遇到该操作符,都是统一进行 自加/自减 操作,然后 前置是返回 自加/自减 之后的结果,后置 是返回 自加/自减 之前的结果
使用注意点
但是如果有多个自增和自减 运算,就要注意,在不同的环境下可能会有很大的区别,如下程序:
#include <windows.h>
int main()
{
int i = 1;
int j = (++i) + (++i) + (++i);
printf("%d\n", j);
return 0;
}
在 VS2019下的运行结果为12,而在gcc 环境下运行结果就是10,这是因为:不同编译器在识别表达式时的计算路径不唯一,有的是同时加载到寄存器中,有的是分批加载,这样的不确定性,就导致了结果的不同
所以在实际代码编写中,这样有歧义的代码不要使用,可能会产生很大的问题
这里VS 和 gcc 的运算逻辑可以这样简单的概括:
VS:i 有三次自加,则i 在三次自加之后的值为4,然后三个4 加在一起,得到的结果就是12
gcc:gcc在使用时将第一个 + 号的左右端作为一个式子了,在这个式子中有两次自加,i变为3,然后加在一起得到6,此时i=3,变为了 j=6+ ++i;i 自加后变为4,得到的结果就是10了这里所说的计算路径不同,也就是说不同的编译器或编译平台,对于数据的处理方式是不同的,因为数据所有的计算处理都是由CPU 完成的,数据保留在在内存中,要参与计算的数据放入寄存器中,由于每次从内存中取出的数据的个数和CPU 处理的顺序的不同,就产生了计算路径不同的现象
所以不推荐这样的写法,有歧义
C语言的规定
在C程序内部,对于这样的代码使用贪心法进行读取判断:
每一个符号应该包含尽可能多的字符,即:编译器将程序分解为符号的方法是:从左到右 一个一个字符的读入,如果该字符可能组成一个符号,那么就再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不可能再组成一个有意义的符号。
要注意的一点是:除了字符串与字符常量,符号的中间不能嵌有空白(包括 空格、制表符、换行符等)
例如:
int i=20;
int j=10;
printf("%d\n",i++ + ++j); //等价于printf("%d\n",i++ + ++j); 结果为 20+11=31
注意:贪心规则仅仅是作为参考,在实际使用编译器编写时,编译器提供的 贪心规则的优化,是有可能会出现错误的。
上面就是关于 自加 与自减的详细介绍了。
最后
感谢观赏,一起提高,慢慢变强