Discussion:Langage C++/Opérateurs

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche

Est-ce que "?" est un opérateur?

t = c==d ? a : b //si la condition "c==d" est vérifié alors "t=a" sinon "t=b"

Dans tous les cas, il serait bon de rajouter une note sur cette syntaxe, ou de mettre une lien sur cette page vers une explication.
Polarman

Oui, le groupement "(<condition>)? <si_vrai>: <si_faux>;" est ce que l’on appelle dans le jargon l'opérateur ternaire de comparaison. Où effectivement "t = (c==d) ? a : b;" signifie Si "c==d" alors "t=a" sinon "t=b".Ppignol 22 février 2011 à 13:23 (UTC)


"Il est donc recommandé en C++ de n'utiliser que la forme suffixée des opérateurs d'incrémentation/décrémentation et uniquement dans une expression dont on n'attend pas de résultat."
Complètement stupide. Il y a un defaut d'optimisation à utiliser les formes suffixees alors que l’on n'attends pas de valeur de retour, étant donne qu'une variable temporaire est alors utilisee pour stocker la valeur courante avant d'incrementer.
Arcanis

Je ne vois pas en quoi l’utilisation de l'opérateur ++ en post-fixé devrais poser un quelconque soucis d'optimisation. D'après ce que j’ai pu lire, il n'y à pas de spécification en ce qui concerne les effets des opérateurs d'incrémentations. Mais on peut deviner ceci, soit "a++;" => "return (a += 1);" => "return (a = a + 1);" et "++a" => "b = a; a++; return b;" donc en fait l'opérateur préfixé serais plus lent que l'opérateur postfixé suivant l'implémentation. Ppignol 22 février 2011 à 13:23 (UTC)
Arcanis a raison : c’est exactement l'inverse, a++ et moins rapide que ++a. La recommandation est stupide est fausse : il faut justement privilegier l'incrémentation préfixé (++a) lorsque l’on se moque de la valeur de retour,car au final ce qui compte c’est que la variable soit incrémenté. Si par contre, on veut dans une expression utiliser la valeur avant incrementation, alors c’est la version suffixé(a++), et uniquement celle ci, qu’il faut utiliser.

Attention les opérateurs &, |, ^ ne sont pas des opérateurs logiques mais des opérateurs bits à bits. Les opérateurs logiques sont !, && et ||. Je ne suis pas d'accord sur le terme "Comparateur" que je ne trouve nul part dans la littérature.

PiFou




Il y a une erreur dans ce que vous appelez L'opérateur d'affectation inverseur "!=". En recopiant le code que vous donnez, en l'enrobant un peu pour donner ceci :

#include <iostream>

int main(int argc, char* argv[])
{
  bool x, y;
  x = true;
  y = true;
  x != y; //x = false (voir l'opérateur "!") 

  if (x==false)
   std::cout << "x is false\n";
  else
   std::cout << "x is true\n";
}

puis en le compilant avec g++ 3.4.4 (host:cygwin), j'obtiens la sortie suivante :

fred@HOME ~/test$ g++ -v
Modèle de thread: posix
version gcc 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

fred@HOME ~/test$ g++ -o test test.c

fred@HOME ~/test$ ./test.exe
x is true


En ce qui me concerne, je n'ai jamais connu à != d’autre signification que non égal qui est la même chose que différent de, c’est un comparateur et uniquement un comparateur.

Peut-être pourriez-vous aussi choisir des termes plus conventionnels afin qu'une personne désireuse d’en savoir plus sur c++ ne se retrouve pas complètement perdue dans d'autres lectures ... ou qu'une autre ne soit pas complètement perdue dans la votre.

F. Nouvier


Effectivement != est un opérateur binaire de comparaison (différent de).

PiFou

Effectivement j’ai fais une copie de trop ! vraiment désolé ! Je remet souvent plusieurs couches avant de finir complètement un article et c’est vrais qu'en ce moment j’ai pas eu beaucoup de temps pour relire ce que j’ai écrit. Ce point est passé à travers ma relecture et j’en suis navré. Je vous encourage à continuer à me montrer les passages ou j’ai fais des erreurs afin d'améliorer le contenu de ce cours. Ppignol


J’aimerais apporter quelque corrections à cet article, mais mes modifications ne semblent pas convenir. Donc avant de faire quoique ce soit, je vous soumets ce qui me gêne, pour pouvoir en débattre. Je parle du chapite intitulé "Effet de bords":

L'article part d'un constat juste pour en déduire une conclusion fausse. Oui il est dangereux d’utiliser les deux types d’incrémentations dans la même expression, car le la langage ne spécifie pas l’ordre d'évaluation des termes, ce qui laisse le compilateur libre de choisir. Par exemple, il est dangereux et donc plus que deconseillé d'écrire

tmp = ++a * a++;

Mais cela ne veut surtout pas dire qu'on ne peut pas utiliser les deux types d'incrémentations de manière individuelle. Il est même recommandé d’utiliser l'incrémentation préfixé lorsque l’on n'a pas besoin de la valeur (comme expliqué par Arcanis plus haut) même s'il est vrai que pour des type de base, le compilateur va optimiser. L'exemple n’est pas faux en soi, mais il est juste inutile et trompeur. Et c’est surtout la phrase juste au dessus qui me dérange terriblement, car fausse.

De plus je rajouterai que le titre de cette section n’est pas adapté, et que la définition d'un "effet de bord" est fausse. Reprenons simplement la définition présent sur Wikipedia qui est claire et concise : "En informatique, une fonction est dite à effet de bord si elle modifie un état autre que sa valeur de retour.". Donc non ce n'est spécifique au C++, non ce n’est pas spécifique au créateur du langage, même si , OUI, l'incrémentation postfixé est une fonction avec effet de bord. Mais ce n’est pas directement cet effet de bord qui est dangereux, mais bien l'impossibilité de déterminer l’ordre d'évaluation.

Enfin j’ai plus souvent entendu parler d'opérateurs unaires que monadiques. Ce terme semble plutôt réservé au domaine mathématiques.

Malou666

J’ai pensé qu’il serait plus efficace de modifier l’article avec des balises ref pour chaque contradiction avec la version précédente, à charge au suivant de trouver plus crédible :
  1. Il n'est effectivement pas impossible de définir la priorité des opérateurs et c’est même disponible sur Programmation C-C++/Priorités des opérateurs sur Wikilivres Article sur Wikilivres. Je vais donc reprendre ta correction sur ce point en conservant l'exemple illustrant le phénomène.
  2. Remplaçons aussi "Effet de bords" par "Effet secondaire", "collatéral", "imprévisible" ou autres.
  3. Pour "opérateur unaire" c’est en effet nettement plus répandu.
JackPotte ($) 23 mai 2012 à 19:18 (UTC)