Например, java имеет 8 примитивных типов, как задокументировано Oracle.
логическое, байтовое, короткое, символьное, целое, длинное, плавающее, двойное
Похоже, что в C существует много-много типов, но что, если какие-то из них считаются примитивными типами. Пожалуйста, перечислите их для ответа.
Я пытался найти надежную ссылку, похожую на Oracle, но для C, но не смог.
Википедия поддерживает тупой список «основных типов», но я не уверен, что они актуальны.
W3Schools упрощает это и перечисляет «базовые типы», но я также не уверен, что это актуально.
Что, если мы удалим неподписанные и подписанные части этого списка... что у нас останется?
У вас остался неполный список типов.
int
и unsigned int
определенно разные типы. Есть некоторые упрощения, которые вы, возможно, захотите сделать, но удаление различия по знаку определенно не является одним из них!
Если мы удалим, у нас будет - char, short, int, long, float, double
- в качестве основных типов, которые могут быть далее разбиты на другие типы. Интересно, что 8 типов Java содержат все 6 из них, но добавляют... boolean and byte
.
Интересно, какая разница в названии? Какая разница, используется ли слово «основное», «базовое» или «примитивное»?
Обратите внимание, что, как и в таблице в статье Википедии, произнесение long
или long int
— это всего лишь два способа написания одного и того же типа. То же самое с unsigned
и unsigned int
, и unsigned long
и unsigned long int
.
Существует как минимум 5 размеров целых чисел: char
, short
, int
, long
и long long
. (Обычно они не все имеют разные размеры, а в некоторых реализациях их может быть даже больше). Существует как минимум три размера типов с плавающей запятой: float
, double
и long double
, хотя, опять же, может быть некоторое совпадение, т. е. long double
может совпадать с double
на данной платформе.
Но затем начинают появляться морщины: char
странно, потому что он может быть подписанным или беззнаковым, поэтому некоторые говорят, что существует три основных типа символов: char
, signed char
и unsigned char
(причем одна пара или другая идентичны на любой данной платформе). А тут еще bool
. А еще есть intmax_t
и intptr_t
. А еще есть size_t
и ptrdiff_t
. И этот список можно продолжить... (Приложение: А еще есть wchar_t
...)
«примитивные типы» не являются терминологией C. В Java это позволяет различать ссылочные типы. Переворачивание вопроса, вероятно, более значимо/полезно - C не имеет Java, подобных ссылочным типам. Глядя на этот список характеристик эталонных типов Java с точки зрения C, я бы ответил примерно так: этого не существует в языке, это не совсем то, как все работает, и это на самом деле не так. иметь значение. Какой бы ни была терминология, существуют существенные различия из-за отсутствия ссылочных типов в стиле Java.
Я подозреваю, что если бы вы заглянули «под капот» в исходный код любого транслятора C (компилятора или интерпретатора), вы бы нашли список «базовых типов», которые вы ищете. В части синтаксического анализатора, отвечающей за разбор имен типов, таких как «long int
» и «unsigned char
», вы найдете всевозможные довольно сложные сопоставления, но с прилично небольшим набором «базовых типов», выпадающих в конце.
@SteveSummit некоторые говорят, что существует три основных типа символов И что «некоторые» верны, потому что эти «некоторые» включают стандарт C: «Три типа char, signed char и unsigned char вместе называются типами символов ."
Ответ нет, и по 2 причинам.
int
обычно выбирается как естественный тип для архитектуры, если он содержит не менее 16 бит. С другой стороны, Jave нацелен на максимальную переносимость и фиксирует размер всех своих типов.Так что даже если список в Википедии выглядит большим, он (к сожалению...) точен.
Разве char
, long
, double
и т. д. не считаются примитивными типами данных?
@GIZC не имеет "примитивных" типов. Это слово неприменимо к C. C просто имеет «типы».
Если список в Википедии выглядит длинным, то это отчасти потому, что Википедия перечисляет несколько альтернативных написаний для многих типов. Это не совсем неточно, но потенциально обманчиво. Например, short
не отличается от signed short int
.
@andrew - этому стандарту более 10 лет, у вас есть ссылка на более новую версию?
@bobbywang В настоящее время нет более свежего утвержденного стандарта. C18 просто «устранены дефекты в C11 без добавления новых языковых функций». C23 все еще не утвержден и находится в черновике.
Таким образом, он был недавно одобрен, он просто не добавляет больше языковых функций.
Я бы сказал, что в C есть концепция «примитивного» или «базового» типа, но, как мы видели (в вопросе, комментариях и связанной статье Википедии), список этих типов довольно длинный, далеко не такой краткий, как вы могли бы подумать, или как это было во времена K&R.
Мое собственное определение примитивного типа в C, вероятно, неудовлетворительно, «все, из чего вы можете построить производные типы, такие как массив, указатель на, возврат функции и структура, содержащая».
Я почти уверен, что в грамматике стандарта C есть постановления для базовых и производных типов, но у меня нет под рукой моей копии, чтобы проверить.
Текущий список типов C выглядит таким длинным и сложным, потому что он содержит, по причинам разработки программного обеспечения и переносимости, большое количество «псевдонимов», каждый из которых в конечном итоге отображается на какой-то другой тип способом, зависящим от реализации. Например, int32_t
обычно совпадает с int
или long int
, а size_t
обычно совпадает с unsigned int
или unsigned long int
.
Если вы хотите составить краткий список, я думаю, вы начнете с:
void
bool
int
довольно многих размеров (включая char
и wchar_t
)unsigned int
довольно много размеровИ тогда у вас есть набор «символических» типов, таких как size_t
, ptrdiff_t
и intptr_t
, которые обычно сопоставляются с различными типами int
или unsigned int
способом, определяемым реализацией.
И тогда у вас есть набор типов точного размера, таких как int8_t
, int16_t
и uint32_t
, и все они сопоставляются с другими целочисленными типами способом, определяемым реализацией.
Вы также должны быть осторожны, думая о типах персонажей. Обычный char
может быть как подписанным, так и беззнаковым, поэтому вы можете представить, что на самом деле существует три основных типа символов: char
, signed char
и unsigned char
(причем либо char
и signed char
, либо char
и unsigned char
идентичны на любой данной платформе). Также есть тип wchar_t
с собственным отображением, определяемым реализацией.
В C я привык к тому, что примитивный тип означает одно из двух. Либо это не структура и не массив, либо это не структура и не массив и не указатель, в зависимости от контекста.
Полный список типов находится в разделе 6.7.2 C11. Это даже длиннее, чем список в Википедии. А еще есть спецификаторы класса хранения, квалификаторы типов и спецификаторы выравнивания. И давайте не будем забывать о битовых полях.
список этих типов довольно длинный Не совсем так: 1. [un[signed]] char
, 2. [un[signed]] short [int]
, 3. [un[signed]] int
, 4. [un[signed]] long [int]
, 5. [un[signed]] long long [int]
6. float
7. double
, 8. long double
.
@AndrewHenle, ты забыл [float/[long] double] _Complex и _Bool
@Elzaidir 6, 7 и 8. _Bool
будет реализован как целочисленный тип без знака с ограниченным значением, взятый из 1-5 моего списка, а _Complex
является необязательным и фактически представляет собой совокупность двух значений с плавающей запятой, взятых из 6-8. из моего списка.
Похоже, что в C существует много-много типов, но что, если какие-то из них считаются примитивными типами.
Термин Java «примитивный тип» отличается от ссылочных типов. C не имеет прямого аналога ссылочных типов Java, поэтому нет необходимости проводить такое различие.
Однако C определяет несколько категорий типов, и среди них базовые типы являются достаточно хорошим аналогом примитивных типов Java. В эту категорию входят char
, целые типы со знаком и без знака, а также типы с плавающей запятой. В конечном итоге именно из них, перечисляемых типов и типа void
получаются все остальные типы, включая типы массивов, типы структур и объединений, типы указателей, атомарные типы и типы функций.
Базовые типы могут включать в себя типы, определенные реализацией, и поэтому не могут быть перечислены исчерпывающе, но те, которые определены спецификацией языка:
char
Стандартные целочисленные типы со знакомsigned char
, short int
, int
, long int
, long long int
Стандартные целочисленные типы без знака_Bool
, unsigned char
, unsigned short int
, unsigned int
, unsigned long int
, unsigned long long int
Настоящие плавающие типыfloat
, double
, long double
Сложные типыfloat _Complex
, double _Complex
, long double _Complex
Это описано в разделе 6.2.5 спецификации языка.
Следует отметить, что в то время как Java определяет размер и представление своих примитивных типов, C оставляет некоторые из этих деталей своих базовых типов реализациям, накладывая ограничения на их диапазоны представляемых значений и другие свойства без указания точных деталей.
C, кажется, имеет много, много типов
C имеет неограниченное количество типов, так как он предусматривает, что типы могут быть производными от других типов. То же самое относится и к Яве. Игнорируя определяемые реализацией типы расширения, C имеет более чем в два раза больше базовых типов, чем Java имеет примитивные типы, но это все же управляемо, особенно с учетом того, как они организованы.
Однако в C также есть механизм для определения псевдонимов типов и целое семейство стандартных псевдонимов типов, которые могут создать впечатление, что типов больше, чем есть на самом деле.
К сожалению, не существует связного набора словарного запаса, который можно было бы распространить на несколько языков.
Примитивные типы Java отличают их от типов объектов или ссылочных типов.
В то время как C имеет много типов, самыми близкими к примитивным типам Java являются основные типы.
Языки делают разные вещи и, следовательно, имеют разные группы для своих типов, и сами типы различны.
Int в C может быть 2 байта для встроенной системы, но в Java это всегда 4 байта.
Я собирался сказать: «С имеет хороший небольшой список основных типов, как и Java», но, поразмыслив, эта статья в Википедии, при всей ее сложности, выглядит довольно точной. Обратите внимание, что на практике многие типы в основном являются синонимами друг друга. Например, на подавляющем большинстве обычных машин будет обнаружено, что тип
int
идентичен либо типуint16_t
, либоint32_t
, а типunsigned int
идентиченuint16_t
илиuint32_t
.