¿Es largo un tipo de datos o calificador en C?
(3)
Estoy leyendo Programming in C by Stephan G. Kochan
. Afirma que C tiene solo cinco tipos de datos; int
, float
, double
, char
y _Bool
.
¿Qué hay de long
? ¿No es un tipo incorporado? http://www.programiz.com/c-programming/c-data-types dice que long
es un calificador para modificar el tamaño. Si es un calificador, entonces solo debe usarse como un long int
, y no como un long
independiente.
¿Y qué hay de _Bool
? Muchos tutoriales de Internet dicen que no hay un tipo booleano en C.
Relacionado:
Afirma que C tiene solo cinco tipos de datos; int, float, double, char y _Bool.
Eso es una simplificación excesiva. Tal vez intencional, si el libro está dirigido a principiantes.
Si pasa por C11 6.2.5, enumera los siguientes tipos de datos distintos:
Tipos de personajes (6.2.5 / 15)
char
signed char
unsigned char
Tipos enteros con signo estándar (6.2.5 / 4)
signed char
short int
int
long int
long long int
Tipos enteros sin signo estándar (6.2.5 / 5)
_Bool
unsigned char
unsigned short int
unsigned int
unsigned long int
unsigned long long int
Tipos flotantes reales (6.2.5 / 10)
float
double
long double
Tipos complejos (6.2.5 / 11)
float _Complex
double _Complex
long double _Complex
Tipo enumerado (6.2.5 / 16)
enum {}
tipo vacío (6.2.5 / 19) (el tipo vacío es un tipo incompleto)
void
Tipos derivados (6.2.5 / 20)
- Tipo de matriz
- Tipo de estructura
- Tipo de union
- Tipo de función
- Tipo de puntero
- Tipo atómico
Formalmente el término es especificador de tipo 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
Al menos un especificador de tipo se dará en los especificadores de declaración en cada declaración, y en la lista de calificador-especificador en cada declaración de estructura y nombre de tipo. Cada lista de especificadores de tipo debe ser uno de los siguientes conjuntos múltiples (delimitado por comas, cuando hay más de un conjunto múltiple por elemento); los especificadores de tipo pueden aparecer en cualquier orden, posiblemente entremezclados con los otros especificadores de declaración.
- vacío
- char
- firmado char
- Sin firmar
- corto, firmado corto, corto int, o firmado corto int
- sin signo corto, o sin signo int corto
- int, firmado o firmado int
- unsigned, o unsigned int
- largo, firmado largo, largo int, o firmado largo int
- sin firma larga, o sin firma larga int
- largo largo, firmado largo largo, largo largo int, o firmado largo largo int
- sin firmar long long, o unsigned long long int
- flotar
- doble
- doble largo
- _Bool
- flotar _Complejo
- Doble _Complex
- largo doble _Complex
- Especificador de tipo atómico
- Especificador de estructura o unión
- especificador de enumeración
- nombre de typedef
Como podemos ver, long
es un especificador de tipo. No es un calificador de tipo.
Del borrador C11, sección 6.2.5 ("Tipos)" párrafo 4:
Hay cinco tipos enteros con signo estándar, designados como
signed char
,short int
,int
,long int
ylong long int
.
La forma en que se especifican estos tipos en el texto del programa es otro problema, hay muchas maneras, ya que la sintaxis es más bien laxa. Por ejemplo, de acuerdo con 6.7.2 ("Especificadores de tipo"), las siguientes son formas válidas de especificar el mismo tipo :
long
,signed long
,long int
, osigned long int
Esto dice que long
por sí mismo es un especificador de tipo válido para el tipo long int
. Esto era lo mismo en C99 (y, supongo , también en estándares anteriores). Así que no, no es un calificativo.
Además, lo anterior se puede mezclar con elementos como asteriscos de puntero static
, volatile
, etc., etc.
Sugeriría leer otro libro, ya que es confuso leer libros que usan una terminología diferente de la estándar. Cuando se responde a las preguntas sobre C, a menudo se hace referencia al estándar, por lo que es una buena idea estar familiarizado con él.
En el lenguaje de programación C, los tipos de datos son declaraciones para ubicaciones de memoria o variables que determinan las características de los datos que pueden almacenarse y los métodos (operaciones) de procesamiento que están permitidos para involucrarlos.
El lenguaje C proporciona tipos aritméticos básicos, como los tipos de números enteros y reales, y la sintaxis para crear tipos de matriz y compuestos. Varios encabezados en la biblioteca estándar de C contienen definiciones de tipos de soporte, que tienen propiedades adicionales, como proporcionar almacenamiento con un tamaño exacto, independientemente de la implementación. https://wikipedia.org/wiki/C_data_types