Здравствуйте, 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'ы то выполняются один за другим