Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем Break; в switch? С логической точки зрения 
V
    Опции темы
Sunvas
Дата 26.6.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Начал учить C#. Когда наткнулся на синтаксис оператора switch, меня удивило, зачем после каждого case-a разработчики придумали лепить Break;? Зачем с логической точки зрения?



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
tol05
Дата 26.6.2007, 09:52 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Потому что шарп не поддерживает сквозного выполнения switch. Так уж разработчики его решили, чтоб не путались программеры smile (они, видно, сильно путались  smile )
Поддерживает только в том случае, если case, идущие за ним, пустые
Код

switch(x)
{
case 1: {} break;
case 2:                      //только так
case 3: {} break;

case 4: { } return;    //можно и return, тогда выход будет не только из switch, но и из всего метода
case 5: 
case 6: { } break;
default: break;
}

даже в последнем case, даже в default нужен break. вот насколько все было плохо  smile 

Это сообщение отредактировал(а) tol05 - 26.6.2007, 09:54


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Sunvas
Дата 26.6.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(tol05 @  26.6.2007,  09:52 Найти цитируемый пост)
Потому что шарп не поддерживает сквозного выполнения switch.

Вот именно! Не поддерживает!
Если бы поддерживал - тогда понятно, а так - не поддерживает и не понятно, почему разработчики придумали его туда лепить.
Чтобы программеры не путались? Хм. А до этого они путались? Шарп от С++ и так очень отличается, так что не думаю что еще одни грабли что-то бы изменили....


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
0000
Дата 26.6.2007, 11:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.7.2006
Где: Нижний Новгород

Репутация: 2
Всего: 5



ну свитч - это же как аналог if (...) {...} else {...}
чтобы из всех возможных твоих вариантов выполнился один - и как только выполнился - сразу вышел, чтобы экономить время, не проверяя остальные
PM MAIL ICQ   Вверх
Sunvas
Дата 26.6.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



0000, Брр. Ну написал же уже:
Цитата(tol05 @  26.6.2007,  09:52 Найти цитируемый пост)
шарп не поддерживает сквозного выполнения switch.

!!!


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Shaggie
Дата 26.6.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Видимо, чтобы С++ программерам проще было на шарп переходить.

Хотя, согласен, решение гениальностью не отличается, меня тоже покоробило.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Sunvas
Дата 26.6.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(Shaggie @  26.6.2007,  11:19 Найти цитируемый пост)
Видимо, чтобы С++ программерам проще было на шарп переходить.

Честно говоря простоты в этом не вижу. Зачем бесполезный рудимент?.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
anthony
Дата 26.6.2007, 12:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 25.6.2007
Где: Украина

Репутация: 1
Всего: 5



  •  Сквозное выполнение имеет больше проблем чем достоинств, в частности, в C++ довольно часто обсуждаются проблемы сквозного выполнения.
  •  Явный синтаксис (явное написание break) лучше неявного (так как нет сквозного выполнения то и break не нужен) как при написании программы, так и при ее чтении
  •  Привычка: программисты привыкли так или иначе писать break в case поэтому отказаться от него совсем сложно

