Система типов C
Термины из этой сессии:
Вы всё выучили. Повторите термины или двигайтесь дальше.
Перетаскивайте соответствующие элементы друг на друга, и они будут исчезать с экрана.
Ваше время: 2 минуты.
[{"term":"Концепция типа важна в C ","def":"Каждая переменная, аргумент функции и возвращаемое значение функции должны иметь тип, чтобы их можно было скомпилировать. Кроме того, все выражения (включая литеральные значения) неявно присваиваются компилятором типу перед их вычислением. Некоторые примеры типов включают встроенные типы, такие как int для хранения целочисленных значений, double для хранения значений с плавающей запятой или типы стандартной библиотеки, такие как класс std::basic_string для хранения текста. Вы можете создать собственный тип, определив class или struct. Тип задает объем памяти, выделяемой для переменной (или результата выражения). Тип также определяет типы хранимых значений, способ интерпретации компилятором битовых шаблонов в этих значениях и операции, которые можно выполнять с ними."},{"term":"Скалярный тип","def":"Скалярный тип: тип, содержащий одно значение определенного диапазона. Скаляры включают арифметические типы (целочисленные или значения с плавающей запятой), элементы типа перечисления, типы указателей, типы указателей на члены и std::nullptr_t. Основными типами обычно являются скалярные типы."},{"term":"Составной тип","def":"Составной тип: тип, который не является скалярным типом. Составные типы включают типы массивов, типы функций, типы классов (или структур), типы объединения, перечисления, ссылки и указатели на нестатические члены класса."},{"term":"Переменная","def":"Переменная: символическое имя количества данных. Имя можно использовать для доступа к данным, на которые оно ссылается, в пределах области кода, в которой оно определено. В C переменная часто используется для ссылки на экземпляры скалярных типов данных, тогда как экземпляры других типов обычно называются объектами."},{"term":"Объект","def":"Объект. Для простоты и согласованности в этой статье термин объект используется для обозначения любого экземпляра класса или структуры. При использовании в общем смысле он включает все типы, даже скалярные переменные."},{"term":"Тип POD","def":"Тип POD (обычные старые данные). Эта неформальная категория типов данных в C относится к скалярным типам (см. раздел Фундаментальные типы) или классам POD. Класс POD не имеет статических элементов данных, которые также не являются POD, и не имеет пользовательских конструкторов, определяемых пользователем деструкторов или определяемых пользователем операторов присваивания. Кроме того, класс POD не имеет виртуальных функций, базового класса и ни закрытых, ни защищенных нестатических данных-членов. Типы POD часто используются для внешнего обмена данными, например с модулем, написанным на языке С (в котором имеются только типы POD)."},{"term":"Указание типов переменных и функций","def":"C является строго типизированным языком и статически типизированным языком; у каждого объекта есть тип, и этот тип никогда не меняется. При объявлении переменной в коде необходимо либо явно указать ее тип, либо использовать ключевое auto слово , чтобы указать компилятору вывести тип из инициализатора. При объявлении функции в коде необходимо указать тип возвращаемого значения и каждого аргумента. Используйте тип void возвращаемого значения, если функция не возвращает значение. Исключением является использование шаблонов функций, которые позволяют использовать аргументы произвольных типов."},{"term":"После первого объявления переменной","def":"После первого объявления переменной вы не сможете изменить ее тип позже. Однако можно скопировать значение переменной или возвращаемое значение функции в другую переменную другого типа. Такие операции называются преобразованиями типов, которые иногда необходимы, но также являются потенциальными источниками потери или неправильности данных."},{"term":"При объявлении переменной типа POD","def":"настоятельно рекомендуется инициализировать ее, то есть присвоить ей начальное значение. Пока переменная не инициализирована, она имеет \"мусорное\" значение, определяемое значениями битов, которые ранее были установлены в этом месте памяти. Это важный аспект C , особенно если вы используете другой язык, который обрабатывает инициализацию. При объявлении переменной типа класса, отличного от POD, конструктор обрабатывает инициализацию."},{"term":"Базовые (встроенные) типы","def":"В отличие от некоторых других языков, в C нет универсального базового типа, от которого наследуются все остальные типы. Язык включает в себя множество фундаментальных типов, также называемых встроенными типами. К этим типам относятся числовые типы, такие как int, double, long, bool, а также char типы и wchar_t для символов ASCII и ЮНИКОД соответственно. Большинство целочисленных фундаментальных типов (кроме bool, double, wchar_tи связанных типов) имеют unsigned версии, которые изменяют диапазон значений, которые могут храниться в переменной. Например, , в intкотором хранится 32-разрядное целое число со знаком, может представлять значение от -2 147 483 648 до 2 147 483 647. Объект unsigned int, который также хранится в виде 32 бита, может хранить значение от 0 до 4 294 967 295. Общее количество возможных значений в каждом случае одинаково, отличается только диапазон."},{"term":"Компилятор распознает","def":"эти встроенные типы и имеет встроенные правила, которые определяют, какие операции можно выполнять с ними и как их можно преобразовать в другие фундаментальные типы. Полный список встроенных типов, их размер и числовые ограничения см. в разделе Встроенные типы."},{"term":"Тип void","def":"Тип void является особым типом; нельзя объявить переменную типа void, но можно объявить переменную типа void * (указатель на void), что иногда необходимо при выделении необработанной (нетипизированной) памяти. Однако указатели на void не являются типобезопасны, и их использование в современном C не рекомендуется. В объявлении функции возвращаемое void значение означает, что функция не возвращает значение; использование его в качестве возвращаемого типа является распространенным и приемлемым использованием void. Хотя для языка C требуются функции, которые не имеют параметров для объявления void в списке параметров, например , fn(void)в современном C такая практика не рекомендуется; функция без параметров должна быть объявлена fn(). Дополнительные сведения см. в разделе Преобразование типов и безопасность типов."},{"term":"const квалификатор типа","def":"Любой встроенный или определяемый пользователем тип может быть квалифицирован ключевым словом const . Кроме того, функции-члены могут быть const квалифицированными и даже const перегруженными. Значение типа нельзя изменить после его инициализации const .\n\nconst double PI = 3.1415;\nPI = .75; //Error. Cannot modify const variable.\n\nКвалификатор const широко используется в объявлениях функций и переменных, а \"константная правильность\" является важной концепцией в C . По сути, это означает, чтобы во const время компиляции гарантировать, что значения не изменяются непреднамеренно. Для получения дополнительной информации см. const.\n\nТип const отличается от его версии, отличной const от версии; например, const int является типом, отличным от int. Оператор C const_cast можно использовать в тех редких случаях, когда необходимо удалить const-ness из переменной. Дополнительные сведения см. в разделе Преобразование типов и безопасность типов."},{"term":"Строковые типы","def":"Строго говоря, язык C не имеет встроенного строкового типа; char и wchar_t сохранение отдельных символов — необходимо объявить массив этих типов для приближения строки, добавив завершающее значение NULL (например, ASCII '\\0') к элементу массива на один после последнего допустимого символа (также называемого строкой в стиле C). Строки в стиле C требовали написания гораздо большего объема кода или использования внешних библиотек служебных функций. Но в современном C у нас есть типы std::string стандартной библиотеки (для 8-разрядных char символьных строк) или std::wstring (для 16-разрядных wchar_t символьных строк). Эти контейнеры стандартной библиотеки C можно рассматривать как собственные строковые типы, так как они являются частью стандартных библиотек, включенных в любую соответствующую среду сборки C . Используйте директиву , #include чтобы сделать эти типы доступными в программе. (Если вы используете MFC или ATL, CString класс также доступен, но не входит в стандарт C .) В современном C не рекомендуется использовать символьные массивы, завершаемые значением NULL (упомянутые ранее строки в стиле C)."},{"term":"Определяемые пользователем типы","def":"При определении class, struct, union или enum эта конструкция используется в остальной части кода, как если бы это был фундаментальный тип. Он имеет известный размер в памяти, и в его отношении действуют определенные правила проверки во время компиляции и во время выполнения в течение срока использования программы. Основные различия между базовыми встроенными типами и пользовательскими типами указаны ниже:\n\nКомпилятор не имеет встроенных сведений о пользовательском типе. Он узнает о типе при первом обнаружении определения в процессе компиляции.\n\nПользователь определяет, какие операции можно выполнять с типом и как его можно преобразовать в другие типы, задавая (через перегрузку) соответствующие операторы, либо в виде членов класса, либо в виде функций, не являющихся членами. Дополнительные сведения см. в разделе Перегрузка функций."},{"term":"типы указателей","def":"Как и в самых ранних версиях языка C, C по-прежнему позволяет объявлять переменную типа указателя с помощью специального декларатора * (звездочки). Тип указателя хранит адрес расположения в памяти, в котором хранится фактическое значение данных. В современном C эти типы указателей называются необработанными указателями, и доступ к ним в коде осуществляется через специальные операторы: * (звездочка) или -> (дефис с большим, чем, часто называется стрелкой). Эта операция доступа к памяти называется разыменовыванием. Используемый оператор зависит от того, разыменовывание указателя на скаляр или на элемент в объекте.\n\nРабота с типами указателя долгое время была одним из наиболее трудных и непонятных аспектов разработки программ на языках C и C . В этом разделе описаны некоторые факты и методики, которые помогут при необходимости использовать необработанные указатели. Однако в современном C больше не требуется (или рекомендуется) использовать необработанные указатели для владения объектами из-за эволюции интеллектуального указателя (подробнее рассматривается в конце этого раздела). По-прежнему полезно и безопасно использовать необработанные указатели для наблюдения за объектами. Однако если их необходимо использовать для владения объектами, следует делать это с осторожностью и с тщательной тщательной учетом того, как создаются и уничтожаются принадлежащие им объекты.\n\nПервое, что следует знать, это то, что объявление переменной необработанного указателя выделяет только достаточно памяти для хранения адреса: расположение памяти, на которое ссылается указатель при разыменовании. Объявление указателя не выделяет память, необходимую для хранения значения данных. (Эта память также называется резервным хранилищем.) Иными словами, объявляя переменную необработанного указателя, вы создаете переменную адреса памяти, а не фактическую переменную данных. Если разыменовывание переменной указателя перед тем, как убедиться, что она содержит допустимый адрес для резервного хранилища, это приведет к неопределенному поведению (обычно это неустранимая ошибка) в программе. В следующем примере демонстрируется подобная ошибка:\n\nint* pNumber; // Declare a pointer-to-int variable.\n*pNumber = 10; // error. Although this may compile, it is\n // a serious error. We are dereferencing an\n // uninitialized pointer variable with no\n // allocated memory to point to.\n\nПример разыменовывает тип указателя без выделения памяти для хранения фактических целочисленных данных или без выделенного допустимого адреса памяти. В следующем коде исправлены эти ошибки:\n\nint number = 10; // Declare and initialize a local integer\n // variable for data backing store.\n int* pNumber =