Если оператор и && дает ошибку 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
.