Вывод: явное написание break увеличивает ясность кода (в C# этому вопросу уделено довольно большое внимание, в частности, явный синтаксис при перекрытии или сокрытии метода), а сквозное выполнение не оправдывает себя практически ни в каких случаях.
PM MAIL ICQ   Вверх
tol05
Дата 26.6.2007, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



ну, они считают, что когда ты юзаешь switch, то постоянно забываешь break и на каждом шагу у тебя получаются непредсказуемые результаты (не те, что ты ожидал, когда писал case)  smile 
типа такого: хочу, чтоб если i=1, то j было 10, если i=2, то j было 20 и т.д.
пишешь (в С++), ты индус, ты логику вписал, а про break - забыл!
Код

int i;
int j;
switch(i)
{
case 1: j = 10;
case 2: j = 20;
case 3: j = 30;
default: j = 100;
}


выполняешь и:

i=1 j=100; //что такое?
i=2 j=100; //да, елки-палки, что такое?!! smile 
i=3 j=100; //э, шайтан проклятый, что такое?!!!!!! smile 

 smile 

 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Sunvas
Дата 26.6.2007, 14:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



anthony, я же и говорю, что нет сквозного выполнения, так зачем бряку оставлять!
Цитата(anthony @  26.6.2007,  12:31 Найти цитируемый пост)
 Явный синтаксис (явное написание break) лучше неявного (так как нет сквозного выполнения то и break не нужен) как при написании программы, так и при ее чтении

Чем? Почему?


Цитата(anthony @  26.6.2007,  12:31 Найти цитируемый пост)
Привычка: программисты привыкли так или иначе писать break в case поэтому отказаться от него совсем сложно

И снова привыкли... Не в превычке тут дело (!) т.к. отличия С++ и С# уж очень велики из без этой бряки. Я вот не привык, и использование бряки в конце кейса мне кажется бредом (снова таки ссылаясь на то, что нет в шарпе сквозного выполнения). И почему сложно отказаться? Это дело принципа или маразма?

Цитата(anthony @  26.6.2007,  12:31 Найти цитируемый пост)
написание break увеличивает ясность кода

А по-моиму наоборот: хз для чего эта бряка там нужна.

tol05, мы за шарп говорим, а не за ++.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
tol05
Дата 26.6.2007, 14:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(Sunvas @  26.6.2007,  14:43 Найти цитируемый пост)
мы за шарп говорим, а не за ++. 

А я как раз за шарп и говорил как бы.

Повторяю:
у мелкомягких накопилось множество жалоб от программистов (не будем говорить о них плохо) о том, что они слишком часто сталкиваются с ситуацией, разрисованной мной в моем предыдущем посте.

ПОЭТОМУ 

При разработке C#, чтобы не повторялись многочисленные critical reports по поводу выполнения switch было принято решение вынуждать разработчика ставить break всегда.



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Sunvas
Дата 26.6.2007, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(tol05 @  26.6.2007,  14:54 Найти цитируемый пост)
При разработке C#, чтобы не повторялись многочисленные critical reports по поводу выполнения switch было принято решение вынуждать разработчика ставить break всегда.

Понятно... Одно слово мелкософт... Нет, чтоб хэлпы нормальные написать, они в детство ударились... Брр.. Но спасибо за разъяснения.

ЗЫ. Вряд-ли я продолжу учить шарп.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
tol05
Дата 26.6.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



вот, специально для тебя, Sunvas, нашел smile
Цитата

[Note: The “no fall through” rule prevents a common class of bugs that occur in C and C++ when break
statements are accidentally omitted. In addition, because of this rule, the switch sections of a switch
statement can be arbitrarily rearranged without affecting the behavior of the statement. For example, the
sections of the switch statement above can be reversed without affecting the behavior of the statement:
switch (i) {
default:
CaseAny();
break;
case 1:
CaseZeroOrOne();
goto default;
case 0:
CaseZero();
goto case 1;
}
end note]
[Note: The statement list of a switch section typically ends in a break, goto case, or goto default
statement, but any construct that renders the end point of the statement list unreachable is permitted. For
example, a while statement controlled by the Boolean expression true is known to never reach its end
point. Likewise, a throw or return statement always transfers control elsewhere and never reaches its end
point. Thus, the following example is valid:
switch (i) {
case 0:
while (true) F();
case 1:
throw new ArgumentException();
case 2:
return;
}
end note]

Ecma-334 стр.233 "15.7.2 The switch statement"
скачать можно отсюда

Цитата(Sunvas @  26.6.2007,  15:00 Найти цитируемый пост)
Вряд-ли я продолжу учить шарп

ну, это хозяйское дело. Я вот java учить начинаю. Нафига? smile



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Exception
Дата 27.6.2007, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Мои пять копеек:
Отказавшись от сквозного выполнения, можно было и изменить синтаксис. Лично мне эти двоеточия и break очень напоминают лейблы и goto..
Код
switch (someVariable)
{
    case (1) foo ();
    case (2)
    {
        foo ();
        bar ();
    }
    else
    {
        suck ();
    }
}


Обычные фигурные скобки (или просто точка с занятой, если вариант записывается в одну строку) сделают конструкцию похожей на другие (ifdo, etc), более привычной и читаемой. Также я заменил default на else, потому что моему человеческому разуму ближе именно "не 1 и не 2, значит иначе", а не "не 1 и не 2, значит по умолчанию".
PM   Вверх
stab
Дата 28.6.2007, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(Exception @  27.6.2007,  17:43 Найти цитируемый пост)
Лично мне эти двоеточия и break очень напоминают лейблы и goto..


что забавно действительно есть конструкция goto case X.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
tol05
Дата 28.6.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



в Ecma-334 они так и называются 
Цитата

case labels of a switch statement ...default label... expression of each case label shall...

и т.д. вообще-то ECMA - главный учебник теперь для меня в части синтаксиса... MSDN отдыхает smile
Код

...
case 0:
CaseZero();
goto case 1;
case 1:
CaseZeroOrOne();
goto default;
...


Exception по-поводу твоих нововведений smile А мне как раз нравится то, что есть. На плюсы очень похоже. И проще гораздо. Читаю плюсовый код, понимаю конструкции интуитивно. а так - напрягаться прийдется, вспоминать... Я поэтому и VB не очень... Напрягает немного smile




--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
SpaceSpace
Дата 28.6.2007, 09:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



я так подозреваю, что при swithc(x)
за ним стоят долгие 
if (x=y) goto y'
if (x=z) goto z'...
т.е. физически при swithc
юзается goto!!!
ну блин... не ожидал я такого,
меня еще в школе долбили "goto - плохой стиль, не используй" smile 
....
надо пересматривать свои принцыпы 


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Дрон
Дата 28.6.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Кстати, в самом начале же было сказано, что хотя сквозного выполнения нет, но есть вот такая конструкция:
Код
switch(n)
{
    case 1:
    case 2:
    case 3:
        doSomething();
        break;
}

В которой отсутствие break; в первых двух случаях вполне осмысленно.
С другой стороны, присоединяюсь к тем, кого этот break; бесит. Я бы предпочёл вот такой синтаксис:
Код
switch(n)
{
    case 1,2,3:
        doSomething();
}



--------------------
Да. Именно так.
PM   Вверх
SpaceSpace
Дата 28.6.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



Цитата(Дрон @  28.6.2007,  09:29 Найти цитируемый пост)
Я бы предпочёл вот такой синтаксис:


Код

switch(n)
{
    case 1,2,3:
        doSomething();
}


ага.. в дельфе мне нравилось

case 0..9 , что означало попадение в область от 0 до 9....

Это сообщение отредактировал(а) SpaceSpace - 28.6.2007, 09:37


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
Kvazilol
Дата 28.6.2007, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



блин а после case нельзя написать метод, надо именно константы писать!! объяните какого х! какая ему разница блин, пусть все вычисляет и сам подставляет, мне не жалко
PM MAIL   Вверх
Exception
Дата 28.6.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



SpaceSpace, даже банальный if на уровне IL сводится к нескольким goto. Плохой стиль -- применять его самому, а что уж там компилятор сделает из твоего кода, это его дело.
Кстати, хотя синтаксис VB .NET мне не очень нравится, оператор Select Case там мощнее:
Код
Select Case someVariable
    Case 1
        foo ()
    Case 2
        bar ()
    Case 3, 4
        foobar ()
    Case Is >= 5
        barfoo ()
    Case getSomeInteger ()
        doSomeStuff ()
    Case Else
        haha ()
End Select

PM   Вверх
Дрон
Дата 28.6.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(Kvazilol @  28.6.2007,  11:57 Найти цитируемый пост)
блин а после case нельзя написать метод, надо именно константы писать!! объяните какого х! какая ему разница блин, пусть все вычисляет и сам подставляет, мне не жалко 

Используй if. А разница как раз в том, что компилятор оптимизирует работу switch..case перераспределяя порядок проверки условий и поэтому ему нужны константы, известные во время компиляции.


--------------------
Да. Именно так.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0762 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.