Одиночное =
- это присвоение . Если вы хотите проверить на равенство, вы используете double ==
в C и Java.
Должно быть очевидно, что вы делаете неправильные вещи, даже в версии C, поскольку вы устанавливаете a
в 10, а затем, сравнивая его с 20, вы получаете истинное значение.Я не знаю каких-либо математических систем, в которых 10 и 20 считаются равными: -)
Что происходит в вашем случае C, так это то, что присвоение фактически "возвращает" также и значение.
Оператор:
if (a = 20) ...
эквивалентен:
a = 20;
if (a) ...
, поэтому сначала он устанавливает a
в 20, а затем использует его как условие if
,Поскольку 0 ложно, а все остальное верно, тело if
выполняется.
Хороший компилятор (например, gcc
) на самом деле предупредит вас о том, что вы делаете, так что вы нене попасться на эти мелочиНекоторые люди также используют хитрость, заключающуюся в том, чтобы сначала поместить константы:
if (20 == a) ...
, чтобы при ошибочном использовании присваивания это была синтаксическая ошибка.Но я нахожу такой код некрасивым, тем более, что я в основном использую упомянутые выше хорошие компиляторы: -)
Причина, по которой вы получаете ошибку в Java, заключается в том, что она намного строже в том, что вы можете делать с присваиваниями.Под этим я подразумеваю, что нет автоматического преобразования из int
в boolean
, как с C. Таким образом, этот код отказывается компилироваться, выдавая ошибку:
class Test {
static public void main(String[] args) {
int a = 10;
if (a = 20)
System.out.println ("true");
}
}
Но вы можете все же сгорает примерно так:
class Test {
static public void main(String[] args) {
boolean a = false;
if (a = true)
System.out.println ("true");
}
}
Поскольку это присваивание имеет логическое значение внутри if
, оно не вызывает ошибку компиляции из-за неправильного типа.Однако, поскольку он печатает true
, это все равно не то, что вы хотели.
Итог, вернитесь и перечитайте первый абзац.=
- присвоение, ==
- проверка на равенство.