Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Интегральные типы

#cpp #типы #условия


Почему конструкция switch case работает только с интегральными типами, и что вообще
такое интегральные типы?
    


Ответы

Ответ 1



Термин "integral" ("интегральный") является синонимом термина "integer" ("целочисленный"). Так что интегральные типы - это просто все целочисленные типы. Конструкция switch/case работает только с целочисленными типами потому, что, во-первых, ей нужен тип с четко и однозначно определенным отношением строгого равенства, что, например, исключает использование плавающих типов. В этом отношении switch/case аналогичен нетиповым шаблонным параметрам, которые тоже поддерживают только типы с четко определенным отношением равенства. Во-вторых, эта конструкция изначально задумывалась не просто как "синтаксический сахар", а с задней мыслью о том, что во многих случаях структура переходов в switch/case будет поддаваться очевидным оптимизациям: табличной реализации или реализации через прямое вычисление целевого адреса. Для "сложных" типов, вроде строк, возникновение возможности такой оптимизации выглядит существенно менее вероятным, чем для целочисленных типов. Разумеется, в современном С++ не составило бы, наверное, большого труда расширить диапазон поддерживаемых в switch/case типов. Но, насколько я знаю, таких планов пока нет.

Ответ 2



Сначала представим как работает эта конструкция. Не точно, но логика такая: int val[] = {3, 4, 7}, Cswitch_case =4; for (int i = 0; i < 3; ++i) { if (!(val[i] ^ Cswitch_case)) // так проверяет switch cout << i; Т.е. выполняется битовая операция, результат которого дает команду по какой метке выполнять программу. (правда, еще проверку, что оба нули, я не дописал). А для неинтегральных типов, обычно это невозможно. Например: } string s1("first"), s2 = s1; // if(!(s1 ^ s2)) эта битовая операция невозможна // cout << "...."; Поэтому было введено ограничение...

Комментариев нет:

Отправить комментарий