LINUX.ORG.RU

Как правильно оформлять switch?

 , , ,


1

2

А:

switch (i) {
    case 0:
        zero();
        break;
    case 1:
        one();
        break;
}
Б:
switch (i) {
case 0:
    zero ();
    break;
case 1:
    one ();
    break;
}
В:
switch (i) {
    case 0:
    zero();
    break;

    case 1:
    one();
    break;
}
Г:
switch(i)
{
    case 0:
        zero();
        break;
    case 1:
        one();
        break;
}
Или какой-то другой вариант?

★★★★★
Ответ на: комментарий от anTaRes

У пробелов перед табами есть неоспоримое преимущество: не надо думать где нужно использовать табы (для отступов), а где нужно использовать пробелы (для выравнивания). Ты никогда не ошибешься - просто нажимаешь кнопку таб, а редактор сам подставляет заранее заданное фиксированное количество пробелов. Даже если нужно выравнивание, ты тоже нажимаешь кнопку таб. Не нужна аккуратность, не нужно за собой следить - просто нажимай на таб столько раз, сколько надо.

Несомненно, если правильно использовать табы, я имею ввиду только для отступов, но не для выравниваний, результат будет таким же красивым. Даже получишь гешефт - в виде отступов всегда такого размера, какой предпочитаешь ты сам. Никто уже не скажет тебе - отступы будут три пробела и точка. Любой всегда настроит себе размер отступов сам.

Но за правильным использованием табов приходится следить: «Так, тут у нас табы заканчиваются, и начинаются пробелы, ибо выравнивание», или ещё хуже: «Так, а не наставил ли я где-то пробелов вместо табов в этих двадцати файлах?».

Конечно, есть ещё разные консольные утилиты, которые не знают что таб должен быть меньше, чем восемь пробелов, и выводят код поплывшим, но это наверное мелочи.

anonymous
()
Ответ на: комментарий от nanoolinux

зато когда это перечисление расширишь, а в свиче нет дефота, получишь уб, не?

Не. В стандарте все четко: не будет выполняться ни одна ветка.

anonymous
()
Ответ на: О, тут спрошу! от EXL

case 0: {

после этого можно объявлять локальные переменные.

emulek
()
Ответ на: комментарий от Sorcerer

break; }

а вот это уже говнокод, т.к. ты поломал контекст локального скопа.

emulek
()
Ответ на: комментарий от post-factum

Я тебе чисто сишный код дал.

это устаревшее говно мамонта, которое gcc собирает только для совместимости.

emulek
()
Ответ на: комментарий от anonymous

У пробелов перед табами есть неоспоримое преимущество

это если ты пишешь в notepad.exe.

emulek
()
Ответ на: комментарий от nanoolinux

Ты мне как бы ничего нового не сказал.

Так я тебе как бы ничего нового и не говорил

Что было, то и будет; и что писалось на лоре, то и будет писаться, и нет ничего нового под солнцем.

Бывает нечто, о чем говорят: «смотри, вот это новое »; но это было уже в тредах, бывших прежде нас.

Нет памяти о прежнем; да и о том, что будет, не останется памяти у тех, которые будут после.

anonymous
()
Ответ на: комментарий от post-factum

тебе выше уже доказали, что C++ это не переваривает. А в сишке оно очевидно лишь для совместимости. Я не очень понимаю, какие ссылки ты жаждешь наблюдать, сестра?

emulek
()
Ответ на: комментарий от post-factum

Ссылку на то, что ты называешь очевидным.

ссылку на то, что твой говнокод не является говнокодом слабо дать?

emulek
()
Ответ на: комментарий от post-factum

как раз наоборот: любой код является говнокодом, пока ты не доказал корректность каждой строки.

И да, то, что компилятор пожрал твой говнокод, ничего не доказывает. Компилятор не обязан искать и находить говно в твоём коде, у него нет такой задачи.

emulek
()
Ответ на: комментарий от post-factum

На кой чёрт тогда компилятор вообще выдаёт варнинги и эрроры?

что-бы опечатки ловить.

Warning когда компилятор может такое собрать, но сомневается, что я этого хочу, например

if(x=17)…
если это фича, а не баг, я пишу
if((x=17))…
иногда это удобно. И сразу видно, что это такая ВНЕЗАПНАЯ строчка.

Error соответственно в случае, если собрать не получается.

emulek
()
Ответ на: комментарий от beastie

Конструкции вида Duff's device не совсем с тобой согласны. ;)

ты не понял. Duff's device давно уже не актуальны, и являются просто забавным курьёзом.

Но ещё задолго до них была любопытная оптимизация: прыжок по адресу из таблицы. Т.е. вместо того, что-бы проверять 10 условий, ты просто переходишь на один из 10и адресов. Практически любой CPU так умеет делать, а в сишке для этого и сделали switch/case. Именно по этой причине то, что в switch обязано быть целым числом.

В C++ можно также использовать виртуальные функции, но они вдвое дороже, нужно сначала разименовать адрес VT, а потом прыгать по этой VT. Но всё равно это намного дешевле if.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.