Re[7]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 04:41
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Здравствуйте, Sheridan, Вы писали:


S>>Тогда там switch не нужен, он становится if'ом при таком раскладе, но с другим синтаксисом и позволяет не писать города из if else.

DE>Не согласен — есть "goto case", который как раз к следующему case переходит. Просто это надо указывать явно (что хорошо). Если не написать ни default ни goto case, то компилятор даст по рукам.
Ну, тут дело привычки скорее.

DE>В любом случае, switch штука удобная даже без возможности "проваливаться". Кстати, он в D, в отличии от C/C++, со строками работать умеет.

Вот да, строк в ц++ не хватает. Но с другой стороны сравнение строк — достаточно дорогая операция и я стараюсь вообще их не сравнивать без необходимости.

S>>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.

DE>Да, "зеркальное поведение", но я согласен с автором темы с тем, что break писать приходится куда чаще, чем сознательно его опускать. Хотя и не помню когда уже допускал такую ошибку, тем более, что ловится легко, как правило. Но всё равно считаю такое умолчание более разумным и удобным.
Опять же, сила привычки. Я привык так, другие этак...

DE>Ну и в C# тоже такое же поведение, только там вместо fallthrough "полноценный goto" по кейсам.

Что, кстати, вряд ли будет использовано, ибо слово goto мало кто терпит в своём коде почему то...

S>>Впрочем, ихний match хотя и мощный, но fallthrough действительно, похоже, нет и они этим показательно гордятся, гм.

DE>У них и goto нет.
DE>Относительно матча — просто он действительно сильно мощнее свитча и большинство вариантов использования плохо применимы с fallthrough. Например:
DE>
DE>match val {
DE>    A(x) => ... ,
DE>    B(x, y) => ... ,
DE>    C(x, y, z) => ... ,
DE> }
DE>

Да я повкуривал руст. Интересный язык, мне будет интересно на ём чего нибудь пописать.
Matrix has you...
Re[14]: о0
От: AlexRK  
Дата: 18.12.15 06:46
Оценка:
Здравствуйте, Sheridan, Вы писали:

ARK>>C#: https://ideone.com/BMkFax

ARK>>break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
S>Да. Приходится извращаться, чтобы добиться поведения ц++ https://ideone.com/w2eCYM

Да, из кейса можно выйти по goto, continue, return, throw, или сунуть туда бесконечный цикл. Тогда можно обойтись без брейка. Но это все же явно происходит.

ARK>>В этих языках ни break, ни аналогов, ни антиподов нет. Все в точном соответствии с примитивом "ветвление" в структурном программировании. Так что эти примеры демонстрируют только синтаксис.

S>То есть тот же if, только разветвленный. Печаль

Отличие от if в том, что мы имеем дело не с кучей условий, а с кучей значений. Пишется компактнее, ну и предназначено для другого в общем-то.
Re[15]: о0
От: Sheridan Россия  
Дата: 18.12.15 06:48
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Да, из кейса можно выйти по goto, continue, return, throw, или сунуть туда бесконечный цикл. Тогда можно обойтись без брейка. Но это все же явно происходит.

ARK>Отличие от if в том, что мы имеем дело не с кучей условий, а с кучей значений. Пишется компактнее, ну и предназначено для другого в общем-то.

Мне всё равно непонятно, чем ц++ свич не угодил
Matrix has you...
Re[14]: о0
От: AlexRK  
Дата: 18.12.15 06:49
Оценка: 5 (1)
Здравствуйте, DarkEld3r, Вы писали:

DE>Вот так не ругается:

DE>https://ideone.com/zVqfmz
DE>Странно, в общем. Хотя я С# не знаю.

Похоже на ошибку в компиляторе Mono. C# не допускает проваливаний через ветки, и на дотнете этот код не компилируется.
Re[16]: о0
От: AlexRK  
Дата: 18.12.15 06:56
Оценка: :)
Здравствуйте, Sheridan, Вы писали:

