donc je suis tombé sur quelque chose d'intéressant que je ne savais pas à propos de l'opérateur ternaire (au moins dans Visual C++ 98-2010). Comme indiqué dans http://msdn.microsoft.com/en-us/library/e4213hs1(VS.71).aspx si à la fois l'expression et l'expression conditionnelle sont des valeurs l, le résultat est une valeur l.C++ opérateur ternaire
Bien sûr normalement dans c/C++ vous écririez quelque chose comme:
int value = (x == 1) ? 1 : 0;
et ne se soucient même de la valeur r/l valeur implication, et dans ce cas ni 1 ni 0 sont convertibles en valeurs-l.
Cependant, prendre quelque chose comme:
int value = (x == 1) ? y : z;
y et z sont l valeurs et elles, ou plus précisément, l'un d'entre eux est le résultat réel de l'opérateur ternaire (non sa valeur stockée) qui n'est pas forcément évident (du moins je n'y avais jamais pensé).
Mais, ce qui conduit à est la possibilité d'écrire le
suivant(x == 1 ? y : z) = 99;
qui attribue 99 à y si x == 1 ou 99 à z si x! = 1
I Je n'ai jamais vu cela décrit nulle part et dans toutes les discussions que j'ai lues au sujet de l'utilisation (ou, en général, de l'utilisation ou non) de l'opérateur ternaire.
Bien sûr, il ne fonctionne que si l'expression et conditionnelle d'expression sont l-valeurs quelque chose comme
(x == 1 ? 0 : z) = 99;
ne parvient pas à compiler car 0 est une valeur r comme heureusement souligné par le compilateur.
Et cela ne fonctionne que si vous incluez la parenthèse
x == 1 ? y : z = 99;
est tout autre chose qui affecte 99 à z que si (x! = 1) et la part belle est que les deux parties sont encore l -values donc il y a le rat-hole sérieux de ce que font (x == 1 ? y : z = 99) = 100
(il assigne 100 à y ou z selon 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 que cela fait partie du standard C++ actuel (ce qui semble être le cas) et pas seulement une chose de Microsoft - J'ai regardé mais j'ai échoué, jusqu'à présent, à trouver cette information.
B) Si cela est largement réalisé et je l'ai vécu sous un rocher? Je ne l'ai jamais vu utilisé dans un code dont je me souvienne, et je ne l'ai jamais vu mentionné quand l'opérateur ternaire est discuté.
C) Ai-je besoin de sortir plus souvent?
A) Oui selon ma mémoire faible B) Oui, et est-il un plus de place là-dessous? C) Cela aiderait-il? Avec quoi? – peterchen
(B) Lorsque l'ignorance est une félicité, c'est une folie d'être sage. –
Vous ne l'avez pas vu auparavant parce que c'est difficile à lire. Le code difficile à lire est mauvais pour la maintenabilité. –