对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的工作方

我很不确定java在这个简单代码中的流动方式。我已经设法让它工作了,但我真的不明白为什么会出现问题(请参见代码注释中的内容)

更具体地说:

  • 为什么“newCounter”和“counter++”在功能上有如此大的差异

  • 为什么counter++在递归中工作得很好,而newCounter不工作

  • 为什么java只捕获第一个计数器++“else if”条件语句,而不捕获第二个

  • 当我使用newCounter而不是counter时,为什么java同时捕获“else-if”语句++ 我觉得在java的工作方式中可能有一些重要的原则,我缺少这些原则,应该学习它们

如果您对此有任何澄清或提及此处涉及的关键概念/问题,我们将不胜感激

谢谢,代码30

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表达式,非常尴尬。现在我明白了。玩我的代码,现在一切都有意义了。谢谢!(至少我是对的,这是一个非常重要的问题,哈哈)。谢谢你的分析。是的,我使用的是后增量运算符,完全错误。我现在更了解它了。但我会接受你的建议,至少现在尽量少用它。