我最近遇到了这个问题:How to reduce this expression: s>73?61:60; .
给出的提示是,我们可以使用一个可以正常工作的简单比较,而不是使用条件运算符。
我不确定,但我认为通过一些 GCC 扩展是可能的,尽管我自己无法弄清楚。
编辑:整个表达式是这样的:s-=s>73?61:60
我最近遇到了这个问题:How to reduce this expression: s>73?61:60; .
给出的提示是,我们可以使用一个可以正常工作的简单比较,而不是使用条件运算符。
我不确定,但我认为通过一些 GCC 扩展是可能的,尽管我自己无法弄清楚。
编辑:整个表达式是这样的:s-=s>73?61:60
就像其他答案一样:
s -= (s > 73) + 60;
此表达式有效,因为规范定义了关系运算符的结果。第 6.5.8 节第 6 段:
如果指定的关系为真且为假,则每个运算符
<
(小于)、>
(大于)、<=
(小于或等于)和>=
(大于或等于)都应产生。结果有类型。1
0
int
如何减少这个表达式:s-=s>73?61:60;
怎么样:
typedef int Price;
Price getPriceAfterRebate(const Price priceBeforeRebate)
{
const Price normalRebate = 60;
const Price superRebate = 61;
const Price superRebateThreshold = 73;
Price returnValue = priceBeforeRebate;
if (priceBeforeRebate > superRebateThreshold)
{
returnValue -= superRebate;
}
else
{
returnValue -= normalRebate;
}
return returnValue;
}
多田!一段难看的不可维护的代码被简化为可读且可维护的代码块。
这是一段丑陋的代码,我不敢相信我写了它,但我认为它满足了要求:
我对原始问题的回答是s>5?6:9
:
9 - (((int)(s > 5)) * 3)
为更新的问题重写:
61 - (int)(s > 73)
也许这个?
60 + !!(s > 73)
双键将非零值映射到 1 并将零值映射到零。
的价值是(s>5)
多少?你能用它做一些算术吗?
如果没有提示,我会说这是一个糟糕的“陷阱”面试问题,需要与能力无关的特定洞察力。有了提示,它......很好,但暗淡。
如果我们假设True = 1
and False = 0
,那么这不起作用:
s-= (60 + (s > 73))
它可以被认为是 s -= (s > 73) + 60 因为 > 是一个关系运算符,它会根据表达式 s > 73 的结果返回 1 或 0 ,因为返回值是 int 所以它会正常工作