Стиль написания - if vs ?:
От: Begemot_ Россия http://softvoile.com/
Дата: 17.03.10 06:28
Оценка:
вот так вот считается нормальным
 int t = x ? 5 : 7;


А вот так

  x ?  add(t) : remove (t);


Я не встречал, хотя имхо это более читабельнее чем
 if (x) 
   add(t);
 else
   remove()t;

 или 
 
 if (x) add(t); else remove(t);


Почему так не пишут или я ошибаюсь и это нормально и принято?
--
Блог шароварщика
[url=http://begemotov.net/wxwidgets/]Микроблог про wxWidgets[/url
--
Блог шароварщика ::Микроблог про wxWidgets
Re: Стиль написания - if vs ?:
От: 0x7be СССР  
Дата: 17.03.10 07:51
Оценка: 2 (2)
Здравствуйте, Begemot_, Вы писали:

B_>Почему так не пишут или я ошибаюсь и это нормально и принято?

Предпочитаю использовать тернарный оператор, если речь идет только о возвращении значения и условный оператор, если имеются побочные эффекты.
Re: Стиль написания - if vs ?:
От: jazzer Россия Skype: enerjazzer
Дата: 17.03.10 08:49
Оценка:
Здравствуйте, Begemot_, Вы писали:

у тернарного оператора много ограничений, вообще-то. По сравнению с ифом.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Стиль написания - if vs ?:
От: Кодт Россия  
Дата: 17.03.10 09:24
Оценка: 2 (2) +2
Здравствуйте, Begemot_, Вы писали:

За тернарный оператор:
— позволяет запихнуть всё в одно выражение
— позволяет избежать присваиваний, заменяя их конструированием
— позволяет использовать временные объекты, это полезно для RVO (которое любят компиляторы; тогда как NRVO им даётся с бОльшим трудом)
const Foo x (a() ? b() : c()); // даже copy constructible может не потребоваться
foo(d() ? e() : f());

// versus

/*nonconst*/Foo x; // default constructible, assignable
if(a()) x = b(); else x = c();

if(d()) foo(e()); else foo(f());


За if на разных строчках:
— позволяет ставить брекпоинты на ветках
— не требует однотипности веток

За if на одной строчке:
— кр-сть — с-а т.!

Короче говоря, однострочный if — это худший вариант.
Перекуём баги на фичи!
Re: Стиль написания - if vs ?:
От: zitz  
Дата: 17.03.10 12:01
Оценка:
Здравствуйте, Begemot_, Вы писали:

B_>Почему так не пишут или я ошибаюсь и это нормально и принято?


Я в своём коде использую только для возвращаемоего параметра.
1 условия с else имеют свойство разрастаться, к томуже 2 не поставить бряку на ветку, просто тупо чтобы не путать 3 (тернальный на возвращаемое только), 4 чтобы иметь одинакое строение условий везде (не везде есть else, как то тупо в одном месте писать x ? foo1() : foo2(); а во втором if ( x ) foo(); )
Вот такие причины лично у меня.

Резюме:
1. Если тебя это не смущает, то пользуйся на здоровье
2. Если у тебя тревожно на душе из-за такого написания, то не пиши так и спи спокойно
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: Стиль написания - if vs ?:
От: Alexander G Украина  
Дата: 17.03.10 13:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>- не требует однотипности веток


примерчик:
struct B {};
struct D1 : B {};
struct D2 : B {};

B * f()
{
  return 0 ? new D1 : new D2; // error C2446: ':' : no conversion from 'D2 *' to 'D1 *'
}
Русский военный корабль идёт ко дну!
Re[3]: Стиль написания - if vs ?:
От: Кодт Россия  
Дата: 17.03.10 14:50
Оценка:
Здравствуйте, Alexander G, Вы писали:

К>>- не требует однотипности веток

AG>примерчик:

Вот именно. В данном случае компилятор мог догадаться, что у типов операндов (D1* и D2*) есть общий супертип B* — но он не обязан это делать.
Перекуём баги на фичи!
Re[3]: Стиль написания - if vs ?:
От: Аноним  
Дата: 18.03.10 12:07
Оценка: -1
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Кодт, Вы писали:


К>>- не требует однотипности веток


AG>примерчик:

AG>
AG>struct B {};
AG>struct D1 : B {};
AG>struct D2 : B {};

AG>B * f()
AG>{
AG>  return 0 ? new D1 : new D2; // error C2446: ':' : no conversion from 'D2 *' to 'D1 *'
AG>}
AG>


B * f()
{
  return 0 ? (B *)new D1 : new D2; // error C2446: ':' : no conversion from 'D2 *' to 'D1 *'
}


Re[4]: Стиль написания - if vs ?:
От: Alexander G Украина  
Дата: 18.03.10 14:15
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>
А>B * f()
А>{
А>  return 0 ? (B *)new D1 : new D2; // error C2446: ':' : no conversion from 'D2 *' to 'D1 *'
А>}
А>


А>


Работает. Но конструкция выглядит ещё неудобнее.
И кстати, такое преобразование компиляторы не любят:
http://rsdn.ru/forum/cpp/3078161.1.aspx
Автор: Were
Дата: 26.08.08

http://rsdn.ru/forum/cpp/3079712.1.aspx
Автор: Were
Дата: 27.08.08
Русский военный корабль идёт ко дну!
Re: Стиль написания - if vs ?:
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.03.10 18:17
Оценка: 2 (2) +2 :))) :))) :)
Здравствуйте, Begemot_, Вы писали:

