powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Фича С-подобных.
22 сообщений из 22, страница 1 из 1
Фича С-подобных.
    #36486562
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В си-подобных языках есть конструкция switch-case.
Если выражение в switch == константа в case, выполнится блок после ":" и все остальные case-блоки до конца. Следовательно надо ставить break; после каждого case.
Никогда не использовал это. Всегда писал брейки.
Какие могут быть задачи, чтобы применялась эта фича?
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486573
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esofter,

банально
Код: plaintext
1.
2.
3.
4.
5.
if (var >  0 ) 
  # do smth0
if (var >  1 )
  # do smth1
if (var >  2 )
  # do smth2

=

Код: plaintext
1.
2.
3.
4.
5.
6.
switch(var) 
  case  2 :
    # do smth2
  case  1 :
    # do smth1
  case  0 :
    # do smth0
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486583
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле много где...
например if(...) break;

4 8 15 16 23 42
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486586
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

Вы не поняли,


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
switch(var) 
  case  2 :
    {
    do smth2
     }
  case  1 :
    { do smth1}
  case  0 :
    { do smth0}

Если var==2, выполнится do smth2 потом do smth1 и do smth0.
Если мы этого не хотим, надо так писать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
switch(var) 
  case  2 :
    {
    do smth2
     };break;
  case  1 :
    { do smth1};break;
  case  0 :
    { do smth0};break;

Вот не ясно где можно применить первый вариант кода.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486591
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
switch(len)
{
  case  3 :
    read( 3 );
    read( 2 );
  case  2 :
    read( 1 );
  case  1 :
    read( 0 );
  case  0 :
   superDo();
}

4 8 15 16 23 42
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486594
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esofter,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?php
$var =  2 ;
if ($var >  0 )
	echo  0 ;
if ($var >  1 )
	echo  1 ;
if ($var ==  2 )
	echo  2 ;

switch($var) {
	case  2 :
		echo  2 ;
	case  1 :
		echo  1 ;
	case  0 :
		echo  0 ;
}
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486778
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486816
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esofter,

а теперь еще раз прочитай то, что написали мы. В частности мой пример - конструкции из 3 if и из 1 switchа в итоге выполнят одно и то же, только if произведет 3 сравнения, а switch всего одно.

P. S. Если опять не поймешь - мы НЕ пропустили break, мы его намеренно не указали.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486846
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymEsofter,

а теперь еще раз прочитай то, что написали мы. В частности мой пример - конструкции из 3 if и из 1 switchа в итоге выполнят одно и то же, только if произведет 3 сравнения, а switch всего одно.

P. S. Если опять не поймешь - мы НЕ пропустили break, мы его намеренно не указали.

Вот теперь допер. Спасибо. Я почему-то думал, что при вхождении в кейс, если не указан брейк, остальные кейсы тоже будут выполнятся, только без сравнения. Не знаю почему я так думал. Всегда просто, при использовании этой конструкции ставил везде брейк. А вот сегодня задумался.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486858
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EsofterЯ почему-то думал, что при вхождении в кейс, если не указан брейк, остальные кейсы тоже будут выполнятся, только без сравнения. Не знаю почему я так думал. Всегда просто, при использовании этой конструкции ставил везде брейк. А вот сегодня задумался.
Вы правильно думали и всё таки неправильно поняли наши примеры. Перечитайте еще раз.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?php
$var =  2 ;
if ($var ==  2 ) // выполнится сравнение
	echo  2 ; //  2  ==  2 , выведется  2 
if ($var >  1 ) // выполнится сравнение
	echo  1 ; //  2  >  1 , выведется  1 
if ($var >  0 ) // выполнится сравнение
	echo  0 ; //  2  >  0 , выведется  0 
// итого -  3  сравнения и выведено  210 

switch ($var) {
	case  2 : // выполнится сравнение
		echo  2 ; //  2  ==  2 , выведется  2 
	case  1 : // это сравнение пропустится, так как уже одному case'у удовлетворяет переменная
		echo 1; // так как уже одному case'у удовлетворяет переменная и в том case не стоит break, выведется  1 
	case  0 : // аналогично предыдущему
		echo  0 ; // аналогично предыдущему, выведется  0 
}
// итого всего  1  сравнение и тот же результат - выведено  210 
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486875
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

