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

Долго ли тип данных или определитель в C?

Я читаю Programming in C by Stephan G. Kochan. Он утверждает, что C имеет только пять типов данных; int, float, double, char и _Bool.

Как насчет long? Разве это не встроенный тип? http://www.programiz.com/c-programming/c-data-types говорит, что long является квалификатором для изменения размера. Если это определитель, то он должен использоваться только как long int, а не как отдельный long.

А как насчет _Bool? Многие интернет-уроки говорят, что в C нет булева типа.

по теме:

4b9b3361

Ответ 1

Он утверждает, что C имеет только пять типов данных; int, float, double, char и _Bool.

Это довольно упрощение. Может быть, намеренно, если книга нацелена на новичков.

Если вы перейдете через C11 6.2.5, в нем перечислены следующие различные типы данных:

Типы символов (6.2.5/15)

char
signed char
unsigned char

Стандартные стандартные целочисленные типы (6.2.5/4)

signed char
short int
int
long int
long long int

Стандартные беззнаковые целочисленные типы (6.2.5/5)

_Bool
unsigned char
unsigned short int
unsigned int
unsigned long int
unsigned long long int

Реальные плавающие типы (6.2.5/10)

float
double
long double

Сложные типы (6.2.5/11)

float _Complex
double _Complex
long double _Complex

Перечислимый тип (6.2.5/16)

enum {}

void type (6.2.5/19) (тип void является неполным)

void

Производные типы (6.2.5/20)

  • Тип массива
  • Тип структуры
  • Тип соединения
  • Тип функции
  • Тип указателя
  • Атомный тип

Формально термин является спецификатором типа 6.7.2:

type-specifier:
void
char
short
int
long
float
double
signed
unsigned
_Bool
_Complex
atomic-type-specifier
struct-or-union-specifier
enum-specifier
typedef-name

В заявлении должен быть указан хотя бы один спецификатор типа спецификаторов в каждом объявлении и в списке спецификаторов-классификаторов в каждое объявление структуры и имя типа. Каждый список спецификаторов типа должен быть одним из следующих мультимножеств (разделенных запятыми, когда существует более одного мультимножества на элемент); спецификаторы типа могут происходят в любом порядке, возможно, смешанные с другим выражением спецификаторы.
- void
- char
- подписано char
- unsigned char
- короткий, подписанный короткий, короткий int или подписанный короткий int
- unsigned short, или unsigned short int
- int, подписанный или подписанный int
- unsigned, или unsigned int
- длинный, подписанный длинный, длинный int или подписанный long int
- unsigned long, или unsigned long int
- длинный длинный, подписанный длинный длинный, длинный длинный int или подписанный long long int
- unsigned long long, или unsigned long long int
- float
- двойной
- длинный двойной
- _Bool
- float _Complex
- двойной _Complex
- длинный двойной _Complex
- спецификатор атомного типа
- struct или union specifier
- спецификатор перечисления
- typedef name

Как мы видим, long является спецификатором типа. Это не определение типа.

Ответ 2

Из проекта C11, раздел 6.2.5 ( "Типы" ), пункт 4:

Существует пять стандартных стандартных значений, обозначенных как signed char, short int, int, long int и long long int.

Как эти типы указаны в тексте программы, это еще одна проблема, есть много способов, поскольку синтаксис довольно слабый. Например, согласно 6.7.2 ( "Спецификаторы типов" ) все допустимые способы указать один и тот же тип:

long, signed long, long int или signed long int

Это говорит о том, что long сам по себе является допустимым спецификатором типа для типа long int. Это было то же самое в C99 (и, я бы предположил, более ранние стандарты тоже). Так что нет, это не квалификатор.

Кроме того, вышеуказанное может смешиваться с такими вещами, как static, volatile, звездочками указателей и т.д.

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

Ответ 3

В языке программирования C типы данных представляют собой объявления для местоположений или переменных памяти, которые определяют характеристики данных, которые могут быть сохранены, и методы (операции) обработки, которые разрешены с их участием.

Язык C предоставляет базовые арифметические типы, такие как целые и действительные типы номеров, и синтаксис для построения массивов и составных типов. Несколько заголовков в стандартной библиотеке C содержат определения типов поддержки, которые имеют дополнительные свойства, такие как предоставление хранилища с точным размером, независимо от реализации. https://wikipedia.org/wiki/C_data_types