2009-10-17 6 views
1
bool stop = false; 
      int f1 = 1; 
      int f2 = 2; 
      int f3 = 0; 
      int sum = 2; 
      while (!stop) 
      { 
       f3 = f1 + f2; 
       sum += f3 % 2 == 0 ? f3 : 0; //THIS ONE 
       stop = f3 > 4000000 ? true : false;//AND THIS ONE. 
       f1 = f2; 
       f2 = f3; 
      } 

Qu'est-ce que cet opérateur conditionnel? C'est la première fois que je vois quelque chose comme ça. ?Quelqu'un peut-il m'expliquer cette courte ligne de code?

Répondre

14

La ligne:

sum += f3 % 2 == 0 ? f3 : 0; //THIS ONE 

est le même que:

if (f3 % 2 == 0) 
    sum += f3; 
else 
    sum += 0; 

qui pourrait bien sûr être réécrite comme

if (f3 % 2 == 0) sum += f3; 

et la ligne

stop = f3 > 4000000 ? true : false;//AND THIS ONE. 

est le même que

if (f3 > 4000000) 
    stop = true; 
else 
    stop = false; 

Ou mieux encore:

stop = f3 > 4000000; 
+0

bonne réponse; clair, concis et sans ambiguïté. – kloucks

+0

'if (f3% 2 == 0) somme + = f3;' peut aussi être réécrit simplement comme si (! (F3% 2)) somme + = f3; 'puisque 0 est une valeur fausse et non nulle une vraie valeur. – Amber

+0

@klouks: tyvm! @Dav: vous avez raison, mais je n'ai jamais été fan du mélange d'opérations booléennes et d'entiers. Ceci est cependant purement une question de goût, et a généralement à voir avec combien de contact on a avec les programmeurs C old school. :-) – cdiggins

2

Si la condition (substance à gauche est vrai, alors il utilise le premier (celui avant :) sinon il utilise la seconde (après des choses :)

int res = someCondition ? valueIfTrue : valueIfFalse; 

voir:. http://msdn.microsoft.com/en-us/library/ty67wk28%28VS.80%29.aspx

un autre u verra probablement bientôt:

SomeClass res = someVariable ?? valueIfSomeVariableIsNull; 

Mise à jour: sur la route refactoring, vous voudrez peut-:

while (!isMoreThan4Million) 
{ 
    f3 = f1 + f2; 
    bool sumIsEven = f3 % 2 == 0; 
    sum += sumIsEven ? f3 : 0; 
    isMoreThan4Million = f3 > 4000000; 
    f1 = f2; 
    f2 = f3; 
} 
-2

prédicat? puis: autre

0

il est plus ou moins un équivalent compact d'un si alors:

(condition) ? ifConditionIsTrueUseThisValue : ifConditionIsFalseUseThisValue ; 

couramment utilisé pour faire une affectation de valeur conditionnelle:

variableName = (condition) ? valueIfConditionIsTrue : valueIfConditionIsFalse ; 

exemple simple stupide d'attribuer une valeur de x qui ne tient pas compte des valeurs inférieures à zéro:

x = (x < 0) ? 0 : x ; 
5

L'expression

x = c ? a : b; 

équivaut à

if (c) 
    x = a; 
else 
    x = b; 

En outre, la déclaration

stop = f3 > 4000000 ? true : false; 

est complètement redondante, et peut être simplifié à

stop = (f3 > 4000000); 

(Paretheses ajouté pour plus de clarté.)

+0

Qui pourrait ouvrir la voie à une optimisation/simplification de 'do {...} while (f3 <= 4000000);' – Tordek

0

Comme magistralement écrit que l'original était, vous pourriez Occultation c'est l'intention de plus:

int sum = 2; 
for(int f1 = 1, f2 = 2, f3 = 0; !((f3 = (f1 + f2)) > 4000000); f1 = f2, f2 = f3) 
    sum += f3 * (~f3 & 1); 

... ou ... écrivez-le comme une personne normale:

int f1 = 1; 
int f2 = 2; 
int f3 = 0; 
int sum = 2; 

while(f3 <= 4000000) 
{ 
    f3 = f1 + f2; 
    bool even = (f3 & 1) == 0; 
    if(even) 
     sum += f3; 
    f1 = f2; 
    f2 = f3; 
} 

... ou ... si vous l'aimez vraiment simple:

int sum = 4613732; 

Même après la réécriture deux fois je ne suis pas ce qu'il fait ... quel est le but de toute façon?

Questions connexes