Разница между написанием == 2 и 2 == a

0

У меня вопрос в голове. Во многих местах я видел

int a=2;
if(2==a){
  //Some operation
}

Можете ли вы сказать мне, что является преимуществом при сравнении на 2==a вместо a==2.

  • 1
    нет разницы, нет преимущества. :)
  • 5
    Это называется yoda conditons, и с современным компилятором это больше не нужно.
Показать ещё 2 комментария
Теги:

2 ответа

11
Лучший ответ

Некоторым людям нравится делать это, чтобы вызвать ошибку, а не неправильное поведение, если они случайно набрали = вместо ==. Однако:

  • это помогает только в некоторых случаях (когда одно из сравниваемых значений может быть изменено, а другое - нет)
  • любой достойный компилятор выдаст предупреждение, если вы сделаете эту ошибку (добавьте круглые скобки и/или явное сравнение, если вы действительно хотите назначить)

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

Лучшей привычкой может быть объявление всех переменных const, если вы специально не хотите, чтобы их изменяли. Это также предотвратит случайное присвоение, делая код более легким, чем сложнее рассуждать.

  • 0
    Да - это помогает обнаруживать опечатку (2 = x), когда подразумевается (2 == x) Нет - компилятор не обнаруживает (x = 2), когда подразумевается (x == 2). Читателю-человеку очень легко сначала приспособьтесь к буквальному (и, таким образом, не запутавшемуся чтению), и человеку-писателю на удивление трудно избежать опечатки (так все еще бывает). Получение компилятора, помогающего обнаружить / предотвратить эту ошибку, полезно. Зачем ждать ошибки времени выполнения для отладки?
  • 2
    @ DOUGLASO.MOEN: Действительно, не ждите ошибки во время выполнения. Как я уже сказал, любой приличный компилятор выдаст предупреждение, если вы допустите эту ошибку (несмотря на ваше очевидное утверждение, что они этого не сделают).
Показать ещё 2 комментария
3

Это стало известно после рассказа, упомянутого в предисловии/введении в книге " Программирование программистов": Deep C Secrets. Питер ван дер Линден. В этой концепции была ошибка в размере 20 миллионов долларов. Поэтому эксперты из этой книги

if (i=3)
instead of:
if (i==3)

У некоторых программистов появилась привычка писать буквальный сначала, например: if (3 == i). Затем, если знак равенства случайно исключен, компилятор будет жаловаться на " попытку присвоения литералу ". Это не будет защищать вас при сравнении двух переменных, но каждый бит помогает.

Весной 1993 года в группе разработки операционной системы в SunSoft у нас был отчет об ошибке "приоритет один", описывающий проблему в асинхронной библиотеке ввода-вывода. Ошибка заключалась в продаже оборудования стоимостью 20 миллионов долларов для клиента, который специально нуждался в библиотечной функциональности, поэтому мы были очень мотивированы, чтобы найти его. После некоторых интенсивных сеансов отладки проблема была окончательно прослежена до утверждения, которое гласило:

х == 2;

Это была опечатка того, что должно было быть выражением о назначении. Палец программиста отскочил на ключ "равно", случайно нажимая его дважды, а не один раз. Заявление, написанное по сравнению с x на 2, сгенерировало true или false и отменило результат.

  • 0
    Как получилось, что компилятор не предупредил вас? Не все предупреждения активированы или слишком много ложных предупреждений?
  • 1
    @Deduplicator: Об этом - в двух средах, в которых я заключил контракт, местные жители, казалось, полагали, что все комментарии были тривиальными, и поэтому игнорировали их. Я полагаю, они были просто поражены. В прошлый раз, когда я проверял, у сборки, над которой я работал, было 25 000 предупреждений. Если были какие-либо из этих опечаток, я уверен, что они не нашли их до времени выполнения. 25000/300 = 83. Я установил макрос (в emacs), посмотрел каждое 83-е предупреждение и свел каждое из них в таблицу. К вашему сведению: 97% предупреждений были (более или менее) безвредны. Находя эти другие 3%, у меня были другие назначения. Мой код не был предупрежден.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню