Булевы выражения в Java - PullRequest
       49

Булевы выражения в Java

3 голосов
/ 29 января 2009

У меня есть вопрос о значении (оценке) логических переменных в операторах возврата в Java.

Я знаю, что:

if (var) { ... }

совпадает с:

if (var==true) { ... }

Во втором случае мы явно говорим var == true, но нам не нужно этого делать, потому что Java все равно оценивает var как true. Я надеюсь, что понял это право.

Мой вопрос: то же самое, когда возвращаются логические переменные? Когда у нас есть заявление о возврате?

Например, задача указывает: метод lookBetter () вернет true, только если b

public boolean looksBetter() {
     if (b < a) {
         return true;
     } else {
         return false;
     }
}

Простой ответ был:

public boolean lookBetter() {
      return b < a;
}

Итак, похоже, что здесь у нас снова есть это неявное предположение, что в случае b

Ответы [ 9 ]

13 голосов
/ 29 января 2009

Это не «неявное предположение», это то, что делает компилятор. b < a - это просто выражение, такое же, как если бы оно использовалось для оператора if. Выражение оценивается как boolean, которое затем возвращается.

Также примечательно, что вы, кажется, обмениваетесь boolean и Boolean, как будто они одинаковы, но на самом деле это не так. boolean - это примитивная форма, в то время как Boolean - это Объект , который окружает boolean.

11 голосов
/ 29 января 2009

Да, это верно для всех логических значений. Вы можете подумать, оценивает ли (выражение) «выражение», чтобы увидеть, является ли оно «истинным» или «ложным». Когда вы делаете

if(b < a == true)

сначала он проверяет, является ли b

if(true == true)

Теперь он проверяет, является ли true == true (что, очевидно, и делает). Java не делает ничего хитрого, когда вы пропускаете лишнее '== true', просто нужно выполнить еще один тест. Нет причины, по которой вы не могли бы сказать:

if(((b < a == true) == true) == true)

но это заставит Java выполнять дополнительный тест каждый раз, когда он видит знак равенства.

5 голосов
/ 29 января 2009

Не усложняйте ваш код. Если вы чувствуете необходимость сказать «a ((((((((...(a<b) == true) == true).... == true)»

"a больше логическим образом таким образом.

1 голос
/ 25 октября 2010

Ваша путаница может быть ослаблена, если вы попытаетесь представить операторы как методы. Используя ваш пример, у вас был оператор <"меньше чем". Для наших целей оператор <действительно может рассматриваться как «метод» (он не похож на один), который принимает два параметра и возвращает логический результат. Если бы «метод» был назван lessThan, ваш пример был бы эквивалентен этому: </p>

public boolean lookBetter() {     
  return lessThan(b, a);     
} 

Возможно, видя это так, немного легче понять? Между прочим, когда я возглавлял группы упражнений на курсе «Программирование 101» в Уни, это оказалось труднее всего преподавать, и многим людям было трудно понять соответствующие концепции. Казалось, что это почти сродни тому, как научиться ездить на велосипеде или плавать. Когда вы поймете, как это работает, это становится очевидным.

1 голос
/ 29 января 2009

Условный Java требует логического значения. Если вы можете поместить его в оператор if, то это уже логическое значение и не требует дополнительных действий, если вам нужно логическое значение.

Действительно, конструкции типа value == true могут быть хитрыми. Я не помню, как правила продвижения в Java, но в C ++ bool может быть повышен до int, где false становится 0, а true становится 1. Поэтому int a = 2; if (a) и int a = 2; if (a == true) будут делать разные вещи.

0 голосов
/ 27 мая 2009

Это не «неявное предположение» или какой-то другой вид магии.
Просто два разных выражения, которые дают одинаковый результат.
Это что-то вроде

int i = 123;
return i;

или

int i = 123;
return i + 0;

«i» и «i + 0» - это два выражения, которые приводят к одному и тому же значению. (Компилятор должен быть достаточно умным, чтобы упростить последнее до того же, что и первое)

0 голосов
/ 30 января 2009

Я думаю, что вы спрашиваете, почему у вас есть концептуальная проблема с ним.

Я думаю, что основная проблема заключается в том, что когда вы прямо возвращаете логическое значение, вы что-то упускаете, и это так. Это имя метода в вашем случае.

Ваш LooksBetter ничего не значит. То, что вы действительно думаете, это:

boolean isEarlier(Time a, Time b) {
    if(a < b) //for simplicity let's ignore that this won't work.
        return true;
    else
        return false;
}

Теперь вы можете уменьшить это до:

boolean isEarlier=a < b;

Хм, теперь мы можем видеть, что a раньше, чем b, и это то, что означает промежуточное значение isEarlier.

Так что если вы как-то усвоили это промежуточное значение, это имеет больше смысла:

boolean isEarlier(Time a, Time b) {
    return a < b;
}

Вы должны думать об этом "логическом" как о реальной ценности, а не просто как о каком-то промежуточном состоянии. Если вам неудобно, не стесняйтесь делать его переменным (это действительно ничего не стоит и может сделать его более читабельным для вас прямо сейчас).

Позже вы оглянетесь на свой код и почувствуете себя более комфортно при более коротком взгляде на него. В большинстве случаев вашему разуму требуется время, чтобы вырастить несколько новых путей, не стесняйтесь в это время быть явными.

0 голосов
/ 29 января 2009

Ваш метод будет работать, но может быть немного неясно, что именно должно произойти, особенно если у вас просто есть переменные с именами a и b. Вы хотите документировать метод и иметь переменные с именами.

Кроме того, если код вводит вас в заблуждение сразу после того, как вы его написали, подумайте о ком-то, кто приедет через 6 месяцев и не поймет, что происходит. Правильная документация и комментарии очень помогут.

0 голосов
/ 29 января 2009

Так же, как в C ++, каждое выражение имеет возвращаемое значение, даже в левой части оператора. Некоторые из сумасшедших C ++, которые я видел, имеют операции слева с назначением их результатов.

Я считаю, что это работает лучше, если я сделаю следующее:

bool result = (b > a);
return result;

Причина только в том, что это немного проще для отладки (почти в любой IDE). Я обнаружил, что всегда заключаю это в скобки, я не совсем уверен, почему. Я думаю, что это поддерживает переменные электроны в тепле, когда они спят ночью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...