2016-12-06 2 views
-5

Может ли предложение иметь синтаксис для switch, который не нуждается в breaks все время выполнимо?Может ли быть бесполезным выключатель/корпус?

Мое предложение было бы вставить auto как до switch и каждый случай:

auto switch(expr) { 
    auto case 1: statement; statement; 
    auto case 2: statement; statement; 
    default: statement; statement; 
} 

будет эквивалентно

switch(expr) { 
    case 1: statement; statement; break; 
    case 2: statement; statement; break; 
    default: statement; statement; 
} 

Компилятор пожалуется с ошибки

  • , если влюбой case не предваряется auto или
  • , если auto case используется в auto -Меньше switch.

Есть ли проблема с парсером, которую можно ожидать, любые двусмысленности?

Есть ли дополнительная польза от ошибочных ошибок использования пользователей, таких как лучшие возможности оптимизации?

Update

Несколько более полезный вариант был бы, где место разрыва не так ясно:

case(expr) { 
    case 1: 
     if(isThisTrue) { 
     print(that); 
     } else { 
     break; 
     } 
     doSomethingElse(); 
     if(!isThisTrue) { 
     break; 
     } 

... или что-то вроде этого.

Я думаю, что предотвращение провала полезно для предотвращения некоторых трудностей для диагностики ошибок.

+9

Почему 'auto' в начале лучше, чем' break' в конце? – alexeykuzmin0

+1

@ alexeykuzmin0 это одна буква меньше, чем тип, и это будет еще одно ключевое слово с совершенно разными значениями, что делает C++ еще более сложным;) – user463035818

+0

, потому что один недостающий разрыв трудно обнаружить компилятором. Но если вы решите использовать «автоматический переключатель», вы перестанете использовать «автоматический случай» - «эквивалент» «break». – towi

ответ

2

Это не будет по многим причинам!

  • Наиболее очевидным: это не спасает любое время totype авто, а не перерыв

  • Это намного менее читаемым. Точно так же, как никто не рекомендовал бы использование goto, ваше предложение трудно дешифровать. Представьте себе длинный блок , читателю нужно было бы иметь в виду это ключевое слово auto все время, когда он читает блок. Если вы не используете много goto, C++ приятно читать, потому что вы не должны постоянно подниматься и опускаться в коде.

  • Оператор case может не систематически ломаться, и если я захочу добавить условие, которое пропустит перерыв, ваш авто, скорее всего, будет забыт и раздражает меня при компиляции.

  • auto уже что-то значит. Добавление новых ключевых слов на язык может раздражать, но повторное использование некоторых с другим значением просто плохо!

Чтобы ответить на ваш вопрос, наконец: нет, это не вызвало бы проблему синтаксического анализа. Просто замените auto case[...]auto на case[...]break. На самом деле вы можете определить свой собственный макрос, чтобы сделать это! И тем самым вы, вероятно, поймете, почему это не нужно.

Что-то вроде:

#define AUTO(x) x break; 
switch(i){ 
case 1: std::cout<<1; 
AUTO case 2: std::cout<<2; 
AUTO default: std::cout<<i 
} 

Примечания: Этот макрос любопытного скручивания точки, я знаю. Определенный способ сделать что-то ближе к тому, что вы имеете в виду, я подумаю об этом и обновлю, когда у меня будет время.

+0

Я согласен с тем, что «заявление о ситуации не может систематически ломаться». Действительно, в некоторых случаях вы пишете свои деловые заявления по-разному. Я не согласен с другими пунктами. Я удивлен, что это даже точка для кого-то. Конечно, это не экономит время на ввод, но оно не менее * читаемо. И точка, что 'auto' уже означает что-то (многие, на самом деле), я думал, будет хорошо, потому что это будет« авто ». Итак, я не хотел, чтобы это обсуждение (неуместно для S.O.), но «это выполнимо». Поэтому я уберу вопрос. Действительно, ваш макрос не то, что я имею в виду. – towi

Смежные вопросы