Оператор Switch - непонятности

 

Здравствуйте.

Про Switch в документации сказано, в частности:

"Вариант default не обязательно должен быть последним" - из встроенной справки

Дополняю, чтобы не вырывать из контекста:

Операторы, связанные с меткой default, выполняются, если ни одна из констант в операторах case не равна значению выражения. Вариант default не обязательно должен быть последним. Если ни одна константа не соответствует значению выражения и вариант default отсутствует, то не выполняется никаких действий.

"Обычно вариант default указывается в теле оператора switch последним, но он может находиться и в любом другом месте тела или вообще отсутствовать" - из учебника С.Ковалева

Дополняю, чтобы не вырывать из контекста:

Вариант default состоит из ключевого слова default, : (знака двоеточие) и операторов. Обычно вариант default указывается в теле оператора switch последним, но он может находиться и в любом другом месте тела или вообще отсутствовать.

К сожалению, в действительности попытки вставить его "в любое другое место" дают ошибку.

В случае:

int start()
{
int i;
   
   switch(i)
      {
      default:
         break;
      case 1:
         break;
      case 2:
         break;
      case 3:
         break;
      }
return(0);
}

компилятор выдает:

'default' - no 'case' statement before ..\experts\scripts\_s_Switch.mq4 (29, 7)
'case' - unexpected token ..\experts\scripts\_s_Switch.mq4 (31, 7)
'case' - unexpected token ..\experts\scripts\_s_Switch.mq4 (33, 7)
'case' - unexpected token ..\experts\scripts\_s_Switch.mq4 (35, 7)

В случае:

int start()
{
int i;
   
   switch(i)
      {
      case 1:
         break;
      case 2:
         break;
      default:
         break;
      case 3:
         break;
      }
return(0);
}

компилятор выдает:

'case' - unexpected token ..\experts\scripts\_s_Switch.mq4 (35, 7)

Примечательно выделенное жирным... Я правильно понимаю, что: типа без 'case' спереди делать неча?

Ну поставили 'case' перед. Результат все равно отрицательный.

Вот такие дела. Может я где-то ошибся?

.

 
А зачем Вам понадобилось вставлять его "в любое другое место"? Даже по логике, его единственное место в самом низу. Он сработает тогда, когда все варианты уже перебранные.
 
C-4 писал(а) >>
А зачем Вам понадобилось вставлять его "в любое другое место"? Даже по логике, его единственное место в самом низу. Он сработает тогда, когда все варианты уже перебранные.

С жирным согласен. Я не смог придумать ситуацию, когда он мог бы иметь смысл в другом месте.

Соответственно и практической нужды нет. Понадобилось для красоты.

Увидел в хелпе эту возможность - решил попробовать. А не работает...

Концептуально, это хреново, когда хэлп с компилятором разные песни поют.

Как на заборе. Написано одно, а фактически совсем даже наоборот.

Но... Но. Зачем-то понадобилось вводить в смущение и описывать эту возможность в манах?...

.

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

Извиняюсь, что вынужден "поднимать" тему.

Уважаемые разработчики, прокомментируйте, плз.

Вопросы заданы. Кому молчим?

 

Из справки:

-

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

-

"Не обязательно должен быть последним" можно понимать и как то, что не обязательно, чтобы switch заканчивался оператором default'om, как раз это и расталковывается в справке в следущем предложении - "Если ни одна константа не соответствует значению выражения и вариант default отсутствует, то не выполняется никаких действий"

 
Integer писал(а) >>

Из справки:

-

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

-

"Не обязательно должен быть последним" можно понимать и как то, что не обязательно, чтобы switch заканчивался оператором default'om, как раз это и расталковывается в справке в следущем предложении - "Если ни одна константа не соответствует значению выражения и вариант default отсутствует, то не выполняется никаких действий"

Хм... Действительно, можно и так прочитать :) Но только при большой симпатии к написателям этого мана. Или если хочешь прочитать и понять написанное именно так, в одном, определенном контексте. А это желание свойственно любому читателю, теи более уже отягощенному знанием (и не малым; респект) о предмете.

Я, конечно, был неправ, что дернул голую цитату, без обвязки (поправил). Только это обстоятельство сути самого дела не меняет. Мне важно было понять смысл, а не обсосать ее, дернутую.

А вот ты в своем ответе:
во-первых, расширив цитату, опустил первое предложение;
во-вторых, проигнорировал ссылку на Ковалева.

Что касается первого. Цитата состоит из трех предложений. Если читаем слева направо, то логика понимания строится по схеме

Знание = Предложение_1;
Знание = Знание + Предложение_2;
Знание = Знание + Предложение_3;

Не всегда, но обычно в подобных текстах важность и приоритет последовательных утверждений понижается. И хоть здесь все три утверждения равнозеачны, мое прочтение более естественно, чем предложенная тобой синтетика.

Что касается второго. У Ковалева утверждение идет открытым текстом, без разночтений. И здесь, симпатизируя автору, я склонен искать ему оправдания. Я считаю, что именно правильное, с точки зрения правильного русккого технического, прочтение привело его к ложному утверждению. Он просто не проверился, я полагаю ...

В итоге. После обращения к первоисточникам для меня ответ на вопрос: "Можно ли разместить default в другом месте, кроме как в конце (или не использовать его вовсе)?" был однозначен: "Да. Можно."

Нижайшая просьба к разработчикам - учитывйте, плз, эти замечания при документировании пятерки. Сегодняшняя документация по четверке не выдерживает никакой критики. Впрочем - и за это спасибо. Могло быть гораздо хуже.

Может это и смахивает на буквоедство в обывательском смысле этого слова, но мы ведь занимаемся программированием, а это есть буквоедство чистейшей воды. Все понятия и утыерждения должны быть сугубо формализованы и абсолютно однозначны. Лирике типа "может быть" (а может и не быть) здесь не место.

 

Visual Studio 2008 позволяет конструкцию без case (генерируется только Warning)

   switch(i)
      {
      default:
         ...;
      }
она может пригодиться ненадолго, во время написания программы. Когда есть единственный проработанный вариант, но уже хочется обозначить в программе место для перебора вариантов.
 
BabyBear писал(а) >>

Visual Studio 2008 позволяет конструкцию без case (генерируется только Warning)

она может пригодиться ненадолго, во время написания программы. Когда есть единственный проработанный вариант, но уже хочется обозначить в программе место для перебора вариантов.

Я примерно с такими намерениями и начал эксперимент :)

 

Признаться, я ждал реакции от авторов упомянутых документов. И жду. Придется в лоб:

Уважаемые авторы, будьте так добры, обратите внимание, прокомментируйте.

 
Babay писал(а) >>

Признаться, я ждал реакции от авторов упомянутых документов. И жду. Придется в лоб:

Уважаемые авторы, будьте так добры, обратите внимание, прокомментируйте.

Да, есть проблема. В ближайшее время исправим документацию.

Причина обращения: