2016-07-14 3 views
7

je suis confus opérateur sizeof en C.confusion quant opérateur sizeof en 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)); 
} 

Les résultats sont respectivement de 1 et 4. Pourquoi cela arrive-t-il?

+0

'sizeof (num1 + num2)' est logiquement incorrect. – i486

+3

@ i486 Que voulez-vous dire? – Jin

+0

@jwqwerty: Pas logiquement faux en soi, mais inutile, car vous obtenez la taille d'un objet temporaire qui n'existe que pour la durée de la détermination de sa taille. Dans l'utilisation quotidienne, vous rechercheriez 'sizeof (num1) + sizeof (num2)' si vous le souhaitez. vouloir allouer de l'espace pour sérialiser les données. –

Répondre

4

result est de type char donc sizeof est de donner 1 tout num1+num2 promu int type et donc donne 4 (taille de int).

Notez que lorsqu'une opération arithmétique est effectuée sur un type inférieur à celui de int et tous sa valeur peut être représentée par int résultat sera alors promu type int.

+0

Pourquoi num1 + num2 est-il promu en type int? – Jin

+0

@jwqwerty; En raison de l'opération arithmétique. – haccks

+0

@ haccks3 Alors je suppose que dans la ligne "result = num1 + num2", num1 + num2 devrait aussi être promu en int parce qu'il implique une opération arithémétique? – Jin

3

num1 + num2 devient entier et donc la sortie est 4 alors résultat est char qui sort 1.

Vous pouvez consulter cet article Integer Promotion:

Si un int peut représenter toutes les valeurs de la type d'origine, la valeur est convertie en int; sinon, il est converti en un entier non signé. On les appelle les promotions entières. Tous les autres types sont inchangés par les promotions entières.

5

TL; DR réponse:

  • sizeof result est le même que sizeof(char).
  • sizeof(num1+ num2) est la même que sizeof (int)pourquoi?

Dans votre cas, ils produisent 1 (garanti par la norme) et 4 (peut varier), respectivement.

Cela dit, sizeof produit un résultat de type size_t, vous devez donc spécificateur de format %zu pour imprimer la valeur.


Pourquoi:

Tout d'abord, pour l'opérateur d'addition +, citant C11, chapitre §6.5.6

Si les deux opérandes sont de type arithmétique, les conversions arithmétiques habituelles sont effectuées sur eux.

En ce qui concerne habituelles conversions arithmétiques, §6.3.1.8/p1

[....] Dans le cas contraire, les promotions entières sont effectuées sur les deux opérandes. [...]

puis de §6.3.1.1,/p2,

Si un int peut représenter toutes les valeurs du type d'origine (tel que limité par la largeur, pour une champ binaire), la valeur est convertie en int; sinon, il est converti en unsigned int. Ceux-ci sont appelés les promotions entières .

Donc, sizeof(num1+num2) est la même que sizeof(int).

0

la taille d'un caractère est de 1 octet, un caractère peut contenir des valeurs allant jusqu'à 127 (nombre illimité jusqu'à 255). Quand vous dites quelque chose comme (a + b) une variable temporaire est créée et utilisée pour ajouter a à b, parce que a et b ne peuvent contenir que 127, ils sont promus par le compilateur comme un int, juste pour être sûr.

ce qui est logique parce que si a = 100 et b = 100, l'utilisateur aimerait voir 200 quand il les ajoute et non 73 (ce qui est le résultat d'un débordement).