Что это за логическая операция? `выражение * логическое`

Я видел проблему, когда мы должны были найти зарплату. Если часы меньше 40, мы выплачиваем обычную заработную плату (100 долларов США в час), если есть сверхурочные, мы даем 1,5 раза первоначальной заработной платы (150 долларов США в час).

Задача состояла в том, чтобы решить ее без if-else / loop / или троичных операций.

Это было решено так

int hours = /*some_number*/;
int wage = (100*hours) + (50*(hours-40))*(hours>40);

Этот код работает.
(hours>40) возвращается 1 если часы больше 40 и возвращаются 0 если меньше.
Я понимаю, что это какая-то логическая операция, но как она работает и как она называется.

-4

Решение

Правильный способ сделать это прост:

int hours = /*some_number*/;
int wage = 100*hours;
if (hours > 40) wage += 50 * (hours-40);

Чтобы сжать его до одного выражения, в примере используется тот факт, что логическое значение равно 1 или 0. Так x*some_bool оценивает либо x или же 0,

В вашем случае, если (hours > 40) затем

(50*(hours-40))*(hours>40) == (50*(hours-40)) * 1 == 50*(hours-40)

в противном случае это 0,

(50*(hours-40))*(hours>40) == (50*(hours-40)) * 0 == 0

В общем случае такой код менее читабелен для написания кода. Единственное допустимое использование IMO в продвинутых алгебраических преобразованиях, используемых в криптографии или теории сложности.

1

Другие решения

Ну, вы в основном ответили на ваш вопрос. (hours > 40) возвращается 1 если часы больше 40 и возвращаются 0 иначе.

Возможно, более сложным является тот факт, что этот логический результат затем преобразуется в int косвенным образом до умножения на оплату сверхурочных, но это выходит за рамки вопроса.

Таким образом, весь код может быть действительно расширен таким образом

int hours = /* something */
int wage = 0;
int overtime = hours - 40;
if (hours > 40) {
wage = 100*hours + 50*overtime;
}
else {
wage = 100*hours
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector