2013-11-11 2 views
1

нужно некоторое объяснение того, как работает «! =», Я взял это из прошлой экзаменационной статьи теоретически (a == b || a == c || b! = C) должен работать, но когда вы его компилируете, он говорит «Scalene» вместо «Isosceles», он не работает, пока я не сменил его на (! (a == b || a == c) || ​​b! = c)) ,Java-оператор «не равен» нужна помощь

class test { 
public static void main(String[] args) { 
    int a = 5; 
    int b = 5; 
    int c = 10; 

    if (a > 0 & b > 0 & c > 0) { 
     if (a==b && b==c) { 
      System.out.println("Equilateral"); 
     } else if (a==b || a==c || b!=c) { 
      System.out.println("Scalene"); 
     } else if (a+b>c && a+c>b || b+c>a) { 
      System.out.println("Isosceles"); 
     } 
    } 
} 

}

+0

Одно слово: 'короткое замыкание'. – devnull

+0

, когда компилятор видит 'a == b ||' is 'true', остальное не важно –

+0

" в теории (a == b || a == c || b! = C) должно работать «Нет, 't, вы делаете противоположный тест на то, что представляет собой скальный треугольник. Не уверен, что проблема в том, что вы не знаете, как работают основные операторы и условия в Java, или вы не знаете, что такое скалярный треугольник. –

ответ

0

Проблема в вашем вопросе не имеет ничего общего с !=, но с ||. Когда он оценивает утверждение и видит, что a==b, он говорит: «Ну, это правильно, поэтому я закончил». Если вы хотите, чтобы он соответствовал всем трем, вы должны использовать && вместо ||.

4

Он работает, как ожидалось.

если a=5, b=5 такой (a==b) есть true. В этом случае (a==b || a==c || b!=c) также является true. (поскольку a==b)

0

Выражения Java вычисляются слева направо. И с оператором сравнения OR (||), если условие оценивается как true, остальные условия справа игнорируются. То почему

else if (a==b || a==c || b!=c) 

оценивается как истина, потому что a==b результаты верно из-за того, что оба a и b инициализируются со значением 5.

1

Оператор! инвертирует условие. если это правда, оно будет ложным, если false, это будет правдой.

0
(a==b || a==c || b!=c) 

, если один из них истинно, то она будет идти внутри, если условие>

0

Выражение (A || B) оценивается следующим образом.

Если A истинная оценка выражения останавливается там и возвращает true, поскольку A || false или A || true истинно, в любом случае он не будет проверять значение B.

Если A является ложной оценкой, то она не прекращается там, как в вышеуказанном случае, а затем проверяется значение B. поскольку false || true - true, но false || false false.

Как вы можете видеть, только когда значение A является ложным B имеет какое-то значение, иначе это трата драгоценного времени выполнения для оценки B. Это суть оценки коротких замыканий операторов!

Выражение (A & & B) также оценивается аналогичным образом. Если A ложно, оценка выражения останавливается, и возвращается false. Если A истинно, то проверяется значение B.

Для получения дополнительной информации по этому вопросу, пожалуйста, прочитайте эту link.

0

При оценке этого

if (a==b || a==c || b!=c) 

компилятор видит a==b, который true и поэтому не оценивает выражение дальше.

Если вы хотите, чтобы компилятор оценил полное выражение, используйте | вместо ||.

В любом случае для Scalene треугольник вы проверяете неравномерность сайтов, а не равенство. Таким образом, вы можете использовать:

if (a!=b && a!=c && b!=c) 
+0

Это все еще неправильно, это должно быть && not ||. Что, если a! = B истинно, но a! = C неверно (т. Е. Стороны a и c имеют одинаковую длину)? Это все равно вернет true, хотя треугольник ** не является ** scalene. –

+0

Yup. Обновлено. – Nils

Смежные вопросы