B_>А вот так


B_>
B_>  x ?  add(t) : remove (t);
B_>


А вот так, по-моему, еще круче
(x ? add : remove) (t);
Re[2]: Стиль написания - if vs ?:
От: Pavel Dvorkin Россия  
Дата: 19.03.10 10:36
Оценка: :)
Здравствуйте, Pzz, Вы писали:

Pzz>А вот так, по-моему, еще круче

Pzz>
Pzz>(x ? add : remove) (t);
Pzz>


А так еще лучше

(x ? add : remove) (t ? a : b);

после чего читающий этот код долго чешет в затылке, пытаясь понять, что же сделали и с чем.
With best regards
Pavel Dvorkin
Re[3]: Стиль написания - if vs ?:
От: Pzz Россия https://github.com/alexpevzner
Дата: 19.03.10 11:44
Оценка: :))) :)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>(x ? add : remove) (t ? a : b);


А можно и так:

(a ? add : remove)( (y ? a : b)[ z ? c : d ] );

Re[4]: Стиль написания - if vs ?:
От: CreatorCray  
Дата: 19.03.10 14:12
Оценка: 1 (1) +1
Здравствуйте, Pzz, Вы писали:

Pzz>(a ? add : remove)( (y ? a : b)[ z ? c : d ] );

Да здравствует обфускация!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Стиль написания - if vs ?:
От: minorlogic Украина  
Дата: 20.03.10 10:16
Оценка:
Для меня if намного более читабелен. Мне кажется условный оператор был введен только для потдержки макросов типа MAX()
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Стиль написания - if vs ?:
От: gear nuke  
Дата: 21.03.10 00:33
Оценка: :))) :))
Здравствуйте, CreatorCray, Вы писали:

Pzz>>(a ? add : remove)( (y ? a : b)[ z ? c : d ] );

CC>Да здравствует обфускация!

ИМХО код вполне читается, а так же самодокументирован: не лезь а то убъёт!
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Стиль написания - if vs ?:
От: gear nuke  
Дата: 21.03.10 00:41
Оценка: +2
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>А так еще лучше


PD>(x ? add : remove) (t ? a : b);


PD>после чего читающий этот код долго чешет в затылке, пытаясь понять, что же сделали и с чем.


Какие сложности? В зависимости от x выбирается функтор, а зависимости от t — его аргумент. Своеобразный такой сurrying на C

Чесать в затылке лично мне приходится думая "как это переписать на if", "как поддерживать такой if"...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Стиль написания - if vs ?:
От: Pzz Россия https://github.com/alexpevzner
Дата: 21.03.10 11:53
Оценка:
Здравствуйте, gear nuke, Вы писали:

Pzz>>>(a ? add : remove)( (y ? a : b)[ z ? c : d ] );

CC>>Да здравствует обфускация!

GN>ИМХО код вполне читается, а так же самодокументирован: не лезь а то убъёт!


А это мысль! А то у меня часто возникает обратная проблема: лезут, а убивать приходится мне, а у меня для этого характер слишком мягкий
Re[4]: Стиль написания - if vs ?:
От: Pzz Россия https://github.com/alexpevzner
Дата: 21.03.10 11:58
Оценка: +2
Здравствуйте, gear nuke, Вы писали:

PD>>(x ? add : remove) (t ? a : b);


PD>>после чего читающий этот код долго чешет в затылке, пытаясь понять, что же сделали и с чем.


GN>Какие сложности? В зависимости от x выбирается функтор, а зависимости от t — его аргумент. Своеобразный такой сurrying на C


Между прочим, если бы у "функтора" был не один аргумент, а пяток, то так по-моему сильно понятнее выглядит, отдельно выбирать функцию в зависимости от обстановки, а потом одним махом вызывать уже выбраную. Иначе приходится дублировать вычисление аргументов, со всеми вытекающими прелестями копипасты.

Если бы вариантов было не два, а больше, имело бы смысл завести указатель на функцию, вычислить его, а потом позвать.
Re: Стиль написания - if vs ?:
От: alex-t  
Дата: 12.04.10 14:24
Оценка:
Здравствуйте, Begemot_, Вы писали:

B_>Почему так не пишут или я ошибаюсь и это нормально и принято?


ИМХО тренарный оператор используем там, где он позволяет избежать дублирования кода и повысить читаемость, например:
longName = very_very_very_long_function_name (argumentOne, argumentTwo, flag ? number : 45);

т.е. четко видно, чем отличаются ветки (в отличие от if/else).
В случае с return он позволяет избежать дублирования слова return Ну и сэкономить 3 строчки при строгом стиле кодирования (4 строки на if/else) и одну при "самом строгом" (3 строки на тренарный оператор)
Re: Стиль написания - if vs ?:
От: igna Россия  
Дата: 12.04.10 14:37
Оценка: :)
Здравствуйте, Begemot_, Вы писали:

B_>А вот так


B_> x ? add(t) : remove(t);


B_>Я не встречал, хотя имхо это более читабельнее чем

B_> if (x) 
B_>   add(t);
B_> else
B_>   remove()t;


А вот так:

  x && add(t);


читабельнее чем

B_> if (x) 
B_>   add(t);


?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.