S>Мне всё равно непонятно, чем ц++ свич не угодил


В структурном программировании есть набор базовых примитивов, из которых строится все остальное. Это последовательность, цикл и ветвление. Ц++ свитч не вписывается в этот набор — это ветвление со встроенным goto. Чем плох или хорош goto — сломано много копий. В целом он признан скорее вредным, чем полезным (хотя некоторые люди считают, что иногда он к месту). Ситуацию с сишным свитчем еще усугубляет то, что goto в нем является неявным. Лучше ли явное, чем неявное? Все тоже считают по-разному.
Re[17]: о0
От: Sheridan Россия  
Дата: 18.12.15 07:04
Оценка: :)
Здравствуйте, AlexRK, Вы писали:

S>>Мне всё равно непонятно, чем ц++ свич не угодил

ARK> Лучше ли явное, чем неявное? Все тоже считают по-разному.
Ну break же явно прописываются. Что не так?
Matrix has you...
Re[13]: семантика switch/case
От: neFormal Россия  
Дата: 18.12.15 07:40
Оценка: +2 :))
Здравствуйте, T4r4sB, Вы писали:

F>>ага, лёгкий способ завалить человека на собеседовании.

TB>Зачем? Если очень хочется не принимать человека, то можно и так сказать.
TB>А если собеседующий всерьёз считает, что знание подобных конструкций нужно программисту, то он идиот.

человек заявляет, что знает c++ наотлично, но не знает таких простых вещей?
...coding for chaos...
Re[10]: Теперь понятно.
От: T4r4sB Россия  
Дата: 18.12.15 07:42
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, T4r4sB, Вы писали:


S>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.

Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[8]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 07:43
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, T4r4sB, Вы писали:


TB>>Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть.

S>Всего лишь надо сделать над собой усилие и выучить, наконец то, язык, на котором пишешь.

Ну вот вызубришь ты наизусть фразу "при езде на лошади стоя надо не падать вперёд, назад, влево и вправо". И всё, теперь ты не будешь падать с лошади при езде стоя. Ведь ты же запомнил правила! А физических ограничений человеческого мозга — их не, не существует, они только у лохов.

S>Какая у тебя цель? Потрындеть? Тогда не со мной.


Доказать, что все "я никогда на этом не ошибаюсь" либо врут, потому что похвастаться охота, крутым себя показать, либо... не очень опытны. Это как "я использую сырые массивы и указатели, потому что только лохи ошибаются в индексе и забывают написать free". Кульные какиры такие. Они думают, что они умнее этих перестраховывающихся "ламеров", лол.
То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 18.12.2015 7:47 T4r4sB . Предыдущая версия .
Re[8]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 07:50
Оценка:
Здравствуйте, ononim, Вы писали:

O>А потом набегут питонисты, и начнут говорить что проваливающийся в пределах отступа if — плохо, что они по привычке написали

O>на что кстати лично я напарывался чисто механически, во всяком случае мне это запомнилось, в отличии от проваливающихся кейсов.

Вот это не очень распространённый косяк. Хотя против обязательных скобочек ничего не имею, при условии, что введут слово elseif (иначе будет уродливый уголок).
Понятно, что некоторые вещи вообще нельзя никак обезопасить, например, опачатаешься и напишешь * вместо + (хотя и там можно ввести контроль за физической размерностью величин, ну или + вместо -), но это не повод оправдывать совсем откровенные идиотизмы в дизайне языка.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[11]: Теперь понятно.
От: Sheridan Россия  
Дата: 18.12.15 08:26
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
TB>Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
Могу в тебя твою же фразу отразить
Matrix has you...
Re[12]: Теперь понятно.
От: T4r4sB Россия  
Дата: 18.12.15 08:36
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Здравствуйте, T4r4sB, Вы писали:


S>>>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>>>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
TB>>Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
S>Могу в тебя твою же фразу отразить