Раньше я использовал свитч, когда точно знал какие значения могут быть в выражении и постоянно юзал его с брейками. В вашем примере аналогичная ситуация.
Нам нужно сделать несколько действий, в зависимости от выражения. Мы знаем, что оно >=0 и целое.
Значит достаточно одной проверки на <=3, и результат будет аналогичным трем сравнениям.
Вот что хотелось прояснить. Еще раз спасибо.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486894
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, одно "доброе" слово и половину ошибок исправили )))

А если var >2 или <-1, кто будет править, "an0nym"?
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486912
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Esofter wrote:

> Какие могут быть задачи, чтобы применялась эта фича?

Тривиальный пример: обработка нескольких случаев одинаковым образом.
Нетривиальный пример: обработка одного случая как надмножества по выполняемым
действиям от другого случая. Т.е. мы делаем какое-то действие и сводим
данный случай к другому случаю.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36486962
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglНу вот, одно "доброе" слово и половину ошибок исправили )))

А если var >2 или <-1, кто будет править, "an0nym"?
1. Ни одной ошибки там нет и не было. => Ни одной ошибки там исправлено не было.
2. То что пример не охватывает всё множество вариантов (а вдруг там вообще массив массивов объектов со свойствами всех возможных типов будет? обработать в примере? флаг вам в руки!) не говорит о его ошибочности - на то он и пример.
3. Изменение порядка следования ifов совершенно не повлияло на информативность примера.

И да, если вне примера где-то будет "var >2 или <-1", то править будете вы, топикстартер или иной гкодер.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36488062
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понял в С# каждый case просто обязан заканчиваться break, ну или return.
С уважением, Naf
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36488089
Фотография Esofter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafнасколько я понял в С# каждый case просто обязан заканчиваться break, ну или return.
С уважением, Naf

msdn говорит что вы правы. можно было тогда поменять язык так, чтобы не збиваться с толку и без указания брейков был выход из свича.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36488779
Vitaly83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример из C#:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
switch(len)
{
  case  3 :
    read( 3 );
    read( 2 );
    goto case  2 ;
  case  2 :
    read( 1 );
    goto case  1 ;
  case  1 :
    read( 0 );
    goto case  0 ;
  case  0 :
   superDo();
   break;
}
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36488841
Vowk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никогда switch не использую, вместо этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   if (var <=  128 ) {
   ....
   }
   else if (var <=  192 ) {
   ...
   } 
   else if (var <=  240 ) {
   ...
   }
   else {
   ...
   }
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36488922
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VowkНикогда switch не использую, вместо этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   if (var <=  128 ) {
   ....
   }
   else if (var <=  192 ) {
   ...
   } 
   else if (var <=  240 ) {
   ...
   }
   else {
   ...
   }

Поубивал бы. Это хоть не реальный пример из практики?
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36489076
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozokПоубивал бы. Это хоть не реальный пример из практики?А за что убивать? switch работает только с равенством константе а не с <=
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36489319
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

за это:
VowkНикогда switch не использую
Довольно много встречал в своей жизни такого макаронного кода.
Джависты почему-то любят этот стиль записи.
А на деле - это прекрасный источник логических ошибок.
И естественно, никто ничего не знает про табличную оптимизацию.
...
Рейтинг: 0 / 0
Фича С-подобных.
    #36492812
Фотография BION
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozokVowkНикогда switch не использую, вместо этого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   if (var <=  128 ) {
   ....
   }
   else if (var <=  192 ) {
   ...
   } 
   else if (var <=  240 ) {
   ...
   }
   else {
   ...
   }

Поубивал бы. Это хоть не реальный пример из практики?

Ну раз уж такая пьянка...

Код: plaintext
1.
2.
3.
4.
result = { 1  : function1,
           2  : function2,
           3  : function3,
         }.get(var, function4)(var)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Фича С-подобных.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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