Здравствуйте, Sheridan, Вы писали:
ARK>>По сути: C#, Go, Ruby, Pascal, Ada, Eiffel — обладают семантикой, отличной от C/C++. S>Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.
Наговнокодил, как и обещал.
C#: https://ideone.com/BMkFax
break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
Go: https://ideone.com/CvtZwE
break нет, хотя есть его противоположность — fallthrough. Что с точки зрения выбора по умолчанию, на мой взгляд, гораздо лучше.
Здравствуйте, Sheridan, Вы писали:
S>Я не могу понять что в switch не так, чем он травмоопасен? Или ты про ситуацию "студент недоучка спотыкается об switch и ломает ногу каждые три часа"?
А что такого опасного в езде на лошади стоя? Просто не падай вперёд, назад, влево и вправо...
S>Ради этого надо вонь поднимать и switch ругать?
Писать бряк после каждой ветки — это неинтуитивно и противоестественно.
S>А когда "студент" споткнется об S>
S>if(val=16) {...}
S>
S>, тогда нужно еще и обработку условий коричнево помазать, так что ли?
Компилятор обычно предупреждает об этом. Зря, наверное, это предупреждение ввели, ведь на этом только недоучки спотыкаются. А реальным пацанам ничего не стоит всегда каждый секунду быть на 360 градусов внимательными.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, neFormal, Вы писали:
F>ага, лёгкий способ завалить человека на собеседовании.
Зачем? Если очень хочется не принимать человека, то можно и так сказать.
А если собеседующий всерьёз считает, что знание подобных конструкций нужно программисту, то он идиот.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Sheridan, Вы писали:
S>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.
Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, ononim, Вы писали:
O>Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю"
Напарывался несколько раз (слава богу, последствия вылезали сразу), так же и на =/== (но тут компилятор ругается), и один раз на
int& i1 = a[f(1)], i2 = a[f(2)], i3 = a[f(3)];
// что-то делаем над i1,i2,i3
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Sheridan, Вы писали:
ARK>>По сути: C#, Go, Ruby, Pascal, Ada, Eiffel — обладают семантикой, отличной от C/C++. S>Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.
Примеры чего? В гугле же полно примеров кода.
Или примеры, как в этих языках выкручиваются, когда нужно "протекание"? Хз, не знаю, писал на Паскале, ни разу не нужно было такого. Вообще не припомню ни одного раза.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Sheridan, Вы писали:
DE>>В Swift и Go есть специальное ключевое слово fallthrough, а break используется по умолчанию и явно писать его не требуется. S>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.
Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть. Мелочь какая. И совершенно ненужная, реальные пацаны же не падают. Зря они так сделали короче.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
TB>>Если в мане будет написано "ехать на лошади стоя очень просто — надо лишь не падать вперёд, назад, вправо и влево", MD>Под микроконтроллеры примерно так и пишут: памяти N мегабайт, эксепшны недоступны, длительность прерывания не более X тактов. И ничего, живут же люди.
Последний раз когда писал под МК (на C, да) N было равно 0.008
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю"
Тут либо предельная внимательность либо везение либо статический анализатор.
Если ничего нет, то нарваться довольно легко.
Вон тут недавно у нас в Java коде пропустили 'break' и нашлось совершенно случайно.
O>>Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю" _NN>Тут либо предельная внимательность либо везение либо статический анализатор.
Даже не знаю. Я иногда когда попадется интересная закавыка на работе в проекте бывает кодю дома т.к. только дома можно сосредоточиться толком. (А на работе я потом это время компенсирую нифиганеделаньем, приступы коего случаются не реже чем приступы хочупокодитьдома ). А т.к. тащить домой компилябельное дерево проекта а) нельзя б) лень — тупо пишу код без компиляции. Причем зачастую пишу в FAR'е. Бывает тыщу — другую строчек могу так накатать, потом принести и, исправив мелкие опечатки, — скомпилять и оно таки в большинстве случаев сразу работает как надо. И я бы не сказал что прям таки внимательно пишу код, скорее это дело практики, а мозги при этом заняты не анализом кода, а анализом алгоритма. Это как разговаривать на человеческом языке — вначале внимательно тупишь над артиклями временами и тп, а потом с практикой нужные времена зона Брока генерит на автомате, без вмешательства высших отделов психики.
_NN>Если ничего нет, то нарваться довольно легко. _NN>Вон тут недавно у нас в Java коде пропустили 'break' и нашлось совершенно случайно.
Обычно ошибки такого класса я отлавливаю ассертами, коих пихаю в неимоверных количествах. Причем, активными и в релизе, ибо нефиг.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
_NN>>Если ничего нет, то нарваться довольно легко. _NN>>Вон тут недавно у нас в Java коде пропустили 'break' и нашлось совершенно случайно. O>Обычно ошибки такого класса я отлавливаю ассертами, коих пихаю в неимоверных количествах. Причем, активными и в релизе, ибо нефиг.
Ну в том случае это бы не помогло
Там было что-то в стиле
switch(v)
{
case X: doX();
case Y: doY(); break;
case Z: doZ(); break;
default: throw new Exception();
}
К счастью хотя бы в C# без 'break' нельзя писать, а если уж нужно то явно пиши goto case.
DE>>>В Swift и Go есть специальное ключевое слово fallthrough, а break используется по умолчанию и явно писать его не требуется. S>>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку. TB>Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть. Мелочь какая. И совершенно ненужная, реальные пацаны же не падают. Зря они так сделали короче.
А потом набегут питонисты, и начнут говорить что проваливающийся в пределах отступа if — плохо, что они по привычке написали
if (can())
do();
do_hast();
do_hast_mich();
И du_hast() сработал совершенно внезапно для всех бывших петонистов, а значит надо срочно-обязательно ввести фигурные скобочки после if. Чтоб было четко видно. ну и чтоб не было вот такого
if (can());
do();
на что кстати лично я напарывался чисто механически, во всяком случае мне это запомнилось, в отличии от проваливающихся кейсов.
Как много веселых ребят, и все делают велосипед...
ARK>C#: https://ideone.com/BMkFax ARK>break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
Да. Приходится извращаться, чтобы добиться поведения ц++ https://ideone.com/w2eCYM
ARK>Go: https://ideone.com/CvtZwE ARK>break нет, хотя есть его противоположность — fallthrough. Что с точки зрения выбора по умолчанию, на мой взгляд, гораздо лучше.
Ну, про зеркало я уже говорил выше...
ARK>Ruby: https://ideone.com/o6U0ra ARK>Pascal: https://ideone.com/JWO3wT ARK>Ada: https://ideone.com/3NwBYB ARK>В этих языках ни break, ни аналогов, ни антиподов нет. Все в точном соответствии с примитивом "ветвление" в структурном программировании. Так что эти примеры демонстрируют только синтаксис.
То есть тот же if, только разветвленный. Печаль
Здравствуйте, T4r4sB, Вы писали:
S>>Ради этого надо вонь поднимать и switch ругать? TB>Писать бряк после каждой ветки — это неинтуитивно и противоестественно.
Кто на что учился. Для меня противоестественно НЕ писать бряк в case
S>>А когда "студент" споткнется об S>>
S>>if(val=16) {...}
S>>
S>>, тогда нужно еще и обработку условий коричнево помазать, так что ли? TB>Компилятор обычно предупреждает об этом. Зря, наверное, это предупреждение ввели, ведь на этом только недоучки спотыкаются.
Ну так -Wimplicit-fallthrough для clang в транке
gcc же еще держится. С 2002 года fr висит https://gcc.gnu.org/bugzilla/show_bug.cgi?id=7652 Видимо, НАСТОЛЬКО нужен
TB>А реальным пацанам ничего не стоит всегда каждый секунду быть на 360 градусов внимательными.
Ну как бы всё почти так
Здравствуйте, T4r4sB, Вы писали:
S>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет. TB>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
Здравствуйте, T4r4sB, Вы писали:
TB>Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть.
Всего лишь надо сделать над собой усилие и выучить, наконец то, язык, на котором пишешь.
TB>Мелочь какая. И совершенно ненужная, реальные пацаны же не падают. Зря они так сделали короче.
Какая у тебя цель? Потрындеть? Тогда не со мной.
Здравствуйте, Sheridan, Вы писали:
S>Тогда там switch не нужен, он становится if'ом при таком раскладе, но с другим синтаксисом и позволяет не писать города из if else.
Не согласен — есть "goto case", который как раз к следующему case переходит. Просто это надо указывать явно (что хорошо). Если не написать ни default ни goto case, то компилятор даст по рукам.
В любом случае, switch штука удобная даже без возможности "проваливаться". Кстати, он в D, в отличии от C/C++, со строками работать умеет.
S>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.
Да, "зеркальное поведение", но я согласен с автором темы с тем, что break писать приходится куда чаще, чем сознательно его опускать. Хотя и не помню когда уже допускал такую ошибку, тем более, что ловится легко, как правило. Но всё равно считаю такое умолчание более разумным и удобным.
Ну и в C# тоже такое же поведение, только там вместо fallthrough "полноценный goto" по кейсам.
S>Впрочем, ихний match хотя и мощный, но fallthrough действительно, похоже, нет и они этим показательно гордятся, гм.
У них и goto нет.
Относительно матча — просто он действительно сильно мощнее свитча и большинство вариантов использования плохо применимы с fallthrough. Например:
match val {
A(x) => ... ,
B(x, y) => ... ,
C(x, y, z) => ... ,
}
Здравствуйте, AlexRK, Вы писали:
ARK>C#: https://ideone.com/BMkFax ARK>break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
Вот так не ругается: https://ideone.com/zVqfmz
Странно, в общем. Хотя я С# не знаю.