Что означает y - = m


просматривая какой-то пример кода C, я наткнулся на это:

y -= m < 3;

что это значит? Это какой-то сокращенный цикл или что? Это невозможно для google, насколько я знаю.

7 52

7 ответов:

m < 3 либо 1 или 0 в зависимости от значения истины.

так y=y-1, когда m<3 и true или y=y-0, когда m>=3

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

y = (y - (m < 3));

m < 3 вычисляется и возвращает логический результат 1 или 0, поэтому выражение можно упростить как

y = y - 1; // if m < 3 is true

или

y = y - 0; // if m < 3 is false

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

Я имею в виду if (m < 3) { y -=1; } с (m < 3) равно 1, если m меньше 3, 0 в противном случае.

код появляется в какой-то седой старой справочной реализации чего-то, что связано с високосными годами или Пасхой, или, возможно, обоими: первые два месяца январь и февраль особенные, потому что они происходят до високосного дня. На самом деле нет никакого оправдания для написания такого кода, если вам действительно не нравится его внешний вид. Большинство людей этого не делают.

m < 3 вычисляется как 1, Если m меньше 3. Следовательно, y в этом случае уменьшается на единицу. Таким образом, оператор if избегается.

Я не могу сказать, вы хотите это на, но я могу сказать вам, что она делает:

m < 3 возвращает int 0 или 1, представляющий логическое значение.

если m меньше 3, оператор evalutates как:y -= 1 или y = y - 1;

если m больше или равно 3, оператор evalutates как y -= 0 или y = y - 0. В целом в этом случае заявление ничего не делает.

< имеет более высокий приоритет перед знаком равенства = так что m<3 возвращает 1, Если m меньше 3, а остальное-0

тогда y = y-1 или y = y - 0

Я согласен, что код эквивалентен if(m<3) y=y-1;

однако это небезопасный код, потому что в то время как FALSE всегда 0, TRUE имеет несколько определений. В настоящее время TRUE равен 1 в большинстве систем программирования, но в более старых системах он был равен -1 (где все биты, где установлено значение on, а не только последний). Поэтому, если этот код работает на старой платформе, он может быть переведен в if(m<3) y=y-(-1); или if(m<3) y=y+1; Кросс-системная совместимость-это большая причина, чтобы избежать "умного" кода, такого как этот.