2016-07-14 108 views
7

sono confuso circa sizeof operatore in C.confusione circa operatore sizeof in C

#include <stdio.h> 

int main(void) 
{ 
    char num1=1, num2=2, result; 
    result = num1 + num2; 
    printf("Size of result: %d \n",sizeof result); 
    printf("Size of result: %d \n",sizeof(num1+num2)); 
} 

I risultati sono 1 e 4 rispettivamente. Perché succede?

+0

'sizeof (num1 + num2)' è logicamente sbagliato. – i486

+3

@ i486 Cosa intendi? – Jin

+0

@jwqwerty: Non logicamente sbagliato di per sé, ma inutile, poiché si ottiene la dimensione di un oggetto temporaneo che esiste solo per la durata della determinazione della sua dimensione. Nell'uso quotidiano, dovresti cercare 'sizeof (num1) + sizeof (num2)' se ad es. voglio allocare spazio per serializzare i dati. –

risposta

4

result è di char tipo, quindi sizeof sta dando 1 mentre num1+num2 promosso int tipo e quindi dà 4 (dimensioni int).

noti che quando un'operazione aritmetica viene eseguita su un tipo più piccolo di quello di int e tutto il suo valore può essere rappresentato da int poi risultato sarà promosso int tipo.

+0

Perché num1 + num2 è promosso in tipo int? – Jin

+0

@jwqwerty; A causa dell'operazione aritmetica. – haccks

+0

@ haccks3 Quindi suppongo che nella riga "risultato = num1 + num2", anche num1 + num2 debba essere promosso a int perché implica un'operazione aritmetica? – Jin

3

num1 num2 + sta diventando intero e quindi l'uscita è 4 che risulta char che emette 1.

È possibile segnalare questo articolo Integer Promotion:

Se un int può rappresentare tutti i valori della tipo originale, il valore è convertito in un int; in caso contrario, viene convertito in un int unsigned. Queste sono chiamate promozioni intere. Tutti gli altri tipi sono invariati dalle promozioni intere.

5

TL; DR risposta:

  • sizeof result è lo stesso come sizeof(char).
  • sizeof(num1+ num2) è uguale a sizeof (int)perché?

Nel tuo caso, essi producono 1 (garantito da standard) e 4 (può variare), rispettivamente.

Detto, sizeof produce un risultato di tipo size_t, così si dovrebbe %zu di formato per stampare il valore.


Perché:

Innanzitutto, per l'operatore addizione +, citando C11, capitolo §6.5.6

Se entrambi gli operandi hanno tipo aritmetico, vengono eseguite le usuali conversioni aritmetiche su loro.

Riguardo conversioni aritmetiche abituali, §6.3.1.8/p1

[....] In caso contrario, le promozioni interi vengono eseguite su entrambi gli operandi. [...]

e poi da §6.3.1.1,/p2,

Se un int può rappresentare tutti i valori del tipo originale (come limitato dalla larghezza per un campo bit ), il valore viene convertito in int; in caso contrario, viene convertito in unsigned int. Queste sono chiamate promozioni per numero intero .

Quindi, sizeof(num1+num2) è lo stesso di sizeof(int).

0

la dimensione di un carattere è 1 byte, un carattere può contenere valori fino a 127 (senza segno fino a 255). quando dici qualcosa come (a + b) una variabile temporanea viene creata e usata per aggiungere a a b, perché a e b possono contenere solo 127, sono promossi dal compilatore come int, solo per essere sicuri.

che è logico perché se a = 100 eb = 100, l'utente vorrebbe vedere 200 quando li aggiunge e non 73 (che è il risultato di un overflow).