powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Недостаток оператора switch
11 сообщений из 11, страница 1 из 1
Недостаток оператора switch
    #36127572
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не первый раз сталкиваюсь с тем, что оператор switch не предоставляет весьма удобной возможности выполнять несколько case, которые не расположены подряд.

Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break, иначе будут задействованы следующие case, даже если они не попадают под условие. Довольно странно, на мой взгляд.

Пример (РНР)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
$x = 'a';
$y =  0 ;
switch ($x) {
	case 'a': case 'b': $y =  1 ; break;
	case 'd': $y++; break;
	case 'a': case 'c': $y++; break;
}
echo $y;

В таком случае на выходе будет всегда 1 при любом $x из a,b,c,d. Если я уберу break, то при b ответ будет 3. А было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах.

Пример утрированный, но например при сборке sql-запроса в case могут быть большие куски, которые так или иначе придётся повторять...

Может быть, я что-то не так понимаю? Или есть язык, где switch расширен?
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36127617
eee-pc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведи более понятный пример
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36127660
Korcar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frankie имеет в виду, что нельзя выполнить кусок кода, к примеру, по второму условию и тут же перейти к куску кода, выполняемом при 4-м условии, тогда их надо отдельной комбинацией писать друг за дружкой без брейков, если я правильно все понял.
Вообще, не знаю, чем навороты с этими брейками нужны, хотя мож просто с подобными ситуациями не сталкивался

Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break...
тоже самое было)
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36127662
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frankie,

Может так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$x = 'a';
$y =  0 ;
switch ($x) {
           case 'b':  $y =  1 ; break;
	case 'a':  $y =  1 ;
           	case 'd':  case 'c': $y++; break;

}
echo $y;


или так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
$x = 'a';
$y =  0 ;
switch ($x) {
          	case 'a': case 'b':  $y =  1 ; if( $x == 'b') break;
           	case 'd':  case 'c': $y++; break;
}
echo $y;

...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36127808
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clihltМожет так ?
Абстрагируйтесь от конкретного примера. Представьте, что там части sql-запроса. Например JOIN таблиц, а в switch идёт имя параметра, от которого зависит какие таблицы включать в выборку.

Вторым способом обычно и обхожусь, а что делать....
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36128047
eee-pc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KorcarFrankie имеет в виду, что нельзя выполнить кусок кода, к примеру, по второму условию и тут же перейти к куску кода, выполняемом при 4-м условии, тогда их надо отдельной комбинацией писать друг за дружкой без брейков, если я правильно все понял.
Вообще, не знаю, чем навороты с этими брейками нужны, хотя мож просто с подобными ситуациями не сталкивался

Когда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break...
тоже самое было)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
switch(i)
{
case  0 :
 a =  10 ;
 doSomething();
case  2 :
 b =  10 ;
 if (lalala != lololo)
  break;
 doSomethingElse();
...

}
очень удобно бывает кстати
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36128898
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieА было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах.
Frankie, оператор switch моделирует работу узла конечного автомата. Если ты не можешь описать свою задачу таким образом, то либо тебе надо перейти на использование if-else или пересмотреть логику на предмет декомпозиции на более простые автоматы.

Подстраивать switch в угоду кустарным задачам - плохой подход.
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36128916
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrankieКогда я только с ним познакомился, то для меня было лёгким шоком, что надо ставить break, иначе будут задействованы следующие case, даже если они не попадают под условие. Довольно странно, на мой взгляд.
Это наследие тёмного прошлого, в котором switch был всего лишь цивилизованной формой записи вычисляемого goto. "В оригинале" соответствующий кусок кода выглядел примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 10  ON X GOTO  100 ,  200 ,  300 ,  400 
...
 100  REM Код для X =  1 
...
 200  REM Код для X =  2 
...
 300  REM Код для X =  3 
...
 400  REM Код для X =  4 
...

И если очередная секция не завершалась GOTO на "после последнего" - то есть аналогом break - они подряд и выполнялись.

FrankieА было бы круто, если бы помимо break было что-то вроде further, которое бы позволяло входить в следующие условия при совпадении. Тогда бы я мог получить ответ 2 при а, и 1 при остальных вариантах.
Это не было бы круто, имхо. Вы фактически хотите превратить switch в реализацию таблицы решений, что сделает и без того монструозный оператор - самый монструозный из всех структурных - просто невоспринимаемым, нечитаемым. Собственно, если Вы посмотрите на вышеприведённый пример с GOTO, Вы обнаружите, что там как раз это делается, стоит только вместо break поставить if либо снова вычисляемый goto.

А теперь внимание, вопрос. Представьте себе, что Вы это сделали. Вы уже поняли, почему код тех времён называли "спагетти"?
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36129164
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть паскалевый оператор case который работает так как вам надо - он более развит. Создателям языка С паскалевый case похоже попросту был не по зубам, а может они не в силах были отвыкнуть от привычки мыслить без оператора goto. И теперь он такой во всех унаследованных языках. Видел в учебнике одного очень серьезного дядьки рекомендацию как употреблять goto(!) внутри switch.
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36129786
Frankie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЭто не было бы круто, имхо. Вы фактически хотите превратить switch в реализацию таблицы решений, что сделает и без того монструозный оператор - самый монструозный из всех структурных - просто невоспринимаемым, нечитаемым. Собственно, если Вы посмотрите на вышеприведённый пример с GOTO, Вы обнаружите, что там как раз это делается, стоит только вместо break поставить if либо снова вычисляемый goto.
Конечно, если в case вызывать функции, разворачивать условные конструкции, то вещь будет действительно монструозная, но я использую switch строго как замену elseif, а в case стоят приращения ( += ). Я же не предлагаю further вместо break, я предлагаю в расширение. Про спагетти не уверен, что понял.

Worobjoff, да, припомниаю...
...
Рейтинг: 0 / 0
Недостаток оператора switch
    #36130864
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frankieно я использую switch строго как замену elseif,
Фраза сама по себе странная, но вдобавок, похоже, ошибочная. Вы как раз хотите использовать её как замену if без else. То есть Вы хотите сделать примерно так:

Код: plaintext
1.
2.
3.
4.
5.
sql = "select f1, f2 " +
      (i ==  1  || i ==  2 ) ? ", f3 " : "" +
      "from t1 " +
      (i ==  1  || i ==  3 ) ? " join t2 on (t1.id = t2.id) " : "" +
      "group by f1 " +
      (i ==  2 ) ? ", f3" : "";
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Недостаток оператора switch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]