43 votes

quel est typeof ((c) + 1) en C

Je suis tombé sur une expression en C comme

 typeof((c) + 1) _tmp = c;
 

Qu'est-ce que cela veut dire exactement?

Merci pour la réponse.

Juste un doute? Que se passe-t-il si le type de c est struct au lieu des types primitifs, que va faire +1?

56voto

uʍop ǝpısdn Points 16540

L' typeof de l'opérateur dans la plaine C (pas C++) est un CCG plus de la norme. Il indique au compilateur que vous souhaitez utiliser le type de l'expression placée entre parenthèses.

À l'aide de typeof comme ci-dessus, vous pouvez déclarer des variables de types inconnus de vous, ou, dans ce contexte, en utilisant une autre variable de type référence. Il peut également être utilisé pour le moulage.

Edit: l' + fonctionnement à l'intérieur typeof ont un sens différent. typeof((c) + 1) signifie "le type de c, ou le type de 1, selon le restent après la promotion". Rappelez-vous que, par exemple, les caractères sont promus à ints lorsque utilisé dans les opérations impliquant entiers, entiers sont promus à des flotteurs, de flotteurs pour les doubles, etc.

Notez que seul le compilateur peut résoudre ce problème: typeof n'est pas évalué, il n'a pas de valeur, rien ne se passe au moment de l'exécution.

La description complète de typeof peut être trouvé ici.

5voto

Anycorn Points 20521

create var _tmp st _tmp est de type upcast (max) de c ou int et définissez-la sur la valeur c .

par exemple

 char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float
 

4voto

AndreyT Points 139512

Ce n’est pas la norme C. C n’a rien de tel que typeof (à moins que vous n’ayez affaire à quelque chose défini par l’utilisateur).

typeof est normalement une extension du compilateur (le compilateur GCC le plus probable). Vous pouvez lire à ce sujet ici

http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

4voto

Jens Gustedt Points 40410

En plus de l'autre réponse, l' + ici est assez subtile. Il permet de c soit une expression ou d'un type.

  • Si c'est une expression, comme l'a dit, c est promu int (au moins) et le type de l'expression entière a moins entier rang de int.
  • Si c'est une expression de type de l' les parenthèses entourant c faire un distribution de la valeur +1. Alors le type obtenu est juste c.

Pour les deux types de acrobatique, il est important que c est de l'arithmétique type de et il est également à noter que cette astuce peut lâche le de ce paramètre c. Donc, cette utilisation de l' typeof extension n'est pas si utile que ça pourrait ressembler. Dans la plupart des cas, l'aide d' uintmax_t ou intmax_t serait suffisant.

4voto

artless noise Points 7110

Comparer le code,

typeof((c) + 1) _tmp = c;

avec

typeof(c) _tmp = c;

typeof permet d'arguments de types ou de variables. Maintenant, considérons c que,

  • struct { int a; int b }
  • un pointeur vers struct { int a; int b }
  • le texte réel int.

Ainsi que la promotion de la charcomme par uʍop ǝpısdn, la macro protège contre une struct affectation. Ainsi, le code suivant ne compile pas,

struct { int a; int b } c;
typeof((c)+1) _tmp = c;

Les gens peuvent vouloir interdire struct des affectations pour l'efficacité et le code des raisons de taille, surtout dans le générique de la macro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X