2015-08-02 6 views
0

меня возникли проблемы при получении моей головы вокруг этого заявления:У меня возникли проблемы при получении моей головы вокруг этого заявления:

while (a && b) { 
a > b ? a %= b : b %= a; 
} 

Что это делает именно? Может ли он быть преобразован в оператор if?

+0

Где вы столкнулись с этим заявлением? –

+1

простой английский: в то время как a и b являются приблизительно эквивалентными, если a> b, a = a mod b, в противном случае b = b mod a. – chiliNUT

+0

Спасибо, chiliNUT. Обычный английский работает для меня! Эй, Кевин, я думаю, что получил этот фрагмент с этого сайта как часть решения для вычисления суммы самых низких общих кратных чисел. –

ответ

0

Вы можете легко расширить, если вот так:

while (a && b) { 
    if (a > b) { 
    a %= b; 
    } else { 
    b %= a; 
    } 
} 

% = означает взять мод в левую с правой, и присвоить результат слева.

+0

Это объяснение, которое я могу понять - спасибо. –

0

Это тройная оператор и используется следующим образом:

состояние? value_if_true: value_if_false

(a> b)? (А% = Ь): (б% = а)

while (a && b) { 
    if (a > b) { 
     a %= b 
    }else{ 
     b %= a; 
    } 
} 
+0

Спасибо, vnponce. Мне всегда кажется, что поздно, когда я смотрю на это, и ваше объяснение очищает воды для меня. –

2

Давайте разберем это на части:

while (a && b) { 

} 

это означает, что в то время как a и b являются "truthy" значения (в данном случае, не 0), то цикл будет продолжаться:

a > b ? a %= b : b %= a; 

это тройная оператор: x ? y : z

если x оценивает true, выполните y. если x оценивает значение false, выполните z.

Таким образом, в этом случае, если a > b верно,

a %= b будет работать. a %= b является сокращением на a = a % b.

если a > b ложно,

b %= a будет работать. снова, b %= a является сокращением на b = b % a.

Таким образом, цикл будет держать работаем до любого a или b равно 0.

+0

Спасибо, eddyjs. Эта стенография заставила меня почесывать голову, и, может быть, я слишком устал, чтобы понять «официальный» язык мозиллы. –

2

Вашего код вычисляет наибольший общий фактор a и b использования Euclid's algorithm.

Он использует тернарный оператор вместо оператора if и другой нечитаемой симпатичности.

a ? b : c - выражение, которое вычисляет b, если a является правдивым, в противном случае c. Обратите внимание, что это выражение со значением, и его плохая форма использует его исключительно для побочных эффектов или для сложных вычислений, где if-statement будет более понятным.

a && b в состоянии while гарантирует, что цикл остановится один раз либо a, либо b равен нулю.

И a %= b эквивалентен a = a % b, где % является оператором остатка.

Возможно, стоит прочитать MDN's JavaScript Guide, если этот синтаксис вам незнакомо.

+0

Это ответ, который на самом деле идет дальше, а затем объясняет код. Он объясняет функцию кода. Хорошая работа. – Mouser

+0

Спасибо, король Моб, за объяснение, которое я могу понять. Это не мой код - я просто пытался это понять. И спасибо за ссылку на путеводитель, который я буду изучать - старательно! –

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