8
votes

Opérateur ternaire C ++

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.

Bien sûr, normalement en C / C ++, vous écririez quelque chose comme:

int VALEUR = (x == 1)? 1: 0;

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.

Cependant, prenez quelque chose comme:

int VALEUR = (x == 1)? Y: z;

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).

Mais, ce qui conduit à la capacité d'écrire ce qui suit

(x == 1? Y: z) = 99;

qui attribue 99 à Y si x == 1 ou 99 à z si x! = 1

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.

Bien sûr, cela ne fonctionne que si l'expression et l'expression conditionnelle sont des valeurs L que quelque chose comme

(x == 1? 0: z) = 99;

échoue à compiler car 0 est une valeur R aussi heureusement signalée par le compilateur.

et cela ne fonctionne que si vous incluez la parenthèse

x == 1? Y: z = 99;

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 (x == 1? Y: z = 99) = 100 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)

Alors, cela me conduit à mes questions:

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.

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é.

c) Dois-je sortir plus souvent?


3 commentaires

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é.


3 Réponses :



2
votes

2 commentaires

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 :)



3
votes

a. oui. § [EXPR.COND] / 4:

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 ...

(Notez qu'il est pas 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.")

b. Je ne pense pas qu'il soit largement utilisé car l'utilisation est assez obscure. Il est plus courant de voir xxx


1 commentaires

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; dans un fichier .C (straight-c).