能进来的朋友肯定跟我一样对于count = count++的结果很不解,希望看完你有收获。
先看一段代码
-
public
class CountTest {
-
-
public static void main(String[]args) {
-
-
int count =
0;
//初始化count为0
-
for(
int i=
1;i<=
100;i++) {
//遍历100次
-
count = count++;
-
}
-
System.out.println(
"count = "+count);
//输出count
-
}
-
}
代码中,count被初始化为0,然后经历了100次 count=count++ ,那输出的答案肯定等于100呀。后自增不就是这样子的吗。其实不然,答案是 0
我曾经得出答案等于100的其中一个原因是,count++是后++,肯定是先把count的值赋值给count然后在count+1嘛(错误的),恭喜你,你也跟我一样入坑了。因为我也是这样子想的。
我确实想了很多种不对头的方式,仍旧无法得出正确答案,当我沉迷于百思不得求解的时候,我开始怀疑了我对于count++的理解。难道不是count先赋给左值然后在+1吗(错误的) ? 对,最后我发现就是这里错了。
下面是对于我对count = count++的探索。
1. 后++和 赋值=的优先级。
我曾经学习C语言和C++的时候,每次遇到j = i++的时候,是这样理解的,首先把i的值赋值给j 然后i=i+1. 现在我发现 ++的运算优先级高的仅此于(),说明++的运算优先级是非常高了,而赋值=的运算优先级很低,低到什么程度,比||都低,那我之前想的先赋值在++,是不是不对劲呀。在绝对高的优先级下似乎=不堪一击?那么难道是先i+1然后赋值给了j吗,那这个不就是j=++i了吗,这哪里是j =i++。笑死,这个时候我就发现我只找到了一半的原因,对于count = count++还在执迷不悟中。于是,我想起了一本红书,《C++面向对象程序设计(第二版)》谭浩强中的运算符重载不是讲过后++吗。没错,就是它!
2.C++运算符重载能扯到这吗?
如果真的对于count =count++困扰了很多的(比如我),就一起翻到C++面向对象程序设计中的第138页的那个例子(下面)。当然,网上也有很多对于后置自增运算符重载的实例,你也可以去看看。
-
Time Time ::operator ++ (
int )
-
{
-
Time temp(*this);
-
sec++;
-
if(sec>=
60)
-
{
-
sec-=
60;
-
++minute;
-
}
-
return temp;
-
}
如果看不懂没关系,注意看的就是好像代码要返回的是一个Time类,然后代码中出现了一个 Time temp(*this),在sec++,然后返回了temp 。哦豁,用一个临时变量保存了当前的对象本身,然后sec+1了,最后返回了保存的对象本身,之所以要保留对象本身是因为sec+1会导致Time对象本身会改变返回的值。我似乎有一点理解了。它是用了一个临时变量存储了这个对象,然后在返回了这个对象。
相对于count = count ++的话,就是说用了一个temp保存了count的初始值,然后count+1了,但是赋值给count的是temp .也就是说是先加了然后在赋值的,但又没完全是,赋值的是一个临时保存的count。
3. 对于j = i++的举例
下面我也将类比一下j = i++的求解过程。
-
public
class CountTest {
-
-
public static void main(String[]args) {
-
-
int i =
0;
-
int j =
0;
-
j = i++;
-
System.out.println(
"i = "+i);
//输出为1
-
System.out.println(
"j = "+j);
//输出为0
-
-
}
-
}
i,j初始化都为0 ,首先出现了一个int temp 变量保留了i(=0)的值,然后i =i+1 ,最后temp赋值给了 j。就没了。 j变成了初始值的i,i变成i+1了,
j = i++类比于count = count++,就是出现了temp保存了count的初始值,然后count+1了,最后temp赋值给了count。右值count的值在++之前被保存到了temp,然后右值的count本来自身要+1,就是count=1了,但到最后要完成count=赋值操作,把temp保存的count初始值又赋值给了左值。就像count变了,但又没变 ;
因此在实际的编程可不要犯了这个小细节,导致程序运行不尽人意哦。
上述就是我对于count = count++的思考,希望对你有用。后面我也测了一下,比较新的C++编译器也是出现了count = 0的结果
转载:https://blog.csdn.net/wasane/article/details/116800588