6
votes

Quelle est la différence entre ! (x = y en C ++?

passer à travers l'est, je suis tombé sur une ligne de code particulière. Le lien suivant affiche le fichier avec le numéro de ligne d'intérêt à 1870.

https://github.com/paulhodge/eastl/ Blob / Maître / Inclure / Eastl / Algorithm.h

Le code de cette ligne est si (! (valeur <* i)) . Le commentaire dit que «nous exprimons toujours des comparaisons de valeur en termes de

Y a-t-il des avantages que ce soit pour écrire une comparaison comme celle-là (peut-être un contexte que je suis surplombant)? Sinon, pourquoi l'auteur d'Eastl a-t-il délibéré délibérément-il délibérément de cette manière et a même pris les soins à commenter? La cohérence est la seule raison ici?


4 commentaires

Dans le point flottant, ils sont différents, car les comparaisons avec nan reviennent toujours false.


Cela ressemble à une optimisation de processeur / assembleur / de compilateur très spécifique. Ce code est-il destiné à un processeur / compilateur particulier, etc.


@AdrianCornish: Cela n'a rien à voir avec les optimisations et tout ce qui est à faire avec C ++ ne pas défaut des opérateurs en défaut de l'autre.


Fondamentalement, cela devrait simplement dire que Eastl suit les conventions de la partie STL standard C ++.


4 Réponses :


11
votes

Cela signifie que vous devez uniquement fournir << / code> et == pour les types de valeur de conteneur. Cela signifie également que vous réduisez la quantité de variabilité pour ces types (comme tous les algorithmes utilisent ! (A pour signifier a> = b et ! ( a == b) pour a! = B ); Sinon, vous pourriez avoir > = et ! = retourne des résultats incohérents.


0 commentaires

8
votes

en C ++, vous pouvez surcharger l'opérateur << / code> de sorte qu'il se comporte différemment du contraire de > = , afin qu'ils ne soient pas garantis pour être équivalents.

En outre, dans toute implémentation de point flottant, nan est false, mais est donc nan> = nan , donc < code>! (Nan est vrai même si nan> = nan est faux.


0 commentaires

1
votes

Je vois au moins une différence. Si l'un des chiffres était QNAN (point flottant 0/0), alors! (A = =


4 commentaires

En fait, ce comportement est assez gênant. Une des propriétés de << / code>, mathématiquement, est anti-symétrie. Signification que ! (A implique B . Que les gens ont consciemment choisi de violer cette propriété juste me déflorent, ça lance de nombreux algorithmes ...


@Stevejessop: Oui, désolé, c'est un peu désactivé. La vraie relation est: ! (A A == B .


@Matthieu: True c'est agaçant, mais votre définition de l'antisymétrie est éteinte. Considérez A == B , puis ! (A n'implique pas B . Donc n'utilise pas cette définition même pour les types qui ne sont pas étranges :-) la définition appropriée est a implique ! (B , qui en fait Nan satisfait de manière voluelle depuis que le LHS n'est jamais vrai. La propriété qui manque au respect de << / code> est que l'équivalence de commande n'est pas transitive, mais << / code> sur float est un ordre partiel strict.


Je pense que la justification du fait que Nan est située en dehors de la commande définie sur des flotteurs, c'est que l'IEEE fournit suffisamment de garanties que, avec des soins, vous pouvez éviter de générer un. Ne prenez pas de racines carrées de nombres négatifs, etc. Si vous aimez que vous puissiez prétendre que toutes les opérations génératrices de NAAN ont ub, il vous suffit de vous soucier de vous inquiéter de la signification des entrées NAN aux fonctions de la bibliothèque à face publique.



1
votes

Utiliser uniquement moins que l'opérateur, vous pouvez simuler tous les autres opérateurs de comparaison. Cela le rend plus cohérent et vous permet d'utiliser un seul paramètre de modèle lorsque vous devez paramétrer la comparaison. Les conteneurs et algorithmes de code standard utilisent std :: moins comme comparateur de gabarit par défaut par exemple. xxx

pour ces opérations où la commande n'est pas importante, il est plus simple et plus efficace d'utiliser l'opérateur == à la place.


1 commentaires

La bibliothèque standard utilise également égale_to (==) pour la vérification de l'égalité.