В чем разница между '==' и '='? - PullRequest
0 голосов
/ 17 июня 2009

Я знаю, что один из них побитовый, а другой логичный, но я не могу понять это:

Scanner sc = new Scanner(System.in);
System.out.println("Enter ur integer");
int x=sc.nextInt();
if(x=0)//Error...it can not be converted from int to boolean
System.out.println("...");

Ошибка означает, что x нельзя преобразовать в boolean или результат x=0 нельзя преобразовать в boolean.

Ответы [ 12 ]

23 голосов
/ 17 июня 2009

== проверяет равенство. = это присвоение.

Что вы делаете: if( x = Blah ) - в Java этот оператор недопустим, поскольку вы не можете проверить состояние оператора присваивания. В частности, Java не рассматривает присваивание как логическую операцию, которая требуется в операторе if. Это отличается от C / C ++, который позволяет вам рассматривать присваивание как булеву операцию, и может быть результатом многих ошибок, связанных с выпадением волос.

13 голосов
/ 17 июня 2009

Когда вы пишете «x = 0», вы говорите «Сохранить 0 в переменной x». Возвращаемым значением для всего выражения является '0' (это так, поэтому вы можете говорить глупые вещи, такие как x = y = 0).

Когда вы пишете «x == 0», он говорит: «Х равен 0?». Возвращаемое значение в этом выражении будет либо true, либо false.

В Java вы не можете просто сказать, если (0), потому что, если ожидает истинный / ложный ответ. Поэтому указание if (x = 0) не является правильным, но если (x == 0) - это хорошо.

5 голосов
/ 17 июня 2009

== - оператор сравнения, а = - присвоение.

4 голосов
/ 17 июня 2009
== is an equality check. if (x == 0) // if x equals 0
= is an assignment. x = 0; // the value of x is now 0
2 голосов
/ 17 июня 2009

Я знаю, что на вопрос был дан ответ, но время от времени он возникает не как ошибка программиста, а как типографская ошибка (то есть программист знал, что он имел в виду, но потерпел неудачу). Это может быть трудно увидеть, так как эти два выглядят очень похожими.

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

if (0 == x) 
   ...

Таким образом, если я случайно использую только один знак "=", компилятор потерпит неудачу с ошибкой при назначении константного выражения, независимо от того, является ли оператор присваивания левоассоциативным и ожидает ли условие if строго набрал Boolean.

1 голос
/ 18 июня 2009

Одно интересное замечание: поскольку оператор присваивания вычисляется для правого операнда, в Java допустимо следующее (хотя и не очень):

if (( x = blah ) > 0) ...

Скобки необходимы из-за приоритета оператора ('>' связывает сильнее, чем '=').

1 голос
/ 17 июня 2009

Просто чтобы уточнить про C / C ++ - присвоение вычисляется для правого операнда

if(a = n)

оценивается как n, поэтому (n = 1) является истинным (n = 0), является ложным

1 голос
/ 17 июня 2009

интерпретировать ошибку, чтобы означать

"Выражение

x=0

не может быть преобразовано в логическое значение. "

1 голос
/ 17 июня 2009
if(x=0)

Здесь вы присваиваете значение 0 переменной x. Оператор if в Java не может вычислить целочисленный аргумент, как во многих других языках. В Java, если требуется логическое значение. Попробуйте

if(x == 0)

сделать сравнение .

0 голосов
/ 09 февраля 2013

Как уже говорилось, = присваивает, а == сравнивает.

Однако эти операторы также имеют свои собственные значения.

Оператор = возвращает значение своего правого операнда. Вот как работают операторы типа a = b = c = 5: они анализируются как a = (b = (c = 5)), что соответствует a = (b = 5), а затем a = 5.

Оператор == возвращает boolean, то есть true, если его операнды равны. Оператор if запускает свое тело, если его аргумент равен true. Таким образом, if заголовки, такие как if (5 == 5), переводятся в if (true). Вот почему иногда вы видите бесконечные циклы while с заголовком while (true); while цикл запускает «пока» аргумент toe true.

Если бы в вашем операторе if было boolean, он не выдал бы ошибку и запустил бы код, если присваиваемое значение (или «по сравнению с») было true. Вот почему так важно, чтобы никогда не смешивал операторы = и ==, особенно при работе с boolean s.

Надеюсь, это помогло !!

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