Подтвердить что ты не робот

Оператор switch в C/Objective C

Я новичок в Objetive C, но из всего, что мне известно о операторах switch, следующий код не должен печатать ничего, потому что для меня кажется, что должна произойти ошибка компиляции. Однако 2 печатается. Я не понимаю, почему. Может кто-нибудь объяснит?

- (void) test {
    int myVar = 2;

    switch (myVar) {
        case 1:
        {
            NSLog(@"result: %d", myVar);
            break;

            case 2:
            {
                NSLog(@"result: %d", myVar);
            }
            break;
        }
    }
}
4b9b3361

Ответ 1

Вы можете представить конструкцию switch(value){case label:, ...} как переменную goto <label>, где:

1) switch(arg) определяет, какое выполнение label будет выполняться до следующего.
2) Ключевое слово case: определяет метку . Пример: case label:.

В операторе switch за ключевым словом case следует метка (постоянное выражение, за которым следует :), который обрабатывается как метка, используемая в операторах goto. Элемент управления переходит к оператору, чей case constant-expression соответствует значению switch(arg).

Таким образом, в вашем коде нет ничего синтаксически неправильного. То есть, он будет компилироваться и создаваться, и работать просто отлично. Единственное, что нарушает синтаксис в вашем примере кода, - это читаемость, поскольку поток выполнения игнорирует блок {...}, который в большинстве случаев будет направлять поток выполнения и переходит непосредственно к целевой метке, определяемой ключевым словом case, просто как это должно.

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