почему в Си-подобных языках синтаксис 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>Он только синтаксически как-бы завершает... буквоеды вы все...
А ты прикинь, каким словом буквоеды щас тебя обзывать будут, да?
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
Здравствуйте, TheCat, Вы писали:
TC>а вообще надо было совсем goto совсем запретить.)) !
Ну тут не все так однозначно. Если код генерит машина то goto может быть полезен. Особенно при генерации конечных автоматов.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
switch — это goto на метку, а case n: — это метка.
попробуйте такой код:
switch(x)
do
{
case 1:
// ...
case 2:
// ...
case 3:
// ...
} while(1);
oRover wrote:
> почему в Си-подобных языках синтаксис switch не так, как у остальных > операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... > и break, который завершает case. Смахивает на паскаль с его begin-end...
MN>IMHO наиболее удачным был бы подход чем-то похожий на C#-овский, но без break:
MN>
MN>switch(i)
MN>{
MN> case 1:
MN> {
MN> i += 1; // Обычный case
MN> }
MN> case 2:
MN> case 3:
MN> {
MN> i += 2; // Объединение case-ов
MN> }
MN> default:
MN> {
MN> }
MN>};
MN>
MN>Так было бы намного удобнее — и проблема забытых break`ов решена, и объединение
case-ов есть, и безусловный переход (break) отсутствует.
IMHO сушествующий switch() самый лучший.
Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?
MN>>IMHO наиболее удачным был бы подход чем-то похожий на C#-овский, но без break:
MN>>
MN>>switch(i)
MN>>{
MN>> case 1:
MN>> {
MN>> i += 1; // Обычный case
MN>> }
MN>> case 2:
MN>> case 3:
MN>> {
MN>> i += 2; // Объединение case-ов
MN>> }
MN>> default:
MN>> {
MN>> }
MN>>};
MN>>
MN>>Так было бы намного удобнее — и проблема забытых break`ов решена, и объединение MS>case-ов есть, и безусловный переход (break) отсутствует. MS>IMHO сушествующий switch() самый лучший. MS>Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?
ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится
Здравствуйте, MShura, Вы писали:
MS>IMHO сушествующий switch() самый лучший. MS>Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?
Не делать так вообще. А если код не тривиальный оформить его в виде отдельной функции (метода) и вызывать из одного, двух, трёх case-ов...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, oRover, Вы писали:
R>Здравствуйте, MShura, Вы писали:
MN>>>IMHO наиболее удачным был бы подход чем-то похожий на C#-овский, но без break:
MN>>>
MN>>>switch(i)
MN>>>{
MN>>> case 1:
MN>>> {
MN>>> i += 1; // Обычный case
MN>>> }
MN>>> case 2:
MN>>> case 3:
MN>>> {
MN>>> i += 2; // Объединение case-ов
MN>>> }
MN>>> default:
MN>>> {
MN>>> }
MN>>>};
MN>>>
MN>>>Так было бы намного удобнее — и проблема забытых break`ов решена, и объединение MS>>case-ов есть, и безусловный переход (break) отсутствует. MS>>IMHO сушествующий switch() самый лучший. MS>>Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?
R>ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится
Нет. Вы не поняли идею — блок case`а завершается закрывающейся скобкой безо всякого break.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Здравствуйте, Mr. None, Вы писали:
R>>ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится
MN>Нет. Вы не поняли идею — блок case`а завершается закрывающейся скобкой безо всякого break.
првильно, вместо break закрывающая скобка. В чем проблема я так и не понял...
Здравствуйте, oRover, Вы писали:
R>Здравствуйте, Mr. None, Вы писали:
R>>>ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится
MN>>Нет. Вы не поняли идею — блок case`а завершается закрывающейся скобкой безо всякого break.
R>првильно, вместо break закрывающая скобка. В чем проблема я так и не понял...
2 и 3 после 1 не выполняются — выполняется либо 1, либо 2 и 3.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
MN>>switch(i)
MN>>{
MN>> case 1:
MN>> {
MN>> i += 1; // Обычный case
MN>> }
MN>> case 2:
MN>> case 3:
MN>> {
MN>> i += 2; // Объединение case-ов
MN>> }
MN>>};
MN>>
MS>Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?
Никаких goto. Лучше придумать еще один оператор nobreak (или fallthrough).
Здравствуйте, Mr. None, Вы писали:
R>>првильно, вместо break закрывающая скобка. В чем проблема я так и не понял...
MN>2 и 3 после 1 не выполняются — выполняется либо 1, либо 2 и 3.
почему нельзя сделать так, чтобы выполнился и 1 и 2,3 ? по-моему, синтаксически лочично. If'ы то выполняются один за другим