We conclude that default fall through on switches is a design defect in C. The overwhelm-ing majority of the time you don't want to do it and have to write extra code to defeat it.
тоесть 97 % времени мы должны писать дополнительный код в виде ... break; ... break; ... break; и только в 3 % требуется реально fall through
Ругать C за то, что он был задуман как ассемблер уровнем повыше ассемблера – нонсенс. Хотя неплохо бы case [WM_MOUSEFIRST, WM_MOUSELAST):
Да. Отсутствие break вполне оправдано в конструкциях вида Код (Text): switch (state) { case 0: case 1: // операторы break; ... } Хотя осмысленно расширить switch возможно и не удастся (больно он заточен только на отношение эквивалентности).
GoldFinch Оно ничем не оправдано. То, что некий уДафф придумал, как можно использовать врождённое уродство языка (и всё равно его потуги давно уже абсолютно бесполезны на современных процах) - это забавный казус и не более. Типа как шестой палец или третье яйцо.
CyberManiac Какую Вы предлагаете альтернативу безбрейковому свичу для реализации следующей логики Код (Text): ... elif (selector == do_this) { ... } elif (selector == do_this_and_that) { ... } elif ... с сохранением эффективности по размеру и скорости? Приоритет С - гибкость и эффективный бинарный код, а это подразумевает максимум свободы и минимум противодураковых средств. Есть множество других языков, где транслятор выполняет ф-ции няньки.
green Вы сколько таких извращеньицев за всю свою жизнь написали? Я как-то с трудом припоминаю, но точно не больше одной штуки в год. Один раз в год можно и не выёживаясь, ручками - goto никто не отменял. А вот брейки лепить из-за этой долбофичи приходится каждый день по несколько раз.
Off: Рас уж зашол разговор, какой из вариантов IF и SWITCH вы считаете наиболее удобным, и читабельным? Код (Text): \\Такой вид, для случая когда вариантов немного, "IF","THEN","ELSE" должны быть выровнены в одну колонку. IF A == 1,2,... THEN{\*Операторы если A == 1*\} THEN{\*Операторы если A == 2*\} ... ELSE{\*Операторы если A != ни одному из перечисленных*\} \\Тоже без скобок, ключевые слова "IF","THEN","END","ELSE" должны быть выровнены в одну колонку. IF A == 1,2,... THEN: \*Операторы если A == 1*\ END: THEN: \*Операторы если A == 2*\ END: ... ... ELSE: \*Операторы если A != ни одному из перечисленных*\ END: \\Блоки операторов через запятую. IF A == 1,2,... {\*Операторы если A == 1*\},{\*Операторы если A == 2*\},...,ELSE{\*Операторы если A != ни одному из перечисленых*\} \\В одну строку без скобок, весь оператор должен быть в одной строке IF A == 1,2,... THEN:\*Операторы если A == 1*\ THEN:\*Операторы если A == 2*\ THEN:... ELSE:\*Операторы если A != ни одному из перечисленых*\ \\Объединение нескольких "IF" в один оператор, "IF","THEN","ELSE" должны быть выровнены в одну колонку. IF A == 1 THEN{\*Операторы если A == 1*\} IF A == 2 THEN{\*Операторы если A == 2*\} ELSE{\*Операторы если все условия ложны*\} \\То же, "THEN" должен быть в той же строке что и "IF", а все "IF" и "ELSE" должны быть выровнены в одну колонку. IF A == 1 THEN{\*Операторы если A == 1*\} IF A == 2 THEN{\*Операторы если A == 2*\} ELSE{\*Операторы если все условия ложны*\} \\То же без "THEN","IF" и "ELSE" должны быть выровнены в одну колонку. IF A == 1{\*Операторы если A == 1*\} IF A == 2{\*Операторы если A == 2*\} ELSE{\*Операторы если все условия ложны*\} \\Вариант без скобок, ключевые слова "IF","THEN","END","ELSE" должны быть выровнены в одну колонку. IF A == 1 THEN: \*Операторы если A == 1*\ IF A == 2 THEN: \*Операторы если A == 2*\ ELSE: \*Операторы если все условия ложны*\ END: \\То же но "THEN" в той же строке что и "IF", "IF","END","ELSE" должны быть выровнены в одну колонку. IF A == 1 THEN: \*Операторы если A == 1*\ IF A == 2 THEN: \*Операторы если A == 2*\ ELSE: \*Операторы если все условия ложны*\ END: \\Тоже без "THEN", блок операторов начинается со следующей строки за "IF", "IF","END","ELSE" должны быть выровнены в одну колонку. IF A == 1 \*Операторы если A == 1*\ IF A == 2 \*Операторы если A == 2*\ ELSE: \*Операторы если все условия ложны*\ END: \\С составным условием, "IF","END","ELSE" и всторая часть условий должны быть выровняны в одну колонку. IF A > 1 & A < 5 THEN: \*Операторы если A в диапазоне 2-4*\ A < 8 THEN: \*Операторы если A в диапазоне 2-7*\ ELSE: \*Операторы если A не попадает ни в один из диапазонов*\ END: \\Тоже со скобками, "IF","END","ELSE" и всторая часть условий должны быть выровнены в одну колонку. IF A == 1 THEN{\*Операторы если A == 1*\} 2 THEN{\*Операторы если A == 2*\} ELSE:{\*Операторы если A != ни одному из перечисленных*\} \\Вариант SWITCH SWITCH(\*Первая часть условия*\) CASE(\*Вторая часть условия*\){"Операторы"} CASE(\*Вторая часть условия*\){"Операторы"} ELSE{"Операторы"} \\Тоже без скобок для условий, но "SWITCH","CASE","ELSE" должны быть выровнены в одну колонку. SWITCH \*Первая часть условия*\ CASE \*Вторая часть условия*\{"Операторы"} CASE \*Вторая часть условия*\{"Операторы"} ELSE{"Операторы"} \\Тоже без скобок для операторов, но "SWITCH","CASE","ELSE","END" должны быть выровняны в одну колонку. SWITCH \*Первая часть условия*\ CASE \*Вторая часть условия*\: "Опереаторы" CASE \*Вторая часть условия*\: "Опереаторы" ELSE: "Опереаторы" END:
Следует помнить, что существуют библиотеки. Часто пользователи библиотек используют какую-нибудь библиотеку и знай себе ее нахваливают. При этом некоторые быдлокодеры параллельно говорят что мол вот эта фича в языке не нужна, та фича в языке не нужна, т.к. они, эти быдлокодеры, эти фичи не используют. Только вот эти самые быдлокодеры понятия не имеют как реализованы библиотеки которые они используют, и до этих идиотов не доходит что без этих "не нужных" фич языка некоторые библиотеки просто не могли бы существовать в том виде в котором они существуют. Разумеется я не имею ввиду участников форума wasm.ru, которые по умолчанию считаются грамотными людьми. Просто хочу обратить ваше внимание на то, что вы может в своем коде не юзаете некоторые фичи языка, зато юзаете библиотеки в которых юзаются эти фичи языка.
break по-моему не то чему нужно придираться. Чего-то не хватает в одном языке, используйте другой язык.
AlexCab, всё придумано до нас. Паскалевский case пялит сишный switch в орало и анало. PS В MASM'е никакого break нет и в помине. Был бы нужен - сделали бы. Но break не нужен. Ибо ELSEIF самодостаточен.
CyberManiac По фичастости, но не по эффективности. Сишный свич отлично проектируется на архитектуру железа, в отличие от.
часто использую такие моменты case CASE_N: // действия для N // а потом для M и O case CASE_M: case CASE_O: // действия только для M и O break; так что не так оно и лишнее. введение nobreak добавит лишнюю команду да еще и очень узкого применения. а кэйсы по диапазону есть и активно юзаются в гцц. case 4: case 14..28: case 33:
Самое большое, что раздражает меня при работе (думаю, сам язык С++ тут не при чём) - время компиляции. На работе солюшн собирается 1.5 часа. Бывает, в одном проекте внесёшь изменения после которых приходится всё пересобирать. Или с сервера возьмёшь сорцы нескольких файлов - не собирается, а чтобы собралось приходится брать весь солюшн и, опять, пересобирать. Здесь как-то поднимался вопрос о внутренней организации компиляторов языка C++. Скорее всего виноват не только С++, но и идиотская структура виндосовских исполняемых файлов.
RedLord, х.з. как она распределяет сборку в локальной сети, но на моей машине при сборке грузится только 1 ядро из четырёх. Вот Вам и много задачность, распределение вычислительных мощностей.