Не можешь, потому что аналогию начал я.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 08:54
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>Всего лишь надо сделать над собой усилие и выучить, наконец то, язык, на котором пишешь.


TB>Ну вот вызубришь ты наизусть фразу "при езде на лошади стоя надо не падать вперёд, назад, влево и вправо". И всё, теперь ты не будешь падать с лошади при езде стоя. Ведь ты же запомнил правила!

Достал ты с лошадью. Неверная аналогия. Верной была бы если бы разговор шел о "А чего там программировать то? Научись на кнопки жать и всё! Вот клавиатура, вот мышь, вот монитор. Нет, вот это — клавиатура. Ага. Программируй."

TB>А физических ограничений человеческого мозга — их не, не существует, они только у лохов.

Ну приблизительно както как бы да. Всё зависит от заинтересованности в обучении по большому счёту.

S>>Какая у тебя цель? Потрындеть? Тогда не со мной.

TB>Доказать, что все "я никогда на этом не ошибаюсь" либо врут, потому что похвастаться охота, крутым себя показать, либо... не очень опытны.
Ну гдето рядом я сдал назад, согласившись, что не во всех языках поведение switch такое же, как и у ц
Но относительно свича неправ ты. Тут не надо гнать на язык. Надо тупо знать особенности. Пишешь на языке? Знай его. Не знаешь языка — не пиши на нём. Плохо знаешь и пишешь — изучай и запоминай.
Я когда то на форте немного писал. Своеобразный язык. Категорически своеобразный. И ничо, и не трындел на форумах, а обложился доками и вкурил. Питон в своё время вкурил тупо из интереса, пэхапэ. И ничё.
Что с тобой то не так, чего ты нервничаешь о поведениии свича?

TB>Это как "я использую сырые массивы и указатели, потому что только лохи ошибаются в индексе и забывают написать free". Кульные какиры такие. Они думают, что они умнее этих перестраховывающихся "ламеров", лол.

А чего сразу не "Я открываю блокнот, пишу в туда символы и сохраняю как app.exe, а остальные лохи"?

TB>То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.

Это не проблема языка, это проблема программистов, которым трудно правила запомнить.
Matrix has you...
Re[13]: Теперь понятно.
От: Sheridan Россия  
Дата: 18.12.15 08:55
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>>>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>>>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>>>>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
TB>>>Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
S>>Могу в тебя твою же фразу отразить
TB>Не можешь, потому что аналогию начал я.
А кто мне запретит?
Matrix has you...
Re[6]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 09:24
Оценка:
Здравствуйте, ononim, Вы писали:

O>Последний раз когда писал под МК (на C, да) N было равно 0.008

Завидую.
На самом деле руки чешутся чтото вот такое пописать, но задач таких нет. А чешется не так сильно, чтобы придумывать себе задачу и закупаться оборудованием
Matrix has you...
Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 09:31
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Достал ты с лошадью. Неверная аналогия. Верной была бы если бы разговор шел о "А чего там программировать то? Научись на кнопки жать и всё! Вот клавиатура, вот мышь, вот монитор. Нет, вот это — клавиатура. Ага. Программируй."


Аналогию ты понял, а вот это "ой, там не так, а так" — это отмазки.

S>Ну приблизительно както как бы да. Всё зависит от заинтересованности в обучении по большому счёту.


Я не знаю, может ты киборг, но это уже из серии "раз я такой, значит все такие".

S>Ну гдето рядом я сдал назад, согласившись, что не во всех языках поведение switch такое же, как и у ц

S>Но относительно свича неправ ты. Тут не надо гнать на язык. Надо тупо знать особенности. Пишешь на языке? Знай его. Не знаешь языка — не пиши на нём. Плохо знаешь и пишешь — изучай и запоминай.

