2009-10-17 4 views

ответ

14

Линия:

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

так же, как:

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

, который, конечно, может быть переписано в виде

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

и линии

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

такая же, как

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

Или еще лучше:

stop = f3 > 4000000; 
+0

хороший ответ; четким, кратким и однозначным. – kloucks

+0

'if (f3% 2 == 0) sum + = f3;' также может быть переписан как просто 'if (! (F3% 2)) sum + = f3;' поскольку 0 является ложным значением, а отличным от нуля истинное значение. – Amber

+0

@klouks: tyvm! @Dav: вы правы, но я никогда не был поклонником смешивания логических операций и целых чисел. Это, однако, чисто вопрос вкуса и, как правило, имеет отношение к тому, как много контактов со старыми школьными программистами. :-) – cdiggins

2

Если условие (материал слева от истинно, то он использует первый (тот, прежде чем :), если не использует второй (материал после :)

int res = someCondition ? valueIfTrue : valueIfFalse; 

смотрите:. http://msdn.microsoft.com/en-us/library/ty67wk28%28VS.80%29.aspx

Еще один и будет, вероятно, увидим в ближайшее время:

SomeClass res = someVariable ?? valueIfSomeVariableIsNull; 

Обновление: на маршруте рефакторинг, вы можете:

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

это более или менее компактный эквивалент, если тогда:

(condition) ? ifConditionIsTrueUseThisValue : ifConditionIsFalseUseThisValue ; 

обычно используется, чтобы сделать условное присвоение значения:

variableName = (condition) ? valueIfConditionIsTrue : valueIfConditionIsFalse ; 

просто тупоумное пример, чтобы присвоить значение х, который игнорирует значения ниже нуля:

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

Выражение

x = c ? a : b; 

эквивалентно

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

Кроме того, заявление

stop = f3 > 4000000 ? true : false; 

является полностью избыточными, и могут быть упрощены до

stop = (f3 > 4000000); 

(Paretheses добавлена ​​для ясности.)

+0

Какой _could_ открыть способ оптимизации/упрощения на 'do {...} while (f3 <= 4000000);' – Tordek

0

Как мастерски написанный, как оригинал был, вы могли бы запутать это намерение далее:

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

... или ... напишите, как обычный человек:

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; 
} 

... или ... если вам нравится это очень просто:

int sum = 4613732; 

Даже после перезаписи он дважды я не понимаю, что он делает ... что цель этого так или иначе?

Смежные вопросы