计算机操作员混淆

时间:2014-11-02 19:49:20

标签: java

以下是来自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);
    }
}

给出的选项是

  • 1它将成功编译并显示1,然后是2,然后是3 作为输出。
  • 2它将成功编译并显示1,然后是1,然后是2 作为输出。
  • 3它将成功编译并显示1,然后是3,然后是4 作为输出。
  • 4会产生编译时错误。

输出是选项-2。有人可以解释,它如何评估选项-2?

3 个答案:

答案 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仍为k1

的时间

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 / 111.09。当转换为int(发生implcitly)时,小数位将被省略,并且您将留下11将打印到控制台。

第二个等式是1 * 1k++递增k,然后返回先前的值(递增前的值,1)。 1被打印到控制台;现在你知道为什么你有前两个1s打印出来了。

最后的等式是1 * 2。到现在为止,你应该知道增量是如何起作用的。答案印在cosole上。这就是为什么答案是选项#2