Вопрос

На этот вопрос уже есть ответ здесь:

Я видел несколько ответов на этот вопрос, и я понимаю — вы не можете объявлять и присваивать переменные внутри switch.Но мне интересно, правильно ли следующее при выдаче ошибки, гласящей

ошибка:ожидаемое выражение перед 'int'

Код:

switch (i) {
    case 0:
        int j = 1;
        break;
}

Зачем было бы звонить в NSLog() прежде чем это не приведет ни к каким ошибкам?

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}
Это было полезно?

Решение

Ты на самом деле может объявляйте переменные внутри переключателя, если вы делаете это в соответствии с синтаксисом языка.Вы получаете сообщение об ошибке, потому что "case 0:" это ярлык, а в C незаконно иметь декларация в качестве первого оператора после метки — обратите внимание, что компилятор ожидает выражение, такие как вызов метода, обычное назначение и т.д.(Каким бы странным это ни было, таково правило.)

Когда вы поставили NSLog() первым, вы избежали этого ограничения.Вы можете заключить содержимое регистра в фигурные скобки { }, чтобы ввести блок области видимости, или вы можете переместить объявление переменной за пределы переключателя.То, что вы выберете, - это вопрос личных предпочтений.Просто имейте в виду, что переменная, объявленная в фигурных скобках { }, допустима только в пределах этой области, поэтому любой другой код, который ее использует, также должен отображаться в этих фигурных скобках.


Редактировать:

Кстати, эта причуда не так необычна, как вы могли бы подумать.В C и Java также незаконно использовать объявление локальной переменной в качестве одиночного оператора (что означает "не заключенный в фигурные скобки") в для, в то время как, или делай цикл, или даже в если и ещё пункты.(На самом деле, это описано в головоломке № 55 из "Java-головоломки", что я настоятельно рекомендую.) Я думаю, что мы обычно не пишем такие ошибки с самого начала, потому что не имеет смысла объявлять переменную в качестве единственного оператора в таких контекстах.С переключатель / кейс конструкции, однако, некоторые люди опускают фигурные скобки, поскольку перерыв оператор - это критический оператор для потока управления.

Чтобы убедиться, что компилятор выдает правильные результаты, скопируйте этот ужасный, бессмысленный фрагмент в свой (Objective-)C-код:

if (1)
    int i;
else
    int i;
for (int answer = 1; answer <= 42; answer ++)
    int i;
while (1)
    int i;
do
    int i;
while (1);

Еще одна причина всегда использовать фигурные скобки { } для разграничения тела таких конструкций.:-)

Другие советы

Я уже сталкивался с этой проблемой раньше, и пришел к выводу, что вы просто помещаете код внутри блока.

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}

Другой простой обходной путь, который я использую, - это добавить пустое выражение (точку с запятой) перед объявлением.Это позволяет избежать ограничения области видимости переменной блоком кода (или наличия некоторых операторов case с блоками кода, а некоторых без них).

switch (i) {
    case 0:;
        int j = 1;
        break;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top