有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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给我假,所以它是空的,实际上,这怎么可能


共 (3) 个答案

  1. # 1 楼答案

    您应该仔细阅读Java中的运算符优先级:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

    具体地说,在您的代码中,f[0]不仅仅被赋值为(lastLine!=null)的结果,而是整个布尔表达式,因为OR运算符||优先于赋值运算符=。因此,您的第一行相当于(我添加了括号以明确运算符优先级):

    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)
    )){
    

    但总的建议是: 不要在测试中使用作业的结果。是的,它是合法的Java,但它的风格不好,因为它会很快变得混乱,正如您所发现的。请记住,代码只写一次,但读了很多次,所以让下一个阅读它的人明白这一点很重要

  2. # 2 楼答案

    尝试在if语句之外执行赋值。 这可能会进行更改,因为我们知道if语句将在第一个true条件下退出。出于性能(即分支预测)考虑,编译器和/或运行时解释程序可能会重新启用if语句

  3. # 3 楼答案

    如果看起来您正在为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]的值。但是,如果任何if[i]为真,则由于||条件的短路评估,将不会对f[i+1]进行评估,因此f数组中始终最多有一个true值。我不确定这是否是你想要的