Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   if или !if =) (http://mangos.ytdb.ru/showthread.php?t=5527)

lovepsone 19.06.2012 23:04

if или !if =)
 
у меня вопрос глупый но все же:
Недавно я сдавал экзамен. Преподаватель ко мне дошибался на счет такого куска кода как у вас
Код:

if (spellId)
  unitTarget->CastSpell(unitTarget, spellId, true);

Почему??? Я так же написал, а препод поставил не 9 а 8. Или просто препод такой?

rsa 19.06.2012 23:14

Цитата:

Сообщение от lovepsone (Сообщение 27703)
у меня вопрос глупый но все же:
Недавно я сдавал экзамен. Преподаватель ко мне дошибался на счет такого куска кода как у вас
Код:

if (spellId)
  unitTarget->CastSpell(unitTarget, spellId, true);

Почему??? Я так же написал, а препод поставил не 9 а 8. Или просто препод такой?

препод прав. правильная запись будет if (spellId != 0), для того чтобы писать так, как в примере надо держать в уме кучу условностей.

lovepsone 19.06.2012 23:23

но мы же заранее объявили
Код:

uint32 spellId = 0;
А дальше делаем выборку, и,если не чего не совпадает, то мы возвращаем false. Или я просто не различаю когда spellId != 0, или когда мы заранее что-то сделали, и далее сделали выборку, если что то не выбирается то возвращается spellId =0. (Что-то я запутался)

Lordronn 19.06.2012 23:26

Подразумевается что у вас будет перегрузка оператора для uint-a, а в примере вы его не указали

lovepsone 19.06.2012 23:28

Все понял. Спасибо.

virusav 20.06.2012 08:50

В файле SpellEffects.cpp уже было 5-6 подобных проверок, поэтому сделал по аналогии, хотя сначала хотел использовать:
Код:

if (spellId > 0)

Vladimir 20.06.2012 19:10

Чем неправильна if(spellid) для числовых типов и указателей ???
Как ее обобщения даже ввели поддержку if(Type* ptr = expr) в c++

С точки зрения читабельности проверки if(spellid) однозначно лучше. Так как мы проверяем
не равенство нулю какой-то случайной переменной, а задан или нет номер спела, т.е. есть он или нет.

rsa 20.06.2012 19:41

Цитата:

Сообщение от Vladimir (Сообщение 27717)
Чем неправильна if(spellid) для числовых типов и указателей ???

ну например тем, что в данном случае тип не числовой а пользовательский, а объявления его в зоне видимости нету. в результате одному аллаху известно, однозначно ли его преобразование в bool или нет...

Vladimir 21.06.2012 02:23

Цитата:

Сообщение от rsa (Сообщение 27718)
ну например тем, что в данном случае тип не числовой а пользовательский, а объявления его в зоне видимости нету. в результате одному аллаху известно, однозначно ли его преобразование в bool или нет...

Как раз для пользовательских типов более логично использовать if(val) чем if (val !=0) потому что одному богу известно что там числовое возращается и есть ли вообще неявный каст к числовому. А вот каст к bool или отсутствует (что сразу поймем) или будет чем-то осмысленным исходя из значений этого пользовательского типа. C++11 кстати добавил хорошую поддержку - позволяет bool-каст делать explicit и работающим только в таких контекстах как if(). Вообщем с большей вероятностью ожидать разумного определения bool-каста от типа (конечно в зависимости от типа) чем int-каста.

rsa 21.06.2012 07:17

Цитата:

Сообщение от Vladimir (Сообщение 27720)
А вот каст к bool или отсутствует (что сразу поймем) или будет чем-то осмысленным исходя из значений этого пользовательского типа.

Это еще с какой стати мы поймем? Пока о физической компиляции сырцов речи не шло - экзамен, вся проверка "устно". К тому же логика разных компиляторов при касте подобных вещей может быть са-а-авсем разной, с чем я не так давно столкнулся пытаясь кое-что компилить на watcom open c. Так что привязывать все к умирающему мелкософтовскому монстру будет крайне неверно. Например гнуси вообще наплевать что ей кастить в bool, и в некоторых случаях она это делает так, что хоть стой, хоть падай - например при касте енумов :)

KiriX 21.06.2012 07:52

Флудеры, блин =)
Перенёс вашу философскую беседу в более подходящий раздел =)
Название могу сменить =)

Vladimir 21.06.2012 12:27

Цитата:

Пока о физической компиляции сырцов речи не шло - экзамен, вся проверка "устно".
Если тип не известен то проверка if(val !=0) еще более бредовей чем if(val). Если тип числовой то они идентично правельные. Если итоговый тип выражения bool то !=0 хоть и работает (если это не тип в c++11 с explicit bool() - val !=0 не будет компилироваться ), но тоже бред.

Цитата:

Например гнуси вообще наплевать что ей кастить в bool, и в некоторых случаях она это делает так, что хоть стой, хоть падай - например при касте енумов
Ну к 0 то они все одинаково кастанутся, а вот что за int - ненулевое значение будет сильно зависит от знаковости представления enum.
Но реальные проблемы я поимел с кастом к int энумов только из битовых полей.
"Enum m_enum: N;" - вот тогда в сочетании со знаковостью значение действительно очень неожиданно преобразуется на разных платформах.


Текущее время: 08:56. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS