我最近遇到这个问题:如何减少这个表达式:s> 73?61:60;。有条件运算符的面试问题
给出的提示是,而不是使用条件运算符,我们可以使用一个简单的比较,它将正常工作。
我不确定,但我认为这是可能的一些GCC扩展,但我无法弄清楚自己。
编辑:整个表达式是这样的:s-=s>73?61:60
我最近遇到这个问题:如何减少这个表达式:s> 73?61:60;。有条件运算符的面试问题
给出的提示是,而不是使用条件运算符,我们可以使用一个简单的比较,它将正常工作。
我不确定,但我认为这是可能的一些GCC扩展,但我无法弄清楚自己。
编辑:整个表达式是这样的:s-=s>73?61:60
就像其他答案:
s -= (s > 73) + 60;
这个表达式工作,因为该规范定义关系运算符的结果。 6.5.8节第6段:
每个运营商
<
(小于)的,>
(大于),<=
(小于或等于),和>=
(更大如果指定的关系为真,则应产生1
并且0
如果它是假的。结果有型号int
。
这是一个不错的问题的优雅的解决方案;) – AraK 2010-03-17 18:12:31
这也适用于C++,其中比较的结果是'bool',其中'+'促进整数操作数,并且'bool'促进为'0' 1'分别代表'false'和'true'。 (假设's'是一个普通的'int'而不是某个类)。 – 2010-03-17 18:19:18
+1 @Johannes为C++视角。 – 2010-03-17 18:21:49
这是这样一个丑陋的代码,我可以不敢相信我写的,但我认为它满足了要求:
我的回答原来的问题这是s>5?6:9
:
9 - (((int)(s > 5)) * 3)
改写更新的问题:
61 - (int)(s > 73)
哈哈,非常棒。 – Daniel 2010-03-17 18:09:38
抱歉,我在编辑时发布。 – 2010-03-17 18:10:30
(s>5)
的值是多少?你能用这个算术吗?
如果没有提示,我会说这是一个糟糕的“陷阱”面试问题,需要特定的与能力无关的a-ha洞察力问题。随着提示,这是... 不错,但昏暗。
也许这样?
60 + !!(s > 73)
双重爆炸将非零值映射为1并将零归零。
你不需要这样做,规范保证关系运算符返回1或0.第6.5.8节第6段。 – 2010-03-17 18:14:55
@Carl,谢谢,我不知道。 – 2010-03-17 18:16:31
如果我们假设True = 1
和False = 0
,则没有这个工作:
s-= (60 + (s > 73))
如何减少这种表达: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 = - (S> 73)+ 60>是一个关系运算符,它将返回1或0取决于表达S> 73的结果,作为返回值是INT所以它做工精细
你不想为,在面试问这类问题的人合作。 – 2010-03-17 18:09:12
正确答案是“去采访别的地方,询问值得疑问” – 2010-03-17 18:09:19
千万人其实问这样的事情为“工作”的采访?对不起,我还是个学生:D – AraK 2010-03-17 18:10:11