Alors j'ai couru quelque chose d'intéressant que je ne réalisais pas l'opérateur ternaire (au moins dans Visual C ++ 98-2010). Comme indiqué dans http://msdn.microsoft.com/ FR-US / Bibliothèque / E4213HS1 (vs.71) .aspx Si l'expression et l'expression conditionnelle sont des valeurs L, le résultat est une valeur L. P>
Bien sûr, normalement en C / C ++, vous écririez quelque chose comme: p>
Ne vous souciez jamais de la participation de la valeur R / L, et dans ce cas, ni 1 ni 0 ne sont convertibles aux valeurs L. P>
Cependant, prenez quelque chose comme: p>
Y et Z sont des valeurs L et elles, ou plus précisément, l'une d'elles est le résultat réel de l'opérateur ternaire (pas sa valeur stockée) qui n'est pas nécessairement évidente (au moins je n'avais jamais pensé à ce sujet à n'importe quelle longueur). p>
Mais, ce qui conduit à la capacité d'écrire ce qui suit p>
qui attribue 99 à Y si x == 1 ou 99 à z si x! = 1 p>
Je n'ai jamais vu cela décrit nulle part et dans toutes les discussions que j'ai lues sur l'utilisation (ou, généralement, d'utiliser) l'opérateur ternaire. P>
Bien sûr, cela ne fonctionne que si l'expression et l'expression conditionnelle sont des valeurs L que quelque chose comme p>
échoue à compiler car 0 est une valeur R aussi heureusement signalée par le compilateur. P>
et cela ne fonctionne que si vous incluez la parenthèse p>
est quelque chose de tout à fait différent qui attribue 99 à z uniquement si (x! = 1) et la belle partie est que les deux côtés sont toujours des valeurs L, donc il y a le trou sérieux de quelles choses telles que Alors, cela me conduit à mes questions: p>
a) Est-ce qu'une partie de la norme C ++ réelle (qui semble être similaire) et non seulement une chose Microsoft - j'ai regardé mais j'ai échoué, jusqu'à présent, pour trouver ces informations. P>
b) Si cela est largement réalisé et que je vis sous un rocher? Je ne l'ai jamais vu utilisé dans un code que je peux me rappeler et je ne l'ai jamais vu mentionné lorsque l'opérateur ternaire est discuté. P>
c) Dois-je sortir plus souvent? P> int VALEUR = (x == 1)? 1: 0; code> p>
int VALEUR = (x == 1)? Y: z; code> p>
(x == 1? Y: z) = 99; code> p>
(x == 1? 0: z) = 99; code> p>
x == 1? Y: z = 99; code> p>
(x == 1? Y: z = 99) = 100 code> DO (il attribue 100 à Y ou Z en fonction de la vérité de x == 1, piétinant sur l'affectation Z = 99 si x == 1 est faux) p>
3 Réponses :
a) Oui, cela fait partie de la norme. P>
B) Ce n'est pas largement réalisé, bien que cela puisse être ici. Il y a une raison pour laquelle il a été voté la caractéristique cachée n ° 1 de C ++: Caractéristiques cachées de C ++? A >. p>
c) aucun commentaire. :) p>
Personnellement, je recommande la direction de l'utilisation de cette fonctionnalité. Il est beaucoup moins intuitif que d'utiliser Aller contre mon propre avertissement, j'ai effectivement essayé de l'utiliser une fois sur un projet personnel, et j'ai été brûlé par les parenthèses et que vous avez perdu 30 minutes en essayant de trouver l'erreur. P> si code> /
sinon code> déclarations, et clairement pas tout le monde ne le sait pas. p>
Eh bien, j'aimerais avoir rencontré cela avant de poster :) ... J'ai regardé mais je l'ai manqué clairement.
Vous ne l'avez jamais vu utilisé car cette utilisation est moins intuitive et lisible que la plus courante. Je n'ai jamais vu cela utilisé de cette façon dans le code de production, non plus, et j'espère ne jamais le voir. P>
Souvenez-vous Herb Sutter & Andrei Alexandrescu's C ++ Codage normes , règle 6 : "L'exactitude, la simplicité et la clarté sont d'abord." P>
Je ne préconise certainement pas son utilisation - simplement une curiosité à ce stade
@Ruddy: Je ne faisais que répondre à B. Je n'étais pas sûr d'un (bien que j'étais 99% que c'était vrai) ou c :)
Si les deuxième et troisième opérandes sont des lvalues et ont le même type, le résultat est de ce type et est une lvalue ... P>
blockquote> (Notez qu'il est pas em> vrai dans C. Écrit explicitement écrit dans la norme C99, la note de bas de page 93, "Une expression conditionnelle ne donne pas de lvalue.") P> b. strong> Je ne pense pas qu'il soit largement utilisé car l'utilisation est assez obscure. Il est plus courant de voir p>
FWIW: J'ai vérifié à Visual 2010 conforme à la note de bas de page 93, en ce que vous obtiendrez une erreur de compilation ("... l'opérande gauche doit être une valeur L") lorsque vous essayez de compiler (x == 1? Y : z) = 100; code> dans un fichier .C (straight-c).
A) Oui Selon ma mémoire Dim Memory B) Oui, et y a-t-il un peu de place sous-ci? C) Cela aiderait-t-il? Avec quoi?
(B) Quand l'ignorance est bliss, «Tis folie doit être sage.
Vous ne l'avez pas vu avant parce qu'il est difficile de lire. Difficile de lire le code est mauvais pour la maintenabilité.