入门级comp sci major here ..我确定这个问题可能有一个明显的答案,但我简直无法弄清楚为什么下面的代码产生一个无限循环而且它让我疯狂。据我所知,Math.random()
返回一个double
值,当乘以10时,将小数一次向右移动,(int)
通过截断小数点后面的其余数字将double
数据类型转换为整数。但是为什么地球上是下面的代码产生一个无限循环其中一个boolean
表达式最终会产生一个true
值?
现在,如果我在循环中使用&&
而不是||
,它将正常工作,因为&&
在确定整个表达式的结果之前检查两个表达式的true
产量。啊......帮忙..
int x;
do {
x = (int)(Math.random() * 10);
}
while (x != 1 || x != 0);
它实际上非常简单:您的变量'x'不能是两个不同的整数值。如果你的变量是0,1,2,3,4,5,6,7,8或9并不重要。你的while条件将永远为真,因此你的循环将永远运行。
e.g:
x = 0: (x != 1 => true || x != 0 => false) => true
x = 1: (x != 1 => false || x != 0 => true) => true
x = 2: (x != 1 => true || x != 0 => true) => true
...
当条件为真时,while
循环继续。
对于x的任何值,你写的条件总是如此。
并且数字总是“不同于0”或“不同于1”(或两者)。
因此,无限循环。
也许你认为`||,逻辑'或',意思是“第一个或第二个是真的,但不是两个”?
如果你想要“x!= 0或x!= 1,但不是两者”,那么你实际上是指x == 0 || x == 1
我想我现在理解了我的错误思考..用一个||表达式,如果第一个表达式的计算结果为false,则第二个表达式也始终被计算。我的印象与&&类似,如果在||中有一个表达式是假的,整个被解释为也是假的,但结果是(false || true)= true而(false && true)= false以及(true && false)= false,但不像||,在&&中,当第一个表达式产生false而不是||时,编译器甚至不会考虑第二个表达式仅在第一个为假时才评估两者。我想我明白了......