2016-06-23 33 views
25

Sto leggendo Programming in C by Stephan G. Kochan. Dichiara che C ha solo cinque tipi di dati; int, float, double, char e _Bool.È lungo un tipo di dati o un qualificatore in C?

Che dire di long? Non è un tipo integrato? http://www.programiz.com/c-programming/c-data-types dice long è un qualificatore per modificare la dimensione. Se si tratta di un qualificatore, dovrebbe essere utilizzato solo come long int e non come uno standalone long.

E che dire di _Bool? Molti tutorial su Internet dicono che non c'è nessun tipo booleano in C.

correlati:

+5

'molti tutorial di Internet dicono che non c'è il tipo booleano in C' perché' _bool' è stato aggiunto in C99. –

+15

Fare attenzione quando si esplorano tutorial C casuali sulla rete. Tendono ad essere pieni di BS. Non c'è nulla chiamato "qualificatore di segno" in C, e non c'è mai stato. La persona che ha scritto quel tutorial ha semplicemente tirato fuori quel termine dal suo posteriore. – Lundin

+0

Il materiale su Internet può essere attendibile, ma i libri probabilmente no. –

risposta

37

Dichiara che C ha solo cinque tipi di dati; int, float, double, char e _Bool.

Questa è una semplificazione eccessiva. Forse intenzionale, se il libro è rivolto ai principianti.

Se si passa attraverso C11 6.2.5 elenca i seguenti tipi di dati distinti:

tipi di carattere (6.2.5/15)

char 
signed char 
unsigned char 

Uniche sottoscritte tipi interi (6.2 .5/4)

signed char 
short int 
int 
long int 
long long int 

tipi unsigned interi standard (6.2.5/5)

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

tipi reali galleggianti (6.2.5/10)

float 
double 
long double 

tipi complessi (6.2.5/11)

float _Complex 
double _Complex 
long double _Complex 

Tipo elencato (6.2.5/16)

enum {} 

tipo void (6.2.5/19) (tipo void è un tipo incompleto)

void 

tipi derivati ​​ (6.2.5/20) Tipo

  • Array
  • Tipo di struttura
  • Unione tipo
  • Tipo di funzione
  • tipo Pointer
  • tipo atomica

Formalmente il termine è indicatore di 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 

almeno un indicatore di tipo deve essere indicato nella dichiarazione specificatori in ogni dec laration e nell'elenco di qualificatore specificatore in ogni dichiarazione di struct e nome del tipo. Ogni elenco di identificatori di tipo deve essere uno dei seguenti multiset (delimitato da virgole, quando c'è più di un multiset per articolo); gli identificatori di tipo possono verificarsi in qualsiasi ordine, eventualmente mescolati con gli altri specificatori di dichiarazione .
- vuoto
- char
- firmato char
- unsigned char
- breve, firmato a breve, short int, o firmato short int
- unsigned short o unsigned short int
- int, firmato, o firmato int
- non firmato, o unsigned int
- lungo, firmato lunga, long int, o firmati long int
- unsigned long o unsigned long int
- lungo lungo, firmato lunga molto, molto lunga int o firmato long long int
- unsigned long long o unsigned long long int
- galleggiare
- doppia
- lungo doppio
- _Bool
- galleggiare _Complex
- doppia _Complex
- lungo doppio _Complex
- tipo atomico specificatore
- struct o unione specificatore
- enum identificatore 012.380.073.162. - typedef nome

Come possiamo vedere, long è un indicatore di tipo. Non è un qualificatore di tipo.

+0

'signed char' e' unsigned char' sono elencati due volte (come tipi char e tipi interi). Perchè è questo? Si potrebbe leggere come se fossero diversi tipi distinti a seconda del contesto. –

+0

@Zboson Probabilmente per enfatizzare che possono essere utilizzati per memorizzare i caratteri o per memorizzare numeri, diversamente da 'char', che può essere utilizzato solo in modo affidabile per la memorizzazione dei caratteri (a causa della sua firma definita dall'implementazione). È importante capire che i tipi di char sono parte dei tipi interi, al fine di capire come funzionano le varie regole complesse di conversione di tipo e promozione del tipo. – Lundin

19

dal progetto C11, sezione 6.2 .5 ("Tipi)" paragrafo 4:

Ci sono cinque tipi standard firmati interi, designati come signed char, short int, int, long int e long long int.

Come questi tipi sono specificati nel testo del programma è un altro problema, ci sono molti modi poiché la sintassi è piuttosto lassa. Ad esempio, secondo 6.7.2 ("Tipo Specificatori") i seguenti sono tutti modi validi per specificare stesso tipo:

long, signed long, long int, o signed long int

Questo dice che long è di per sé un identificatore di tipo valido per il tipo long int. Questo era lo stesso in C99 (e, vorrei indovinare, anche gli standard precedenti). Quindi no, non è un qualificatore.

Inoltre, quanto sopra può essere combinato con elementi come static, volatile, asterischi di puntatore e così via.

Suggerirei di leggere qualche altro libro, poiché è confusionario leggere libri che utilizzano termini diversi dallo standard. Spesso si fa riferimento allo standard quando si rispondono alle domande su C, quindi è una buona idea conoscerlo.

+0

quindi 'long' non è mai stato una parte di' c'? Neanche in 'C99' o' C89'? –

+0

Lo era, ma @unwind ha deciso di citare C11 :) – xenteros

+0

Sono un principiante e Harward hanno consigliato questo libro. Suggerite altri che sono aggiornati? anche per i principianti? Conosco altre lingue ma non c quindi non è un principiante ma almeno per 'c'. –

0

Nel linguaggio di programmazione C, i tipi di dati sono dichiarazioni per posizioni di memoria o variabili che determinano le caratteristiche dei dati che possono essere memorizzati ei metodi (operazioni) di elaborazione consentiti che li coinvolgono.

Il linguaggio C fornisce i tipi aritmetici di base, come i numeri interi e reali, e la sintassi per costruire array e tipi composti. Diverse intestazioni nella libreria standard C contengono definizioni di tipi di supporto, che hanno proprietà aggiuntive, come la fornitura di spazio di archiviazione con una dimensione esatta, indipendente dall'implementazione. https://wikipedia.org/wiki/C_data_types