有人可以帮助我理解为什么我的代码可以生成以下输出吗?
请注意,f这里是出于调试目的,f [0] =(lastLine!= null)只是等同于lastLine!= null测试,所以它不是bug。
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
给我假,所以它实际上是null,实际上,这是怎么回事是
答案 0 :(得分:4)
如果您要分配给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)
因此即使f[0]
为空,lastLine
也可以为真。
尝试将您的条件更改为:
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)
)
如果您希望f[0]
包含(lastLine!=null)
的值。
这将照顾f[0]
的价值。但是,如果f[i]
对于任何i
都属实,f[i+1]
由于||
条件的短路评估而无法进行评估,那么您就可以了true
数组中最多只有一个f
值。我不确定这是不是你想要的。
答案 1 :(得分:1)
您应该阅读Java中的运算符优先级:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
具体来说,在您的代码中,f[0]
不仅仅是(lastLine!=null)
的结果,而是整个布尔表达式,因为OR运算符||
优先于赋值运算符{ {1}}。所以你的第一行等同于(我添加了括号以使运算符优先显式):
=
但一般建议: 切勿在测试中使用作业的结果。是的,它是合法的Java,但它的风格很糟糕,因为它很快就会让你感到困惑,正如你所发现的那样。请记住,代码只写了一次,但是读了很多次,所以对于下一个阅读它的人来说,这很重要。
答案 2 :(得分:-1)
尝试在if语句之外进行分配。 这可能会导致更改的原因是因为我们知道if语句将在第一个真实条件下退出。编译器和/或运行时解释器可能会重新调整if语句的性能(即分支前缀)注意事项。