2013-05-07 14 views
8
#include <stdio.h> 
int main()   
{ 

      short int i = 20; 

      char c = 97; 

      printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i)); 
      return 0; 
} 

Potrebbe qualcuno dirmi che cosa succede quando sizeof (a + b) "una è di tipo short int & b è di tipo char" uscita è: 2, 1, 4Cosa succede qui? sizeof (short_int_variable + char_variable)

+0

'sizeof 'è un costrutto di tempo di compilazione. –

+0

la dimensione del risultato è calcolata come int – BLUEPIXY

+0

Non hai ancora detto che sizeof (c + c) darà anche 4, quindi sarà sizeof (c/2) o sizeof (1998) – Kartikya

risposta

8

A causa di C di serie integral promotion rules, il tipo dell'espressione c + i è int, quindi è per questo che stai ricevendo l'equivalente di sizeof (int).

Nota che sizeof non è una funzione, le parentesi sono necessarie solo quando si nomina un tipo and to resolve precendence conflicts. Il tuo codice coule essere scritto:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i)); 

L'uso finale di sizeof ha parentesi dal sizeof si lega più stretto di +, dicendo sizeof c + i sarebbe essere analizzato come (sizeof c) + i che non è il risultato desiderato.

Si noti inoltre che è un costrutto in fase di compilazione per la maggior parte del tempo, l'espressione non viene mai effettivamente valutata. Tutto ciò che accade è che il compilatore "pretende" di valutarlo, di capire il tipo di espressione e quindi ti dà la dimensione di un valore di quel tipo. Il valore attuale non ha mai bisogno di esistere, che a volte è pulito.

Il tipo del valore restituito da sizeof è size_t, che viene stampata con %zu (non è int).

+0

E come hai già detto altrove, per evitare confusione, metti sempre uno spazio bianco tra 'sizeof' e la parentesi aperta. (Sto solo rendendo esplicita questa spiritosa convenzione per il lettore) – Rerito

+1

il codice dovrebbe essere 'printf ("% zu,% zu,% zu \ n ", sizeof i, sizeof c, sizeof (c + i));' perché ['sizeof' non restituisce un' int'] (https://stackoverflow.com/q/940087/995714) –

+0

@ LưuVĩnhPhúc Assolutamente, grazie per aver corretto questa vecchia risposta. Modificato, ovviamente. – unwind

0

sizeof funziona solo al compiletime per ottenere le dimensioni di un'espressione.

Il seguente solito effettivamente aumentare 'c':

c = sizeof (++ c);

Il sizeof espressione (a + b) restituirà il tipo più grande con unsigned avere la precedenza

4
1) sizeof(i) ==> sizeof(short int) = 2 

2) sizeof(c) ==> sizeof(char) = 1 

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 
+0

downvotter. per favore, spiegami cosa ho capito di sbagliato? Mi correggerò .. – Mani

+0

* "risultato in valore costante che è int come predefinito" * - Huh? Non capisco nemmeno di cosa stai parlando. –

+0

@ChristianRau Parlo di '(c + i)' che produce un valore costante che viene preso come 'int' di default. – Mani

0

Il tipo di dati di a è "breve int". -32768 ~ +32767

Il tipo di dati di c è "char". 0 ~ 255

Quando si aggiunge un a c non è né short intchar, diventa int!

Ecco è un codice di esempio che vi aiutano a ottenere il tipo di dati variabili:

#include <typeinfo> 

int main() 
{ 
    short int a = 1; 
    char c = 'A'; 
    std::cout << typeid(a + c).name() << std::endl; 

    return 1; 
} 
+0

Un 'short' ha il range -32768 a 32767. – Lindydancer

+0

Hai ragione ... Ho fatto un errore. –

1

Come altri hanno già detto, sizeof viene calcolata al momento della compilazione.

Qui, il valore del numero intero espressione c + i, come C e I sono promossi (promozione integrale) a int e quindi

sizeof(c + i) 

ti dà 4 byte su macchina a 32 bit ..

Problemi correlati