- 1
iInteractionFlagBBS->second->setVisible( (flags & iInteractionFlagBBS->first) ? true : false );
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+7.1
iInteractionFlagBBS->second->setVisible( (flags & iInteractionFlagBBS->first) ? true : false );
Тернарный оператор в скобках жгет
guest 18.06.2009 21:55 # +1
first это указатель?
guest 19.06.2009 18:10 # 0
guest 20.06.2009 00:39 # −1
guest 21.06.2009 18:21 # +1
конструкция
легко заменяется на
так что тернарный оператор тут совершенно излишен. Так-то!
gpr 06.06.2010 16:12 # 0
В твоем примере "легко заменяется" может привести к вызову setVisible(int) а не setVisible(bool), т.е. совершенно другой функции.
Хотя это уже можно будет смело назвать говнокодом.
guest 22.06.2009 09:14 # +2
ворнинг будет по поводу преобразования к bool.
скорее всего, этот код именно ворнинг и лечит, так что не говно это никакое, имхо.
так-то...
guest 22.06.2009 09:14 # +4
К К.О.
Я не большой знаток C++, но Ваш код не эквивалентен исходному.
Исходный код с применением тернарного оператора возвращает логическое значение (true или false).
Ваш код возвращает результат побитового И, и имеет целый (?) тип с массой возможных значений.
Вызов
iInteractionFlagBBS->second->setVisible(...)
возможно требует булевского значения в качестве параметра.
Автор скормил методу булевское значение и этим избавился от вероятных предупреждений компилятора о несоответствии типа формального и фактического параметра.
Такое "лобовое" решение вполне имеет право на существование. Более того, оно весьма наглядное.
guest 23.06.2009 12:46 # −1
1) незнание приоритетов операторов (побитовое И имеет приоритет много выше тернарного оператора выбора)
2) результат побитового И, не являясь булевым типом, легко и безо всяких ворнингов приводится к данному типу: 0 - false, не 0 - true.
Кто-то считает это говном?
int* a = NULL;
if (!a) {}
guest 11.08.2009 12:19 # 0
На пример:
int i = 10; // mov eax, 10
bool x = i; // mov [esi - 8], eax
bool y = false; // mov [esi - 12], 0
if (x || y)
// and eax, 1 // обрезаем старшие биты
// or eax, [esi - 12]
// jz end_of_the_next_block;
{ /* этот код не выполнится */ }
хотя сейчас уже не встретить таких компиляторов.
баги в компиляторе - самое болезненное открытие.
guest 23.06.2009 14:37 # +2
2)
bool f(bool a) {}
...
f(lags & iInteractionFlagBBS->first);
ворнинг гарантирован как минимум на vs2005 при неконстантных значениях операндов, возможно с некоторыми исключениями
3) пример кода с указателем невалиден. поясняю:
int* a = NULL;
bool bTrue = !a; // OK, использован оператор not
bool bFalse = !!a; // OK, прошу заметить два оператора not
bool bWarning = a; // Warning, нет операторов not - неявное приведение типа
guest 10.08.2009 17:59 # 0
Любой код c проверкой на NULL без использования оного NULL - невалиден. Есть, знаете ли, платформы где NULL != 0.
guest 30.06.2009 21:57 # +1
В плюсах не силен, но разве там нет приведения типа, которым можно заменить это тернарное безобразие ?
guest 01.07.2009 05:33 # 0
учитывая, что
то грубо говоря bool - это int, и скормить функции можно любое значение из диапазона.
Другое дело, что в самой функции скорее всего будет проверка в виде
и тернарный оператор будет излишен
guest 06.07.2009 09:29 # +2
(flags & iInteractionFlagBBS->first) != 0
guest 27.07.2009 15:09 # 0
Капитан, кажется, потерял былое знание плюсов. (
Конструкция x не эквивалентна конструкции (x ? true : false) или (x == true) или (x != false)
Никаким другим образом преобразовать значение к bool нельзя
guest 27.12.2009 14:36 # 0
я так пишу в подобных случаях