2010-03-17 36 views
2

我最近遇到这个问题:如何减少这个表达式:s> 73?61:60;有条件运算符的面试问题

给出的提示是,而不是使用条件运算符,我们可以使用一个简单的比较,它将正常工作

我不确定,但我认为这是可能的一些GCC扩展,但我无法弄清楚自己。

编辑:整个表达式是这样的:s-=s>73?61:60

+27

你不想为,在面试问这类问题的人合作。 – 2010-03-17 18:09:12

+8

正确答案是“去采访别的地方,询问值得疑问” – 2010-03-17 18:09:19

+1

千万人其实问这样的事情为“工作”的采访?对不起,我还是个学生:D – AraK 2010-03-17 18:10:11

回答

15

就像其他答案:

s -= (s > 73) + 60; 

这个表达式工作,因为该规范定义关系运算符的结果。 6.5.8节第6段:

每个运营商<(小于)的,>(大于),<=(小于或等于),和>=(更大如果指定的关系为真,则应产生1并且0如果它是假的。结果有型号int

+10

这是一个不错的问题的优雅的解决方案;) – AraK 2010-03-17 18:12:31

+6

这也适用于C++,其中比较的结果是'bool',其中'+'促进整数操作数,并且'bool'促进为'0' 1'分别代表'false'和'true'。 (假设's'是一个普通的'int'而不是某个类)。 – 2010-03-17 18:19:18

+0

+1 @Johannes为C++视角。 – 2010-03-17 18:21:49

4

这是这样一个丑陋的代码,我可以不敢相信我写的,但我认为它满足了要求:

我的回答原来的问题这是s>5?6:9

9 - (((int)(s > 5)) * 3)

改写更新的问题:

61 - (int)(s > 73)

+1

哈哈,非常棒。 – Daniel 2010-03-17 18:09:38

+0

抱歉,我在编辑时发布。 – 2010-03-17 18:10:30

0

(s>5)的值是多少?你能用这个算术吗?

如果没有提示,我会说这是一个糟糕的“陷阱”面试问题,需要特定的与能力无关的a-ha洞察力问题。随着提示,这是... 不错,但昏暗

2

也许这样?

60 + !!(s > 73) 

双重爆炸将非零值映射为1并将零归零。

+6

你不需要这样做,规范保证关系运算符返回1或0.第6.5.8节第6段。 – 2010-03-17 18:14:55

+0

@Carl,谢谢,我不知道。 – 2010-03-17 18:16:31

0

如果我们假设True = 1False = 0,则没有这个工作:

s-= (60 + (s > 73)) 
8

如何减少这种表达: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; 
} 

田田!一个难以维护的代码难看的部分被简化为可读和可维护的代码块。

+2

trible rofl'ed lol – 2010-03-17 18:38:57

+0

+1对于娱乐价值。 – Ari 2010-03-18 13:35:44

+0

@Ari,litb:很高兴你喜欢它。 – Bill 2010-03-18 15:33:18

0

它可以被认为是为s = - (S> 73)+ 60>是一个关系运算符,它将返回1或0取决于表达S> 73的结果,作为返回值是INT所以它做工精细