Ты уже страницу путаешь слова "знать правило" и "быть всё время внимательным, как оператор ядерного реактора". Ты можешь выучить хоть как все правила, но в плохом языке они не спасут тебя от ошибок, которые компилятор пропустит. Потому что ошибки бывают случайные, а не от незнания.

S>Что с тобой то не так, чего ты нервничаешь о поведениии свича?


Я не люблю ходить по помещению, в котором по полу раскиданы грабли. Да, я знаю, что на грабли наступать не надо, и знаю их расположение, но от этого блин не становится так же легко, как если этих грабель не было. И если я наступлю на граблю, то это не потому, что я якобы не знаю, что на грабли наступать не надо, понимаешь?

TB>>Это как "я использую сырые массивы и указатели, потому что только лохи ошибаются в индексе и забывают написать free". Кульные какиры такие. Они думают, что они умнее этих перестраховывающихся "ламеров", лол.

S>А чего сразу не "Я открываю блокнот, пишу в туда символы и сохраняю как app.exe, а остальные лохи"?

Потому что тех, кто пишет символы, я не встречал, а любителей сырых массивов и сырыых указателей я навидался немало. Аргументация абсолютно такая же — они уверены, что всё смогут контролировать, а кто не может (или просто считает, что голову можно забить более интересными вещами) — те просто программировать не умеют.

TB>>То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.

S>Это не проблема языка, это проблема программистов, которым трудно правила запомнить.

Да ты один в белом коне походу. Только непонятно, как же такой исключительный ты до сих пор не может понять разницу между способностью выучить правило и способностью всегда быть начеку. По твоей логике, когда человеку падает кирпич на голову, то это лишь потому, что он не знал, что от кирпичей по голове становится плохо, а если человек в гололёд поскользнулся и упал, то это потому, что он не знает, что не надо падать.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[18]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:18
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, _hum_, Вы писали:


__>>кхм.. а почему тогда сопроводили свой пример текстом "на всякий случай, а то ещё скажите, что не видели: "? обычно такой коммент постят к "каноническим" вещам, которые не знать стыдно...

BFE>Это канонический приём любителей макросов. Можно даже сказать, не побоюсь этого слова, паттерн.

ааа, вот теперь, полазив по нету, понял, для чего это делается. что ж вы сразу-то не сказали, что это не описка, и там действительно должен быть while(false), а сам блок "фиктивного цикла" выполняет двоякую роль
1) позволяет реализовать подобие goto за счет срабатывания break;
2) позволяет заворачивать в макрос блок кода с возможностью использования этого макроса в коде в варианте с точкой запятой (например, if(<condition>) MACROS; else <bla-bla>)
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:20
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, _hum_, Вы писали:


__>>... и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан


VF>Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch


ну я же не знал. почему вы полагаете, что мой случай уникален?
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:46
Оценка: 12 (1) +2
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, _hum_, Вы писали:


__>>Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:


CS>На вот еще для просветления:

CS>http://www.codeproject.com/Tips/29524/Generators-in-C



да, спасибо. это начинает прояснять ситуацию с тем, где же, действительно, может быть полезна эта фича.

подводя итог:

1) switch/case — не аналог if, а аналог динамического goto. тот факт, что многие его таким не воспринимают (в том числе и я до недавнего времени), думаю, является результатом того, что в большинстве случаев он используется с break, то есть, в качестве выбора из альтернатив + в учебниках и доках всегда идет в той же теме, что и if, наводя на мысли, что это "из одной оперы", как for и while, а потому бдительность падает + выбор ключевых слов неудачен — не наводит на мысль о goto-переходах и метках (gotocase вместо switch, например, сразу бы наводило ан нужные мысли);

2) это штука в с++ дает возможность реализовать механизм перехода по динамически определяемой метке, чего другими средствами добиться невозможно (только если использовать ассемблерные вставки). в качестве реально полезного применения можно привести возможность реализации на си сопрограмм и парадигмы реактивного программирования (см., например, Reactive C: An Extension of C To Program Reactive Systems)
Re[11]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 10:48
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, Sheridan, Вы писали:


