以下是来自Java champs的代码。
class Compound
{
public static void main (String args[])
{
int k = 12;
k /= --k;
System.out.println(k);
k *= k++;
System.out.println(k);
k *= ++k;
System.out.println(k);
}
}
给出的选项是
输出是选项-2。有人可以解释,它如何评估选项-2?
答案 0 :(得分:4)
您需要知道的事情:
k(operator)=value
基本上是k=k(operator)value
(更多信息here)。 ++
递增--
递减。这些运算符的前置和后置版本包括:
x++
(增加后)将首先返回x
的当前值,然后将增加x
(如果x=2
print(x++)
首先通过{{1}然后,方法将2
增加为x
)3
(预增量)将首先增加++x
的值然后将其返回 x
++
的优先级高于--
*
,其优先级高于/
=
将变为7/3
而不是2
2.33333...
argument1 (operator) argument2 (operator) argument3
中的argument1
之前进行评估,argument2
将在argument2
之前进行评估(换句话说,它们将从左到右进行评估) )argument3
在将variable = expression
的值放入expression
之前,需要首先对其进行评估,因此需要先计算variable
第一个x=x+1
表达式,然后可以使用此评估结果设置x+1
。因此您可以将代码重写为
x
- > k/=--k;
- > k = k / --k;
k = (k / (--k))
- > k*=k++;
- > k = k * k++;
k = (k * (k++))
- > k*=++k;
- > k = k * ++k;
首先是k = (k * (++k))
。
k=12
k = (k / (--k))
允许将第一个k = (12 / (--k))
替换为其当前值
k
预递减k = (12 / 11)
将首先将--k
递减到k
,然后返回递减值
11
因为我们正在划分整数k = 1
结果为12/11
而不是1
现在1.0909...
。 k=1
k*=k++;
k = (k * (k++))
k = (1 * (k++))
后增量k = (1 * (1))
首先返回k++
的当前值k
然后递增它
1
k = 1
,这里没什么特别的
所以1*1=1
仍为k
。 1
k*=++k;
k = (k * (++k))
以来k = (1 * (++k))
k=1
k = (1 * (2))
首先递增然后返回值,因此++k
变为k
并返回此值
2
k = 2
这里没什么特别的。
答案 1 :(得分:2)
int k=12;
k/=--k;
//i.e. k=k/--k; i.e. k=12/11; i.e k=1
System.out.println(k);
k*=k++;
/*i.e. k=k*k++; i.e. k=1*1; and after this statement value of k is still 1,
inspite of k++,
since postfix version increase k by 1 after evaluation of k*k++,
but just after that 1 is assigned to k overwriting its previous value.
*/
System.out.println(k);
k*=++k;
//i.e. k=k*(++k); i.e. k=1*2;
System.out.println(k);
答案 2 :(得分:1)
int k = 12;
k /= --k;
System.out.println(k);
k *= k++;
System.out.println(k);
k *= ++k;
System.out.println(k);
第一个等式是12 / 11
。 --k
会减少k
,并返回减少的值(11
)。 12 / 11
是1.09
。当转换为int(发生implcitly)时,小数位将被省略,并且您将留下1
。 1
将打印到控制台。
第二个等式是1 * 1
。 k++
递增k
,然后返回先前的值(递增前的值,1
)。 1
被打印到控制台;现在你知道为什么你有前两个1s打印出来了。
最后的等式是1 * 2
。到现在为止,你应该知道增量是如何起作用的。答案印在cosole上。这就是为什么答案是选项#2