栈的概念我很早就接触过了,那时是我在某视频网站上跟着老师自学,老师讲的非常不错,不过我不是很理解,只是知道了为什么一些数据在运算还没完成时就已经被释放了,昨天我的老师也讲了一点点关于栈的概念。栈(Stack)是储存数据的地方,堆也是一样(但堆(Heap)我还不是很了解),不过两者是有很大区别的,我主要讲一下自己对栈的理解(如果有错欢迎大家雅正):
进入栈的数据类型最常见的就是局部变量,至于全局变量和static类型都是被存放在静态区的。数据存入栈被称为进栈,压栈或入栈,而且数据进栈讲究一个先进后出原则,意思是数据如果第一个进去,那只能最后一个出来。
可以把他看成是单行道的死胡同,数据单进单出,最先进去的只能最后退出来。这和我们日常生活中的排队比较相似,不同的就是排队是先进先出。
举个例子:
int a=0;
int v=(a++)+(++a);
printf(“v=%d”,v);
这题我第一次是怎么算的,第一个a++是先参与计算后再自增1,所以用于计算的数值是0,第二个是先自增1再参与计算,所以用于计算的数值为1,最终结果便是0+1=1。结果不出所料的错了。
在听过老师讲解后我总结为三个错误,第一个是个常识,a++的自增运算发生在“;”之后;第二个是运算顺序,整个式子应该是先执行后面的++a,也就是a先自增成1,然后再执行a++,那么问题又来了,就算是先算++a再算a++那不也是0+1嘛?这就是第三个问题所在,参与运算的a++和++a,这两个a是同一个,当第二个a值变为1时,第一个a也会变成1,所以最终结果v=1+1=2。
可以看的,我们熟悉的加法是自左往右进行计算的,但自增是自右往左进行计算的。
另外再说一题
int a=0;
int v=(a++)+(a++)+(++a);
printf(“v=%d”,v);
在改变了上面的错误之后我对这类题已是信心满满,按上面的步骤进行计算,先算 ++a,所有a值变为1,再算两个a++,最终结果v=1+1+1=3。
然而,不出意外我又又又错了,以上理解没问题,但有个要注意的点是,两个数据之间会先进行计算,根据加法运算是自左向右,所以前两个a++先结束加法计算,结果为0+0=0,而a自增成1
总结:
后++(先参与计算再自增)发生在“;”之后,如果是两个以上的变量相加,则自增发生在每两个变量进行运算之后。
++(自增)运算是自右往左计算
同一变量的作用域一样时,某一个变量值的改变都会使其他变量一起改变。