对JAVA处理这种工作流和参考情况的方式感到困惑。有人能澄清一下吗?
我很不确定java在这个简单代码中的流动方式。我已经设法让它工作了,但我真的不明白为什么会出现问题(请参见代码注释中的内容) 更具体地说:对JAVA处理这种工作流和参考情况的方式感到困惑。有人能澄清一下吗?,java,if-statement,recursion,counter,Java,If Statement,Recursion,Counter,我很不确定java在这个简单代码中的流动方式。我已经设法让它工作了,但我真的不明白为什么会出现问题(请参见代码注释中的内容) 更具体地说: 为什么“newCounter”和“counter++”在功能上有如此大的差异 为什么counter++在递归中工作得很好,而newCounter不工作 为什么java只捕获第一个计数器++“else if”条件语句,而不捕获第二个 当我使用newCounter而不是counter时,为什么java同时捕获“else-if”语句++ 我觉得在java的工作方
- 为什么“newCounter”和“counter++”在功能上有如此大的差异
- 为什么counter++在递归中工作得很好,而newCounter不工作
- 为什么java只捕获第一个计数器++“else if”条件语句,而不捕获第二个
- 当我使用newCounter而不是counter时,为什么java同时捕获“else-if”语句++ 我觉得在java的工作方式中可能有一些重要的原则,我缺少这些原则,应该学习它们
System.Out.println(grow(1));
静态整数增长(整数计数器){
int newCounter=计数器++;
整数极限=8;
if(新计数器<极限){
系统输出打印项次(“计数器:+计数器);
System.out.println(“新计数器:+newCounter”);
return counter*grow(counter++);//如果我在这里使用newCounter,我会循环失败,因为数字保持不变(总是低于限制)
//计数器++确实可以工作,提供了一个很好的计算(7!或6!等)。
}如果(newCounter%2==0){
//如果我在两个“else-If”语句中都使用counter++而不是newCounter,
System.out.println(“偶数”);//java只捕获第一个。奇数不被捕获,
返回1;//并调用最后一个“else”语句。不过newCounter工作得很好。
}else if(新计数器%2==1){
System.out.println(“奇数”);
返回-1;
}else{//我不想达到这个最终的else可能性。
System.out.println(“转到其他…”);
返回0;
}
}
您的问题在于理解计数器+++
变量后的++
称为。JLS中的相关部件包括:
将值1添加到变量的值中,并将总和存储回变量中
及
后缀增量表达式的值是存储新值之前的变量值
这意味着计数器+++
还为变量计数器
分配一个新值。它基本上是counter=counter+1
的缩写。这个区别在于计数器+++
也是一个带值的表达式。棘手的部分是,该表达式的值是计数器的旧值。运行以下小示例进行说明:
public static void main(String[] args) {
int counter = 0;
System.out.println(counter++);
System.out.println(counter);
}
还有一个问题。这里的表达式具有递增的值。您在这里编写的代码的逻辑很难理解,这是因为newCounter
、counter
和您反复调用counter++
的组合
int newCounter = counter++;
。。。相当于:
int newCounter = counter;
counter = counter + 1;
int temp1 = counter;
int temp2 = grow(counter);
counter = counter + 1;
counter = temp1 * temp2;
因此,如果在初始化newCounter
后调用grow(5)
:
newCounter == 5
counter == 6
在其他地方,你有:
return counter * grow(counter++);
这有点难以解释;这相当于:
int newCounter = counter;
counter = counter + 1;
int temp1 = counter;
int temp2 = grow(counter);
counter = counter + 1;
counter = temp1 * temp2;
。。。因此,无论是否使用++
,最终结果都是相同的。或者换一种说法,这里的++
只会让理解变得更加混乱
有些语言,如Python,没有++
后增量运算符,因为设计者认为这会导致代码混乱。在我看来,post increment在干净的代码中确实有用途,但初学者可能应该将其使用限制在非常特定的习惯用法中(例如,for(int i=0;iYou应该阅读post increment操作符(counter++)的行为).int-newCounter=counter++;
为newCounter
赋值与int-newCounter=counter;
@Eran谢谢!我们将对此进行研究。注意,方法名称中不能包含*
。我们更希望示例是编译的代码。因此后缀增量表达式更像是一个“操作”而不是一个变量?因为它实际上不是(x+1)而是一个x=x+1语句?@CodeAt30正确。我刚刚意识到你想要的和我想的有点不同。我会编辑一下我的答案。好吧,我现在知道了。我以前一直在看后缀incemrement表达式,非常尴尬。现在我明白了。玩我的代码,现在一切都有意义了。谢谢!(至少我是对的,这是一个非常重要的问题,哈哈)。谢谢你的分析。是的,我使用的是后增量运算符,完全错误。我现在更了解它了。但我会接受你的建议,至少现在尽量少用它。