Синтаксис оператора switch в C? - PullRequest
       60

Синтаксис оператора switch в C?

2 голосов
/ 28 сентября 2019

Я пытаюсь понять оператор switch в C (я использую gcc из Ubuntu v16.04).Я могу понять его семантику, но у меня есть следующие 2 вопроса о его синтаксисе:

  1. Я заметил после прочтения нескольких примеров использования оператора switch, что символ после регистра иногдазаключено в '' и иногда это не так.например: case 1 или case 'a'.Я проверил страницу руководства Linux для оператора switch (https://linux.die.net/man/1/switch), и там они не использовали '' для строки. Поэтому я не знаю, что делать.

  2. Иногда блок кода в одном регистре заключен в { }, а иногда нет. Я читал ранее, что многострочные операторы должны быть заключены в { }, но не обязательно для однострочных операторов, так какв цикле for, в то время как цикл с однострочными операторами и т. д. Но иногда оператор case имеет 1 строку кода (например, a *= 5;), за которой следует оператор break (итого всего 2 оператора), и все же обе строки не заключены в{ }. Руководства Linux не упоминали об этом. Кто-то может это прояснить?

Ответы [ 4 ]

2 голосов
/ 28 сентября 2019

(1) «a» - это значение ascii 97. Ascii - это стандартный способ кодирования символов, который также используется во многих других языках.По сути, каждый символ представлен в виде числового значения.Поэтому, когда у вас есть:

...
case 'a':
...

, вы фактически выполняете код ниже случая, если переменная переключателя равна 97. В вашем примере:

case '1':

проверяет, является ли переменная переключателяравно char '1', что равно значению ascii 49.

(2) Заключение оператора case в фигурные скобки изменяет область видимости переменных между фигурными скобками.Рассмотрим следующий пример:

switch (sw) {
    case 1:
        int b = 2;
        sw += b;
        break;
    case 2:
        int b = 3;
        sw += b;
        break;
    default:
        break;
}

Это потому, что в случае 1 и 2 вы создаете целое число с именем "b".Поскольку оба оператора case находятся в одной области переменных (область действия оператора switch), компилятор выдает ошибку, поскольку вы создаете экземпляр переменной с одинаковым именем и типом дважды.Теперь рассмотрим код ниже:

    switch (sw) {
    case 1: {
        int b = 2;
        sw += b;
        break;
    } case 2: {
        int b = 3;
        sw += b;
        break;
    } default: {
        break;
    }
}

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

2 голосов
/ 28 сентября 2019

Чтобы ответить на ваши вопросы:
q1: 1 и '1' не совпадают.Последний заключен в одинарные кавычки, которые в C всегда представляют символ.В зависимости от реализации C, этот символ будет сохранен в формате ASCII с числовым представлением 49. Вид символа в формате ASCII гарантирует возможность числового представления, но не число, сравнение '1' == 1является законным, потому что символ безразличия будет преобразован в целое число.

q2: Заключение кейса в фигурные скобки необязательно.Вы можете объявить область в любое время, используя фигурные скобки.Дополнительная информация: https://www.geeksforgeeks.org/scope-rules-in-c/, C Фигурные скобки для распределительных коробок после каждого случая

1 голос
/ 28 сентября 2019

(1) Вы спрашиваете об операторе switch в C (в частности, gcc), но ссылка, которую вы включили, предназначена для оператора switch в оболочке Linux.Это два разных языка!В Си одинарная кавычка '' используется для символов.Символ представляет собой одну букву / число / символ / и т. Д., В отличие от строки, состоящей из одного или нескольких символов.Таким образом, case 1: будет соответствовать номеру 1, а case '1': будет соответствовать символу '1'.Число имеет тип типа int или long.Персонаж имеет тип char.Поэтому, используете ли вы '' или нет, зависит от того, пытаетесь ли вы сопоставить символ или число.

(2) {} не обязательны.Вы можете использовать их для визуальной группировки блока кода, но это не обязательно.Вы также можете использовать {} для ограничения области видимости переменной.Переменная область является большой темой, см. Это для получения дополнительной информации: https://www.w3schools.in/c-tutorial/variable-scope/

1 голос
/ 28 сентября 2019

Там нет справочной страницы для switch, используемой в C. Что вы смотрите, так это справочная страница для команды switch (согласно (1) в названии), что-то совершенно другое.

  1. A case необходимо использовать одинарные кавычки для символьной константы и не использовать одинарные кавычки для не символьной константы.

    Например, case '1': проверяет наличие символа'1' (обычно с целочисленным значением 49) и case 1: проверяет целочисленное значение 1.

  2. фигурные скобки в основном являются предпочтением стиля,Некоторые люди думают, что фигурные скобки делают их код более приятным и понятным, а некоторые нет.Разницы нет, за исключением области действия.

    Это позволяет вам определять переменную в отдельной метке case, чтобы вы не делали ее доступной для всей функции или оператора switch.

...