Java布尔与空奇异性
有人能帮助我理解为什么我的代码会生成以下输出吗
请注意,这里的f是用于调试的,f[0]=(lastLine!=null)只是与lastLine等效的一个值=空测试,因此它不是错误
boolean f[] = new boolean[6];
if (f[0]=(lastLine!=null) // есть следующая строка
|| (f[1]=isEdgeTime) // конец сессии
|| (f[2]=td.getHour() <10) // или уже утро, после полуночи все свечки хороши
|| (f[3]=(td.getHour() == 23 && td.getMinute() >=50))
|| (f[4]=currServerHour > lineHour) // или час сменился
|| (f[5]=currServerMinutesPeriod > linesMinutesPeriod)
){
answer.append(classCode).append(".")
.append(TickerUtils.getRoot(ticker))
.append(";").append(minutes).append(";")
.append(line)
.append("\n");
System.out.println(Arrays.toString(f));
if (f[0])
System.out.printf("\"%s\" : %d, currServerMinute=%d; %d > %d\n", lastLine, (lastLine!=null? 1: 0), currServerMinute, currServerMinutesPeriod, linesMinutesPeriod);
line = lastLine;
}
输出:
[true, false, false, false, false, true]
"null" : 0, currServerMinute=50; 10 > 9
我不明白为什么“lastLine”不是空的,因为f[0]
是真的,同时lastLine != null
给我假,所以它是空的,实际上,这怎么可能
# 1 楼答案
您应该仔细阅读Java中的运算符优先级:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
具体地说,在您的代码中,
f[0]
不仅仅被赋值为(lastLine!=null)
的结果,而是整个布尔表达式,因为OR运算符||
优先于赋值运算符=
。因此,您的第一行相当于(我添加了括号以明确运算符优先级):但总的建议是: 不要在测试中使用作业的结果。是的,它是合法的Java,但它的风格不好,因为它会很快变得混乱,正如您所发现的。请记住,代码只写一次,但读了很多次,所以让下一个阅读它的人明白这一点很重要
# 2 楼答案
尝试在if语句之外执行赋值。 这可能会进行更改,因为我们知道if语句将在第一个true条件下退出。出于性能(即分支预测)考虑,编译器和/或运行时解释程序可能会重新启用if语句
# 3 楼答案
如果看起来您正在为
f[0]
分配以下内容:因此
f[0]
可以为真,即使lastLine
为空尝试将您的情况更改为:
如果希望
f[0]
包含(lastLine!=null)
的值这将考虑
f[0]
的值。但是,如果任何i
的f[i]
为真,则由于||
条件的短路评估,将不会对f[i+1]
进行评估,因此f
数组中始终最多有一个true
值。我不确定这是否是你想要的