C Macro pour un minimum de deux nombres
Je veux faire une macro simple avec des #define pour le retour du plus petit des deux nombres.
Comment puis-je faire cela en C ? Suggérer quelques idées, et voir si vous pouvez le faire plus d'obfuscation.
Double Possible de MIN et MAX en C
OriginalL'auteur VaioIsBorn | 2010-03-16
Vous devez vous connecter pour publier un commentaire.
Un peu occulté, essayez ceci:
Fondamentalement, il soustrait, et regarde le signe de bits à 1 ou 0.
Si la soustraction des résultats dans un nombre négatif, le premier paramètre est plus petit.
Merci, c'était ce que je cherchais.
Malheureusement, cela ne fonctionne pas, même pour la version 32 bits entiers, sauf si vous pensez que 2147483647 est inférieure à -1.
Que voulez-vous dire? En 2 du compliment, il est plus petit. (-1 maximum de valeur non signée)
est sans aucun doute plus petit que 2147483647, à la fois comme des entiers, et quand par rapport à tout type signé assez large pour représenter les deux d'entre eux (32 bits en complément à deux entiers, par exemple). Unsigned comparaisons n'ont rien à voir avec la question.
OriginalL'auteur abelenky
Généralement:
Prenez garde, il évalue au minimum deux fois, ce qui était la raison de catastrophes dans un récente de la question.
Mais pourquoi voudriez-vous embrouiller?
Ce on stocke le résultat dans une variable, et n'évalue chaque argument une fois. Il s'agit essentiellement d'une mauvaise mans fonction inline + déclaration:
L'utiliser comme:
Un cerveau dans quelle langue? Si nous allons en C++, je suis sûr que je peux essayer de lui donner quelque chose à frire ses experts de nouilles. Mais bon, ce genre d'hypothèses peut-on faire? Sont ces nombres entiers que nous sommes de trouver le minimum d'? Puis à nouveau, peut-être que c'est juste une histoire de tromper moi dans la réponse. 🙂
"Je peux lui donner quelque chose à frire ses experts de nouilles" - heureux d'entendre cela, en attente de nouvelles réponses xD . BTW, la question parce que dans la classe nous avons besoin d'un simple minimum de la fonction, j'ai donc décidé d'aller avec la macro va donc regarder de plus c-ish.
J'aimerais ajouter une autre paire de parenthèses pour encore plus de sécurité: #define min(a, b) ((() < (b)) ? (a) : (b)), Vous pourriez faire un bloc de code, d'évaluer les valeurs de certaines variables et de retourner les variables, de sorte que vous simplement évaluer une fois. Mauvais code, de toute façon.
Il vaut la peine de mentionner que la GCC a
typeof
extension (gcc.gnu.org/onlinedocs/gcc/Typeof.html) qui permet de vous éviter de mentionner le nom de type macro param.OriginalL'auteur GManNickG
Et, juste pour l'enfer de celui-ci, un C de GNU exemple:
Il n'est pas occulté, mais je pense que cela fonctionne pour n'importe quel type, quel que soit le contexte, sur (ou presque, voir les commentaires) tous les arguments, etc; merci de corriger si vous pouvez penser à des contre-exemples.
a
oub
arriver à être eux-mêmes des variables nommées_a_temp_
et_b_temp_
.Oui, je pense que sur le collage sur
__LINE__
, mais il ne semble en vaut la peine; si seulement il y avait un__UNIQUE__
macro...Vous aurait mérité un bien meilleur score, voir stackoverflow.com/a/3437484/2436175 Peut-être ce qui a manqué un peu d'explication sur la raison pour laquelle c'est plus sûr.
il semble être seulement gcc, pas ISO C la solution
OriginalL'auteur David X
Sûr, vous pouvez utiliser un #define pour cela, mais pourquoi voudriez-vous? Le problème avec les #define, même avec des parenthèses, c'est que vous obtenez des résultats inattendus avec ce code (bien que vous n'avez pas réellement le faire, mais il illustre bien le problème).
Si vous êtes à l'aide de C++ pas de C, sûrement préférable d'utiliser une fonction inline, qui (i) évite l'évaluation des paramètres plus d'une fois, et (ii) est de type coffre-fort (vous pouvez même fournir des versions de prendre d'autres types de valeur, comme non signé, double ou chaîne de caractères).
<algorithm>
.Vous pouvez écrire une fonction en ligne en C99, trop, ou avec compilateur extensions (
__inline
dans MSVC,__inline__
dans GNU C89).OriginalL'auteur Huw Walters
Je pense que cette méthode est plutôt joli:
#define min(a, b) (((a) + (b) - fabs((a) - (b))) * 0.5)
OriginalL'auteur doynax
Je voulais ajouter une solution lorsque la numéros de sont virgule flottante.
Envisager lorsque les nombres sont des nombres à virgule flottante et l'un des nombres est not-a-number. Alors le résultat de
a < b
est toujoursfalse
indépendamment de la valeur de l'autre nombre.Il peut être souhaitable que le résultat est comme ci-dessous où "NaN arguments sont traités comme des données manquantes". C11 Note De Bas De Page #242
De le faire avec une macro dans C simple envelopper le
fmin()
fonction qui supprts le tableau ci-dessus. Bien sûr, le code devrait normalement utilisé lefmin()
fonction directement.Noter que
fmin(0.0, -0.0)
peut retourner0.0
ou-0.0
. Ils ont tous deux égalité de valeur.NaN
, problème qui me fait de cette SORTEOriginalL'auteur chux
Si j'essaye juste légèrement de façon à dissimuler ce que je serais probablement aller avec quelque chose comme:
Je pense que Doynax la solution est assez mignon, trop. D'habitude les réservations pour les deux sur les macro arguments évalué plus d'une fois.
OriginalL'auteur Stephen Canon