синтаксис switch
От: oRover Украина  
Дата: 24.06.04 21:53
Оценка: 15 (1) +1
почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...
... << Rsdn@Home 1.1.4 beta 1 >>
Re: синтаксис switch
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 24.06.04 22:12
Оценка:
Здравствуйте, oRover, Вы писали:

R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...


А что именно не устраивает в таком синтаксисе? Имхо смахивает на проблемы архитектуры...

Чем не устраивает такой switch:

void CMyClass::ResolveOSVersion()
{
  OSVERSIONINFO osvi;
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  GetVersionEx(&osvi);
  
   switch(osvi.dwPlatformId)
   {
     case VER_PLATFORM_WIN32_NT:
           switch(osvi.dwMajorVersion)
           {
            .....
           }
     break;
   } // switch
}


По-моему, все достаточно очевидно... Смотря как и где применять. Или вы не об этом?
Re: синтаксис switch
От: Astaroth Россия  
Дата: 24.06.04 22:19
Оценка: 10 (1) +2
Здравствуйте, oRover, Вы писали:

R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...


А по-моему, это смахивает на сишный же goto С его двоеточиями после меток.
Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
http://livejournal.com/users/breqwas
Re[2]: синтаксис switch
От: vdimas Россия  
Дата: 24.06.04 23:49
Оценка:
Здравствуйте, Astaroth, Вы писали:

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


R>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...


A>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток.

A>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.

goto, break, continue — суть операторы безусловного перехода, где-то ты прав...

но сама идея switch подразумевает сначала много "входов", дык вполне естественно ожидать опосля много "выходов".
Re[2]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 25.06.04 04:19
Оценка:
Здравствуйте, Astaroth, Вы писали:

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


R>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...


A>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток.

A>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.

Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида:
goto case 1;
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[2]: синтаксис switch
От: oRover Украина  
Дата: 25.06.04 06:34
Оценка: 1 (1)
Здравствуйте, Flamer, Вы писали:

я про

switch(a)
{
    case "1":
        //
        //
        //
        //
    break;
}


эти двоеточия и break в конце. Логичнее было взять в фигурные скобки этот участок
... << Rsdn@Home 1.1.4 beta 1 >>
Re[2]: синтаксис switch
От: oRover Украина  
Дата: 25.06.04 06:34
Оценка:
Здравствуйте, Astaroth, Вы писали:

A>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток.

A>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.

логически да. Но синтаксически похоже на завершение case
... << Rsdn@Home 1.1.4 beta 1 >>
Re: синтаксис switch
От: Plague Россия  
Дата: 25.06.04 06:37
Оценка: 1 (1)
Здравствуйте, oRover, Вы писали:

R>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...

почти... break — не обязателен, поэтому такую конструкцию невозможно решить с if+goto без увеличения сложности кода, получается слишком много if, т.к. IMHO нельзя передавать goto динамические метки.

PS: зачастую чем проще мы сделаем, тем легче разруливать компилятору... Давно когда "пописывал" под Дос была конструкция подобного вида для записи в видео буфер:
unsigned char * video = (unsigned char *)0xA0000UL;
video[y*320+x] = color;

но можно и так:
unsigned char (*video)[320] = (unsigned char (*)[320])0xA0000UL;
video[y][x] = color;

во втором случае, без "попытки" оптимизации кода, компилятор обычно лучше оптимизирует...
... << RSDN@Home 1.1.3 stable >>
Re: синтаксис switch
От: Кодт Россия  
Дата: 25.06.04 07:38
Оценка:
Здравствуйте, 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
Автор: GarryIV
Дата: 09.08.03

Там вообще песня
Перекуём баги на фичи!
Re[3]: синтаксис switch
От: TheCat Россия abokov.livejournal.com
Дата: 25.06.04 09:23
Оценка:
Здравствуйте, 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>


это байки.)
те же гуру наверное рассказывали и про то что вирусы в мониторах дырки прожигают и процессоры ломают.)
Re[4]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 25.06.04 09:33
Оценка:
Здравствуйте, TheCat, Вы писали:

MN>>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида:

MN>>
MN>>goto case 1;
MN>>


TC>это байки.)

TC>те же гуру наверное рассказывали и про то что вирусы в мониторах дырки прожигают и процессоры ломают.)

Говорю же сам не старых компиляторах не проверял (на VC 6, VC 7, Builder`е не канает) поэтому спорить не буду (было это очень давно, когда я учился курсе на 2-ом и многому верил на слово без проверки). Но теже гуру утверждали, что a[5] и 5[a] — это почти одно и тоже (если для a не перегружен operator[]) и это действительно так — проверьте .
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[3]: синтаксис switch
От: wert  
Дата: 25.06.04 09:40
Оценка:
Здравствуйте, oRover, Вы писали:

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


R>я про


R>
R>switch(a)
R>{
R>    case "1":
R>        //
R>        //
R>        //
R>        //
R>    break;
R>}
R>


R>эти двоеточия и break в конце. Логичнее было взять в фигурные скобки этот участок

А помоиму разумению очень хорощё
и break приделе
и ситуаций очень много когда например идёт куча выборов и есть много проктически одинаковых действий
и их можно групировать без брейка и бреёк ставить только в конце этой "логической группы"
помойму очень удобно
Re[4]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 25.06.04 09:51
Оценка: 1 (1) +2
Здравствуйте, 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) отсутствует.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[3]: синтаксис switch
От: WolfHound  
Дата: 25.06.04 10:12
Оценка: :))
Здравствуйте, Mr. None, Вы писали:

MN>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида:

MN>
MN>goto case 1;
MN>

Оно в C# прокатывает...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 25.06.04 10:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Mr. None, Вы писали:


MN>>Вы очень недалеки от истины . switch — это фактичеки и есть замаскированный goto, по крайней мере на некоторых реализациях. Сам таким ни разу не пользовался, но от гуру слышал, что на многих старых компиляторах проканывало выражение вида:

MN>>
MN>>goto case 1;
MN>>

WH>Оно в C# прокатывает...

Не — там это документированная фича. А на старых компиляторах — это была особенность реализации
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[5]: синтаксис switch
От: TheCat Россия abokov.livejournal.com
Дата: 25.06.04 10:48
Оценка:
Здравствуйте, 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 совсем запретить.)) !
д
Re[2]: синтаксис switch
От: oRover Украина  
Дата: 25.06.04 11:46
Оценка:
Здравствуйте, Кодт, Вы писали:

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


R>>почему в Си-подобных языках синтаксис switch не так, как у остальных операторов (точнее синтаксис case'ов внутри). Это двоеточие после case... и break, который завершает case. Смахивает на паскаль с его begin-end...


К>А break вовсе ничего не завершает.


та ну не завершает, не завершает. Он только синтаксически как-бы завершает... буквоеды вы все...
... << Rsdn@Home 1.1.4 beta 1 >>
Re[3]: синтаксис switch
От: Astaroth Россия  
Дата: 25.06.04 14:56
Оценка:
Здравствуйте, oRover, Вы писали:

A>>А по-моему, это смахивает на сишный же goto С его двоеточиями после меток.

A>>Тем более что break — он не case завершает, он из блока выходит. С тем же успехом его можно в for, if, while заюзать.
R>логически да. Но синтаксически похоже на завершение case

Эээ...
Лично я довольно часто из циклов брейком выхожу.
Пожалуй, даже чаще, чем использую switch...
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
http://livejournal.com/users/breqwas
Re[3]: синтаксис switch
От: Astaroth Россия  
Дата: 25.06.04 15:45
Оценка:
Здравствуйте, oRover, Вы писали:

R>та ну не завершает, не завершает.

Не завершает, и точка

R>Он только синтаксически как-бы завершает... буквоеды вы все...

А ты прикинь, каким словом буквоеды щас тебя обзывать будут, да?
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
http://livejournal.com/users/breqwas
Re[6]: синтаксис switch
От: Astaroth Россия  
Дата: 25.06.04 15:45
Оценка:
Здравствуйте, TheCat, Вы писали:

TC>а вообще надо было совсем goto совсем запретить.)) !


А из вложенных циклов как тогда выходить?
Вторая заповедь флеймера: нечего сказать — поставь смайлик.
http://livejournal.com/users/breqwas
Re[6]: синтаксис switch
От: WolfHound  
Дата: 25.06.04 17:51
Оценка:
Здравствуйте, TheCat, Вы писали:

TC>а вообще надо было совсем goto совсем запретить.)) !

Ну тут не все так однозначно. Если код генерит машина то goto может быть полезен. Особенно при генерации конечных автоматов.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: синтаксис switch
От: Nick_ Россия  
Дата: 26.06.04 18:00
Оценка:
switch — это goto на метку, а case n: — это метка.
попробуйте такой код:
switch(x)
do
{
case 1:
// ...
case 2:
// ...
case 3:
// ...
} while(1);

oRover wrote:

> почему в Си-подобных языках синтаксис switch не так, как у остальных

> операторов (точнее синтаксис case'ов внутри). Это двоеточие после case...
> и break, который завершает case. Смахивает на паскаль с его begin-end...
Posted via RSDN NNTP Server 1.9 beta
Re[5]: синтаксис switch
От: MShura  
Дата: 28.06.04 11:52
Оценка:
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?
Re[6]: синтаксис switch
От: oRover Украина  
Дата: 28.06.04 15:02
Оценка: -1
Здравствуйте, 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?

ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится
... << Rsdn@Home 1.1.4 beta 1 >>
Re[6]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 29.06.04 03:40
Оценка:
Здравствуйте, MShura, Вы писали:

MS>IMHO сушествующий switch() самый лучший.

MS>Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?

Не делать так вообще. А если код не тривиальный оформить его в виде отдельной функции (метода) и вызывать из одного, двух, трёх case-ов...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[7]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 29.06.04 03:41
Оценка:
Здравствуйте, 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.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[8]: синтаксис switch
От: oRover Украина  
Дата: 29.06.04 08:39
Оценка:
Здравствуйте, Mr. None, Вы писали:

R>>ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится


MN>Нет. Вы не поняли идею — блок case`а завершается закрывающейся скобкой безо всякого break.


првильно, вместо break закрывающая скобка. В чем проблема я так и не понял...
... << Rsdn@Home 1.1.4 beta 1 >>
Re[9]: синтаксис switch
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 29.06.04 08:42
Оценка:
Здравствуйте, oRover, Вы писали:

R>Здравствуйте, Mr. None, Вы писали:


R>>>ну, в гипотетическом коде, приведенном выше, и так 2 и 3 после 1 выполнится


MN>>Нет. Вы не поняли идею — блок case`а завершается закрывающейся скобкой безо всякого break.


R>првильно, вместо break закрывающая скобка. В чем проблема я так и не понял...


2 и 3 после 1 не выполняются — выполняется либо 1, либо 2 и 3.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[6]: синтаксис switch
От: pintelou  
Дата: 29.06.04 09:53
Оценка:
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>>};
MN>>


MS>Очень часто бывает, что после выполнения case 1: нужно выполнить то что написано в case 2,3, причем код нетривиальный. Как быть в этом случае? Goto?


Никаких goto. Лучше придумать еще один оператор nobreak (или fallthrough).
Re[10]: синтаксис switch
От: oRover Украина  
Дата: 29.06.04 10:08
Оценка:
Здравствуйте, Mr. None, Вы писали:

R>>првильно, вместо break закрывающая скобка. В чем проблема я так и не понял...


MN>2 и 3 после 1 не выполняются — выполняется либо 1, либо 2 и 3.


почему нельзя сделать так, чтобы выполнился и 1 и 2,3 ? по-моему, синтаксически лочично. If'ы то выполняются один за другим
... << Rsdn@Home 1.1.4 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.