入门级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);
答案 0 :(得分:3)
实际上很简单:你的变量'x'不能是两个不同的整数值。如果您的变量是0,1,2,3,4,5,6,7,8或9,则无关紧要。您的while条件将始终为true,因此您的循环将永远运行。
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
...
答案 1 :(得分:0)
while
循环在条件为真时继续 。
对于x的任何值,你写的条件总是如此。
数字总是"不同于0"或"与1"不同(或两者兼有)。
因此,无限循环。
也许你认为`||,逻辑'或',意思是"第一个或第二个是真的,但不是两个" ?
如果您想要" x!= 0或x!= 1,而不是两个",那么您实际上是指x == 0 || x == 1
答案 2 :(得分:0)
我想我现在理解我的错误思考..用||表达式,如果第一个表达式的计算结果为false,则第二个表达式也始终被计算。如果在||中有一个表达式,我的印象类似于&&&是假的,整个被解释为也是假的,但结果是(假|| true)=真而(假&&真)=假以及(真&&假)=假,但不同于||,在&&和编译器中,当第一个表达式产生错误但是||时,编译器甚至不打算评估第二个表达式。仅在第一个为假时才评估两者。我想我明白了......