почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
Здравствуйте, oRover, Вы писали:
R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
А что именно не устраивает в таком синтаксисе? Имхо смахивает на проблемы архитектуры...
Здравствуйте, oRover, Вы писали:
R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
А по-моему, это смахивает на сишный же goto С его двоеточиями после меток.
Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
Здравствуйте, Astaroth, Вы писали:
A>Здравствуйте, oRover, Вы писали:
R>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
A>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток. A>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
Здравствуйте, Astaroth, Вы писали:
A>Здравствуйте, oRover, Вы писали:
R>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
A>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток. A>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида:
goto case 1;
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Astaroth, Вы писали:
A>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток. A>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
логически да. Но синтаксически похоже на завершение case
Здравствуйте, oRover, Вы писали:
R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
почти... break — не обязателен, поэтому такую конструкцию невозможно решить с if+goto без увеличения сложности кода, получается слишком много if, т.к. IMHO нельзя передавать goto динамические метки.
PS: зачастую чем проще мы сделаем, тем легче разруливать компилятору... Давно когда "пописывал" под Дос была конструкция подобного вида для записи в видео буфер:
Здравствуйте, oRover, Вы писали:
R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
А break вовсе ничего не завершает.
switch( key )
{
case 3:
.....;
//nobreak -- выполнение переходит за следующую меткуcase 1: // величины меток могут встречаться в любом порядке; причём этот порядок - значимый
.....;
if( ... ) break;
.....;
if( ... ) break;
.....;
//nobreak;default:
.....;
if( ... ) break;
.....;
}
И хотя обычно избегают таких изощрений (усложняется понимание) — иногда приходится делать.
Вот, например: http://rsdn.ru/Forum/?mid=349431
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, Astaroth, Вы писали:
A>>Здравствуйте, oRover, Вы писали:
R>>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
A>>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток. A>>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
MN>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида: MN>
MN>goto case 1;
MN>
это байки.)
те же гуру наверное рассказывали и про то что вирусы в мониторах дырки прожигают и процессоры ломают.)
Здравствуйте, TheCat, Вы писали:
MN>>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида: MN>>
MN>>goto case 1;
MN>>
TC>это байки.) TC>те же гуру наверное рассказывали и про то что вирусы в мониторах дырки прожигают и процессоры ломают.)
Говорю же сам не старых компиляторах не проверял (на VC 6, VC 7, Builder`е не канает) поэтому спорить не буду (было это очень давно, когда я учился курсе на 2-ом и многому верил на слово без проверки). Но теже гуру утверждали, что a[5] и 5[a] — это почти одно и тоже (если для a не перегружен operator[]) и это действительно так — проверьте .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
R>эти двоеточия и break в конце. Логичнее было взять в фигурные скобки этот участок
А помоиму разумению очень хорощё
и break приделе
и ситуаций очень много когда например идёт куча выборов и есть много проктически одинаковых действий
и их можно групировать без брейка и бреёк ставить только в конце этой "логической группы"
помойму очень удобно
Здравствуйте, wert, Вы писали:
R>>эти двоеточия и break в конце. Логичнее было взять в фигурные скобки этот участок W>А помоиму разумению очень хорощё W>и break приделе W>и ситуаций очень много когда например идёт куча выборов и есть много проктически одинаковых действий W>и их можно групировать без брейка и бреёк ставить только в конце этой "логической группы" W>помойму очень удобно
IMHO наиболее удачным был бы подход чем-то похожий на C#-овский, но без break:
switch(i)
{
case 1:
{
i += 1; // Обычный case
}
case 2:
case 3:
{
i += 2; // Объединение case-ов
}
default:
{
}
};
Так было бы намного удобнее — и проблема забытых break`ов решена, и объединение case-ов есть, и безусловный переход (break) отсутствует.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Mr. None, Вы писали:
MN>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида: MN>
MN>goto case 1;
MN>
Оно в C# прокатывает...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Mr. None, Вы писали:
MN>>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида: MN>>
MN>>goto case 1;
MN>>
WH>Оно в C# прокатывает...
Не — там это документированная фича. А на старых компиляторах — это была особенность реализации
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Mr. None, Вы писали:
MN>Здравствуйте, TheCat, Вы писали:
MN>>>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида: MN>>>
MN>>>goto case 1;
MN>>>
TC>>это байки.) TC>>те же гуру наверное рассказывали и про то что вирусы в мониторах дырки прожигают и процессоры ломают.)
MN>Говорю же сам не старых компиляторах не проверял (на VC 6, VC 7, Builder`е не канает) поэтому спорить не буду (было это очень давно, когда я учился курсе на 2-ом и многому верил на слово без проверки). Но теже гуру утверждали, что a[5] и 5[a] — это почти одно и тоже (если для a не перегружен operator[]) и это действительно так — проверьте .
насчет a[5] — верю) а вот про goto case );
в старые времена и функцию небось через goto можно было вызвать O-))..
там все таки есть небольшая нестыковка с сишной рбнф .) вообще правильно что отказались )
а вообще надо было совсем goto совсем запретить.)) !
д
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, oRover, Вы писали:
R>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
К>А break вовсе ничего не завершает.
та ну не завершает, не завершает. Он только синтаксически как-бы завершает... буквоеды вы все...
Здравствуйте, oRover, Вы писали:
A>>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток. A>>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать. R>логически да. Но синтаксически похоже на завершение case
Эээ...
Лично я довольно часто из циклов брейком выхожу.
Пожалуй, даже чаще, чем использую switch...
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
Здравствуйте, oRover, Вы писали:
R>та ну не завершает, не завершает.
Не завершает, и точка
R>Он только синтаксически как-бы завершает... буквоеды вы все...
А ты прикинь, каким словом буквоеды щас тебя обзывать будут, да?
Вторая заповедь флеймера: нечего сказать — поставь смайлик.