while循环一元递增和递减不起作用

时间:2016-12-08 19:46:26

标签: javascript

我正在尝试使用while循环来减少计数器,然后在条件语句中对其进行评估。

例如,此代码将导致6

var counter = 3;
var factorial = 1;

while (counter)
    factorial *= counter--;

console.log(factorial);

虽然这导致0

var counter = 3;
var factorial = 1;

while (counter--)
    factorial *= counter;

console.log(factorial);

7 个答案:

答案 0 :(得分:5)

    var counter = 3;
var factorial = 1;

while (counter--)
    factorial *= counter;

console.log(factorial);

在更改计数器之前评估while条件。 所以在第一个循环中,你评估3并传递vaue 2进行乘法运算。 然后你评估2> 0,你将1传递给乘法,因为counter--表示首先使用当前值,并在值减1后立即使用。

因此,在下一步中,您将评估if(1)哪个为true但是传递0,因此乘法的结果为0。 然后while循环将无法通过评估,因为计数器将是一个假值,如0

答案 1 :(得分:2)

不同之处在于,当您在条件中递减时,那么在循环体中,该值已经递减。

预先计算,以便在counter到达0时中断循环,并将factorial初始化为counter



var counter = 3; // Infinite loop if `counter <= 0`
var factorial = counter;
while (--counter)
  factorial *= counter;
console.log(factorial);
&#13;
&#13;
&#13;

如果您仍希望将其初始化为do...while

,请使用1循环

&#13;
&#13;
var counter = 3; // Infinite loop if `counter < 0`
var factorial = 1;
do factorial *= counter;
while (--counter);
console.log(factorial);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你不能这样减少。你基本上是写作。

while (counter)
    factorial *= counter -= 1;

这是完全错误的。你想要

while (counter > 0) {
    factorial *= counter;
    counter--;
}

答案 3 :(得分:0)

基于初始示例代码和在for循环中评估变量之前递减变量gulp.task('build-vendor',function(){ var concat = require("gulp-concat"); gulp.src([ 'node_modules/core-js/client/shim.min.js', 'node_modules/zone.js/dist/zone.js', 'node_modules/reflect-metadata/Reflect.js', 'node_modules/systemjs/dist/system.src.js' ]) .pipe(uglify()) .pipe(concat("vendor.min.js")) .pipe(gulp.dest("./bundles/")) }) 的问题,我提出了这个解决方案:

counter

如您所见,计数器在评估之前会减少。

然而,反馈是,它现在给出了错误的结果&#34;。

所以在这篇更新的帖子中,我想介绍一下我编写递归因子函数的方法。计算的阶乘存储在var counter = 3; var factorial = 1; while (--counter) factorial *= counter; console.log(factorial); 变量中,因此不必反复计算中间值。

f

答案 4 :(得分:0)

听起来你想要减量运算符的前缀版本,例如 while (--counter)

  

如果使用了前缀(例如, - x),则它会在递减后返回值。   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators

答案 5 :(得分:0)

如果您想根据需要输出,请使用下面的代码

var counter = 3;
var factorial = 1;

while ( x = counter--)
    factorial *= x

console.log(factorial);

Output : 6

**Explanation :** 
 let x = 3;
 var p = x--; // here, p = 3 and x = 2
so, in your parameter you passed 2 instead of 3 that's why giving a wrong ans .

答案 6 :(得分:0)

这基本上是后期和预先减少之间的差异以及评估的地点。

当你写\n时,它会返回x的当前值,然后递减它。与此相反,预增量/递减立即返回递增/递减值。

当评估x--条件时,计数器会在那里递减,所以在循环体中你已经修改了计数器值。这不同于while,其中计数器在计算阶乘后递减(因为后递减)。

为了了解它在实践中的运作方式,请参阅以下示例:

factorial *= counter--;

var counter = 3;
var factorial = 1;

while (counter) {
    console.log("Counter value before:" + counter);
    factorial *= counter--;
    console.log("Counter value after:" + counter);
}

console.log(factorial);

为了与原始示例中的行为相同,您可以使用预先创建(var counter = 3; var factorial = 1; while (counter--) { console.log("Counter value:" + counter); factorial *= counter; } console.log(factorial);)将while循环重写为do { } while

--counter