2017-01-20 94 views
-2

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

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); 
} 
+0

很明显,循环外部的'shift'会保持它之前迭代的值,而over版本则不会。 – Tom

+1

这不是你声明的地方,它是你设置为0的地方。 – Arkadiy

回答

2

如果你声明没关系,其实 - 重要的是何时以及是否您将该值重置为零。例如:

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

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

将是你的目的是相同的。但是,如果你不是这样做:

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

那么你就不会重置移位到0在每个循环的开始,将导致不同的答案比第2位。

0

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

如果您声明outer while while循环内的移位,在每次迭代时设置为0。因为结果取决于班次的价值,所以声明的位置很重要。

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); 
} 
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); 
} 
相关问题