S>>Достал ты с лошадью. Неверная аналогия. Верной была бы если бы разговор шел о "А чего там программировать то? Научись на кнопки жать и всё! Вот клавиатура, вот мышь, вот монитор. Нет, вот это — клавиатура. Ага. Программируй."

TB>Аналогию ты понял, а вот это "ой, там не так, а так" — это отмазки.
Я то аналогию понял, но она неверная.

S>>Ну приблизительно както как бы да. Всё зависит от заинтересованности в обучении по большому счёту.

TB>Я не знаю, может ты киборг, но это уже из серии "раз я такой, значит все такие".
Я не киборг, я обычный админ.

S>>Ну гдето рядом я сдал назад, согласившись, что не во всех языках поведение switch такое же, как и у ц

S>>Но относительно свича неправ ты. Тут не надо гнать на язык. Надо тупо знать особенности. Пишешь на языке? Знай его. Не знаешь языка — не пиши на нём. Плохо знаешь и пишешь — изучай и запоминай.
TB>Ты уже страницу путаешь слова "знать правило" и "быть всё время внимательным, как оператор ядерного реактора". Ты можешь выучить хоть как все правила, но в плохом языке они не спасут тебя от ошибок, которые компилятор пропустит. Потому что ошибки бывают случайные, а не от незнания.
То есть ты хочешь сказать, что отсутствие бряка в свиче — ошибка??? о0
Это не ошибка. На самом деле и пресловутая if(val=15) {} не ошибка. ВНЕЗАПНО, да? Работать начинает по другому, да. Но не ошибка.

S>>Что с тобой то не так, чего ты нервничаешь о поведениии свича?

TB>Я не люблю ходить по помещению, в котором по полу раскиданы грабли. Да, я знаю, что на грабли наступать не надо, и знаю их расположение, но от этого блин не становится так же легко, как если этих грабель не было. И если я наступлю на граблю, то это не потому, что я якобы не знаю, что на грабли наступать не надо, понимаешь?
Жизнь вообще полна грабель. Я вот давеча переходил с bacela на bareos у себя в организации. Потратил целый вечер, чтобы выяснить, что мануал устанувки его webui — гавно и половина инфы там либо лишняя, либо неверная. В итоге за полчаса установил этот webui в лоб, тупо читая логи nginx и подсовывая то что оно хочет.
Грабель не надо бояться — это ценный опыт. Главное — запоминать их расположение. И изучать карты, составленные другими.

S>>А чего сразу не "Я открываю блокнот, пишу в туда символы и сохраняю как app.exe, а остальные лохи"?

TB>Потому что тех, кто пишет символы, я не встречал, а любителей сырых массивов и сырыых указателей я навидался немало. Аргументация абсолютно такая же — они уверены, что всё смогут контролировать, а кто не может (или просто считает, что голову можно забить более интересными вещами) — те просто программировать не умеют.
Я встречал, правда начинающих.
А насчет использования чегототам... Работает? Да. Значит пусть. А то, что остальных считают быдлом — так это их проблемы. Они то среди быдла живут

TB>>>То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.

S>>Это не проблема языка, это проблема программистов, которым трудно правила запомнить.
TB>Да ты один в белом коне походу.
Я вообще админ.

TB>Только непонятно, как же такой исключительный ты до сих пор не может понять разницу между способностью выучить правило и способностью всегда быть начеку.

Ты верно подметил, это две разных способности. И первая очень и очень помогает в реализации второй.

TB>По твоей логике, когда человеку падает кирпич на голову, то это лишь потому, что он не знал, что от кирпичей по голове становится плохо, а если человек в гололёд поскользнулся и упал, то это потому, что он не знает, что не надо падать.

А ты, оказывается, любитель пограничных аналогий и сравнений
Matrix has you...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.