是什么原因导致在while循环之外初始化变量是错误的?

时间:2017-01-20 23:10:43

标签: java while-loop

当我在while循环之外声明移位时,我得到的结果等于16,这是一个错误的答案。但是当我在while循环中声明它时,我得到了正确的答案结果== 11.差异如何改变答案?

long a = Math.abs((long)100);
long b = Math.abs((long)9);
int result = 0;

while (a >= b){
    int shift = 0;
    while(a >= (b<<shift)){
        shift ++;
    }

    a -= b << (shift - 1);
    result += 1 << (shift - 1);
}

4 个答案:

答案 0 :(得分:2)

你声明它并不重要,实际上 - 重要的是何时以及是否将值重置为零。例如:

while (a >= b){
    int shift = 0;

int shift;
while (a >= b){
    shift = 0;

对于您的目的是相同的。但如果你改为这样做:

int shift = 0;
while (a >= b){

然后你没有在每个循环开始时将shift重置为0,并且会得到与前两个不同的答案。

答案 1 :(得分:0)

如果在外部while循环外定义移位,则只初始化一次。因此,外部while循环的每个新迭代都将使用上一次迭代的移位值(您执行更改值的shift ++),即0, 1, 2,...

如果在外部while循环内声明移位,则在每次迭代时将其重置为0。因为结果取决于shift的值,所以声明的位置很重要。

答案 2 :(得分:0)

当您将移位变量声明为循环时。每次迭代时都不会重置为0。

但是当你每次遍历循环时把它放在循环中,它的值被设置为零(更具体地说,变量再次声明),使输出按预期进行。

这不是一件有效的事情。我建议你做的是在循环外声明你的变量并在循环中重置它的值,如下面的代码所示

long a = Math.abs((long)100);
long b = Math.abs((long)9);
int result = 0;
int shift = 0;

 while (a >= b){
    shift = 0;
    while(a >= (b<<shift)){
    shift ++;
     }

    a -= b << (shift - 1);
result += 1 << (shift - 1);
}

答案 3 :(得分:0)

变量的声明不是改变你的答案,而是你在外循环的每次迭代中将它设置为0的事实。这是您要编写的代码:

long a = Math.abs((long)100);
long b = Math.abs((long)9);
int result = 0;
int shift = 0;
while (a >= b){
    shift = 0;
    while(a >= (b<<shift)){
        shift ++;
    }

a -= b << (shift - 1);
result += 1 << (shift - 1);
}