Объявление переменных в операторе переключения [дубликат]

Ожидайте бросает монитор, таким образом, у Вас должен быть он для отказа от него. Уведомьте должен иметь монитор также.

главная причина, почему Вы хотите сделать, это должно гарантировать, чтобы у Вас был монитор, когда Вы возвращаетесь из ожидания () - обычно, Вы используете ожидать/уведомлять протокол для защиты некоторого совместно используемого ресурса, и Вы хотите, чтобы он был безопасен коснуться его, когда ожидают возвраты. То же с уведомляет - обычно, что Вы изменяете что-то и затем звоните, уведомляют () - что Вы хотите иметь монитор, внести изменения, и вызов уведомляет ().

, Если Вы сделали функцию как это:

public void synchWait() {
   syncronized { wait(); }
}

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

114
задан Sourav Ghosh 28 January 2015 в 07:37
поделиться

2 ответа

Фактически можно объявлять переменные внутри переключателя, если вы делаете это в соответствии с синтаксисом языка. Вы получаете сообщение об ошибке, потому что « case 0: » - это метка, а в C недопустимо иметь объявление в качестве первого оператора после метки - обратите внимание, что компилятор ожидает выражение , такое как вызов метода, нормальное присваивание и т.д. (хотя это может быть странно, но это правило).

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


Изменить:

Между прочим, эта причуда не такая уж редкость, как вы могли подумать. В C и Java также незаконно использовать объявление локальной переменной в качестве единственного оператора (что означает «не заключенное в фигурные скобки) в для , while или do , или даже в предложениях if и else (на самом деле, это описано в головоломке № 55 из "Java Puzzlers" , которую я очень рекомендую.) Я думаю, что мы обычно не пишем такие ошибки для начала, потому что не имеет смысла объявлять переменную как единственный оператор в таких контекстах. С switch / case конструкции , хотя, некоторые люди опускают фигурные скобки, поскольку оператор break является критическим оператором для потока управления.

Чтобы убедиться, что бросок компилятора подходит, скопируйте этот ужасный, бессмысленный фрагмент в свой (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);

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

140
ответ дан 24 November 2019 в 02:35
поделиться

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

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}
46
ответ дан 24 November 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: