2015-01-08 13 views
1

Заголовок довольно просто, мне было просто интересно, если есть разница (любого вида, производительности или что-нибудь, что приходит на ум) между указанием:Разница между (X! = Y) и (! (X == Y))?

if (!(x == y)) { 

} 

и

if (x != y) { 

} 

Кроме того, x & y - это что-то примитивное или простые объекты, такие как int, String, double и т. д. Не пользовательские объекты. Но если это имеет огромное значение, я был бы рад услышать об этом!

Учитывая, что они оба проверяют равенство, но затем используют «противоположность» после этого, я не уверен, что это другое.

Несмотря на то, что это различие было бы крайне незначительным, оно вызывает мое любопытство!

EDIT:

Поэтому я подумал о том, что (так что вы видите именно то, что я имею в виду) было в то время как печатаю это:

if (!(myTextField.length == 5)) 

вместо

if (mytextfield.length != 5) 

Так вы как я это имел в виду. Длина строки.

+1

В зависимости от специфики оператора может быть и различие. – Sirko

+0

Действительно? Можете ли вы уточнить (может быть, в ответ, чтобы я мог дать вам очки за это). Я думал о int, string, только о регулярных вещах. Не пользовательские объекты. –

+3

Я предполагаю, что вы имеете в виду '(! (X == y))' вместо '(! X == y)'. Если да, не могли бы вы сделать это явным в вопросе? –

ответ

5

!(x == y) и x != y являются логически эквивалентными, и я сомневаюсь, что любой язык, скомпилированный или интерпретируемый, будет оценивать их по-разному LLY. Другими словами, я был бы удивлен, если бы вы обнаружили измеримую разницу.

Некоторые языки, такие как C++ и Scala, позволяют вам переопределить эти операторы, и в этом случае это, конечно, другая история.

+0

Hm, это, по-видимому, одно полезное свойство операторов с плавающей запятой. –

0

Это не то же самое. Но если вы заключите первый, как если бы (! (X == y)), то они равны .

Но в случае, если вы пишете его, как (X! = Y) и (! X == Y),

-первых, это просто, что X не равен Y.

Но во втором (! X == Y) ,,, сначала! X будет оцениваться до сравнения с Y, Позволяет сказать, что если X имеет тип Boolean, то он инвертирует значение X (True для False и False к True), а затем будет сравнивать это до Y

+0

Вы предполагаете, что приоритет оператора C (* et al *) но вопрос языко-агностик. –

+0

Да, но приоритет будет переопределен на любом языке, если скобки правильно используются. –

+2

Мой вопрос был плохо написан, я не имел в виду «противоположность X», я имел в виду «противоположность результата равенства», я забыл круглые скобки. Зная это, есть ли разница между ними? Возможно, производительность? –

-2

!x == y средства if ((x == 0 && y == 1) || (x != 0 && y == 0)). Другими словами, он отличается от x!=y.

+0

Вы предполагаете приоритет оператора C (* et al *), но вопрос является языковым агностиком. –

+0

Если приоритет не похож на 'C', то нет никакой разницы (с хорошим оптимизатором). Тот же вопрос, как «В чем разница между« x! = Y »и« y! = X' ». – i486

+0

Это просто неверно на многих языках. Для небулева, но встроенного 'y', преобразование в boolean означает' y> 1', а не 'y == 1' ... и ваша вещь о' x == 0 && y == 1' просто очевидна бред какой то. –

2

Обычно оператор ! предшествует оператору == или !=.

Следовательно, этот

!x == y 

такая же, как это

(!x) == y 

Таким образом, вы отрицать x, прежде чем сравнивать его у.Это, очевидно, не то же самое, как проверка только для неравенства между x и y:

x != y 

Чтобы убедиться, что равенство проверка выполняется перед отрицанием, вы должны использовать еще одну пару скобок:

!(x == y) 
+0

Вы принимаете приоритет оператора C (* et al *), но вопрос является языковым агностиком. –

+0

@PaulR Я начинаю с «обычно», который ограничивает этот ответ на языки, где это верно. Если это предположение не выполняется для определенного языка, остальная часть ответа становится устаревшей. – Sirko

+1

Я отредактировал вопрос внизу, чтобы быть яснее, я набрал его плохо в моем основном примере –

1

Первый дело менее читаемо. После оптимизации он эквивалентен второму.

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