Pourquoi sizeof (x ++) n'incrémente pas x?



3 Answers

sizeof est un opérateur de compilation, donc au moment de la compilation sizeof et son opérande est remplacé par la valeur de résultat. L' opérande n'est pas évalué (sauf s'il s'agit d'un tableau de longueur variable); Seul le type de résultat est important.

short func(short x) {  // this function never gets called !!
   printf("%d", x);    // this print never happens
   return x;
}

int main() {
   printf("%d", sizeof(func(3))); // all that matters to sizeof is the 
                                  // return type of the function.
   return 0;
}

Sortie:

2

comme le short occupe 2 octets sur ma machine.

Changer le type de retour de la fonction pour double :

double func(short x) {
// rest all same

donnera 8 comme sortie.

Question

Voici le code compilé dans dev c ++ windows:

#include <stdio.h>

int main() {
    int x = 5;
    printf("%d and ", sizeof(x++)); // note 1
    printf("%d\n", x); // note 2
    return 0;
}

Je m'attends à ce que x soit 6 après avoir exécuté la note 1 . Cependant, la sortie est:

4 and 5

Quelqu'un peut-il expliquer pourquoi x n'augmente pas après la note 1 ?




sizeof() opérateur sizeof() donne uniquement la taille du type de données, il n'évalue pas les éléments internes.




Comme l'opérande de l'opérateur sizeof n'est pas évaluée, vous pouvez le faire:

int f(); //no definition, which means we cannot call it

int main(void) {
        printf("%d", sizeof(f()) );  //no linker error
        return 0;
}

Démonstration en ligne: http://ideone.com/S8e2Y

Autrement dit, vous n'avez pas besoin de définir la fonction f si elle est utilisée uniquement dans sizeof . Cette technique est principalement utilisée dans la métaprogrammation de template C ++, car même en C ++, l'opérande de sizeof n'est pas évaluée.

Pourquoi cela fonctionne-t-il? Cela fonctionne parce que l'opérateur sizeof ne fonctionne pas sur la valeur , à la place il fonctionne sur le type de l'expression. Donc quand vous écrivez sizeof(f()) , il fonctionne sur le type de l'expression f() , et qui n'est rien d'autre que le type de retour de la fonction f . Le type de retour est toujours le même, quelle que soit la valeur que la fonction retournerait si elle s'exécutait réellement.

En C ++, vous pouvez même ceci:

struct A
{
  A(); //no definition, which means we cannot create instance!
  int f(); //no definition, which means we cannot call it
};

int main() {
        std::cout << sizeof(A().f())<< std::endl;
        return 0;
}

Pourtant, il semble que, dans sizeof , je crée d'abord une instance de A , en écrivant A() , puis en appelant la fonction f sur l'instance, en écrivant A().f() , mais cela n'arrive pas.

Démonstration: http://ideone.com/egPMi

Voici un autre sujet qui explique d'autres propriétés intéressantes de sizeof :




sizeof est un opérateur intégré à la compilation et n'est pas une fonction. Cela devient très clair dans les cas où vous pouvez l'utiliser sans la parenthèse:

(sizeof x)  //this also works





Related



Tags

c   sizeof