这是什么布尔运算?“表达式 * 布尔值”



我看到了一个问题,我们必须找到工资。如果工作时间少于 40 小时,我们支付正常工资(100 美元/小时(,如果有加班,我们支付原始工资的 1.5 倍(150 美元/小时(。

挑战在于在没有if-else/loops/或三元运算的情况下解决它。

是这样解决的

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

此代码有效。 如果小时数大于 40,则返回(hours>40) 1,如果小时数小于 40,则返回0小时数。我知道这是某种布尔运算,但它是如何工作的,这到底叫什么。

正确的方法是直截了当的:

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唯一有效的用途是密码学或复杂性理论中使用的高级代数变换。

好吧,

你基本上回答了你的问题。如果小时数大于 40,则(hours > 40)返回1,否则返回0

也许更棘手的部分是,这个布尔结果在乘以加班费之前隐式转换为 int,但这超出了问题的范围。

所以整个代码确实可以通过这种方式扩展

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

最新更新