Что означает y - = m
просматривая какой-то пример кода C, я наткнулся на это:
y -= m < 3;
что это значит? Это какой-то сокращенный цикл или что? Это невозможно для google, насколько я знаю.
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;
Кросс-системная совместимость-это большая причина, чтобы избежать "умного" кода, такого как этот.