Если оператор и && дает ошибку IDE "Синтаксическая ошибка на токене" = ", <= ожидаемая",

У меня есть простая игра с гаданием. У него есть функция спросить, хотите ли вы советы. Он сохраняет ответ в boolean, называемом tips, как показано.

while (run) {
    while (tinvalidrun){
        System.out.println("Do you want any tips? y or n?");
        input=in.next();
        switch(input){
        case "y":
            System.out.println("Ok, we will tell you how close you are!");
            tinvalidrun=false;
            tips=true;
            break;
        case "n":
            System.out.println("Wanna go hard eh? Well, go along!");
            tinvalidrun=false;
            break;
        default:
            System.out.println("You pressed the wrong key!\nDo you have butter fingers?");
        }
    }

Затем у меня есть еще один код, который делает больше переменных и делает случайное число. И, наконец, я получаю пользовательский ввод для догадки и тестирую его:

do {
    System.out.println("Enter a number: ");
    guess = in.nextByte();
    times++;
    if (guess == gval) {
        break;
    } else {
        System.out.println("No luck! Try again!");
        if (tips=true) {
            if (guess < gval) {
                  System.out.println("You are too low!");
            }
            else { 
                System.out.println("You are too high!");
            }
        }
    } 

Я попытался поставить tips=true и guess < gval в один if с помощью &&, но он не работает. Я сделал это:

if(guess<gval && tips=true)

Он просит меня заменить = на <= или что-то в этом роде. Я пытался использовать два оператора if, но когда вы говорите "нет", он все еще показывает советы. Я попытался взглянуть на скобки, но они выглядят отлично. Пожалуйста помоги! Если есть какие-либо упрощения или улучшения или идеи, которые я могу сделать с моим кодом, они приветствуются.

У меня есть еще вопрос. Он падает (очевидно), когда вы пытаетесь ввести письмо в целое число. Я попытался использовать строки и мой цикл tinvalidrun, чтобы избежать этого, но я не могу. Есть ли способ сделать это?  Благодарю!:)

Ответ 1

Тестирование равенства

Вам нужно tips == true или просто if (guess<gval && tips) и if (tips) при тестировании boolean.

= является оператором присваивания , == является оператора равенства. Их легко смешать, но разница огромна...

Логическое назначение также является (неожиданным) тестом равенства

Вы говорите: "Я пробовал использовать два оператора if, но когда вы говорите" нет ", он все еще показывает подсказки". Оператор if ожидает выражения, которое должно иметь тип boolean. Любое присваивание (т.е. tips = true) оценивается как новое значение, присвоенное переменной. Из JLS §15.26.1 Простой оператор присваивания:

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

Поэтому if (tips = true) является допустимым синтаксисом, потому что tips = true является одновременно назначением, а также выражением boolean, которое поэтому может использоваться в if.

В вашем случае tips = true присваивает true tips (даже если он начинался с false), а затем возвращает это новое значение tips. if видит новое значение (true) и продолжает радостно. Поэтому это не тест, изначально tips true. Например, это означает, что следующий текст печатает текст "Oops!":

boolean tips = false;
if (tips=true){
    System.out.println("Oops! This tests as true, but that isn't what we wanted");
}

Как вы можете видеть, объединение задач и тестирование, как правило, плохая идея. Обычно это ошибка, если вы используете = в выражении if/do/while. Иногда это может помочь с краткости, но это, как правило, плохая практика.

Почему if (guess<gval && tips = true) не работает?

Это связано с приоритетом оператора. В выражении if (guess<gval && tips = true) приоритет оператора - <, затем &&, а затем =, поэтому компилятор больше не оценивает часть tips = true как назначение true подсказок. Вы можете использовать скобки, чтобы содержать tips = true, но, как я сказал выше, вам действительно не нужно назначать, чтобы вы могли игнорировать эту деталь .

Тестирование действительного байтового ввода

Для последней части вашего вопроса - вы говорите, что вы получаете недопустимый байт, если кто-то вводит письмо. Я предполагаю, что вы получите java.util.InputMismatchException.

Вы можете использовать Scanner.hasNextByte(), чтобы проверить, является ли вход байтом перед его потреблением. Если это возвращает false, вы можете потреблять и отбрасывать вход с помощью nextLine(), распечатывать сообщение об ошибке и повторять цикл.

В зависимости от того, как вы пишете свой код, вы также могли видеть сообщение из eclipse, такое как "Оператор <= is undefined для типа аргументов boolean, Boolean" или из javac, например "error: неожиданный тип... required: variable, found: value". Никто из них не говорит вам, что ваш синтаксис достаточно запутан, компилятор не может его разобрать.

Ответ 2

if(tips = true) всегда true, потому что здесь присвоено значение true до tips.

Сначала он назначит подсказки true, а затем проверка будет выполнена в if, поэтому ваша часть else будет мертва из-за этого кода, и управление никогда не войдет в часть else.

Если вы хотите проверить, есть ли tips true или нет, вы можете просто написать if(tips), и если вы хотите проверить, является ли это false, чем вы должны написать if(tips == false). Где == проверит равенство, а = присвоит значение или ссылку.

Ответ 3

Во-первых, тест для оператора равенства == not =. Во-вторых, вам не нужен оператор при тестировании логического. if (tips) ... достаточно.

Ответ 4

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

Вместо этого вы должны использовать ==.

Ответ 5

В этой строке

if(tips=true)

single = означает назначение

Это должно быть

if(tips==true)

Ответ 6

Один знак равенства предназначен для назначения, как вы это сделали (guess = in.nextByte();, tinvalidrun=false, tips=true; и т.д.), значение в переменной RHS "помещается" в переменную LHS. Становится равным, т.е. Они содержат одно и то же значение. Для сравнения используйте два оператора равенства, оператор сравнения (foo1 == foo2). несколько операторов

Ответ 7

Есть небольшое изменение, используйте == вместо =

Вместо

if (tips=true)

вы бы сделали

if (tips==true)

Ответ 8

  • Сравнение - double ==, single - присваивание.
  • сравнение с true - это избыточность (но законная).

if(guess < gval && tips==true)

или

if(guess<gval && tips)

В фрагменте кода не отображаются объявления переменных, возможно, вы также сравниваете неправильные типы. Мои фрагменты предполагают, что подсказки boolean.