C++ 关于条件算子的一个访谈问题
我最近遇到了一个问题:如何减少这个表达式:s>73?61:60 给出的提示是,我们可以使用一个简单的比较,而不是使用条件运算符,这将很好地工作 我不确定,但我认为有一些GCC扩展是可能的,尽管我自己无法弄清楚C++ 关于条件算子的一个访谈问题,c++,c,conditional-operator,C++,C,Conditional Operator,我最近遇到了一个问题:如何减少这个表达式:s>73?61:60 给出的提示是,我们可以使用一个简单的比较,而不是使用条件运算符,这将很好地工作 我不确定,但我认为有一些GCC扩展是可能的,尽管我自己无法弄清楚 编辑:整个表达式是这样的:s-=s>73?61:60这是一段非常难看的代码,我不敢相信我写了它,但我认为它满足了要求: 我对原始问题的回答是s>5-6:9: 9-((int)(s>5))*3) 为更新的问题重写: 61-(int)(s>73)(s>5)的值是多少?你能用它算算一下吗 如果没
编辑:整个表达式是这样的:
s-=s>73?61:60
这是一段非常难看的代码,我不敢相信我写了它,但我认为它满足了要求:
我对原始问题的回答是s>5-6:9
:
9-((int)(s>5))*3)
为更新的问题重写:
61-(int)(s>73)
(s>5)
的值是多少?你能用它算算一下吗
如果没有暗示,我会说这是一个糟糕的面试问题,需要一个与能力无关的a-ha洞察力。有了提示,它是。。。很好,但是很模糊。就像其他答案一样:
s -= (s > 73) + 60;
此表达式之所以有效,是因为规范定义了关系运算符的结果。第6.5.8节第6段:
如果指定的关系为真,则每个运算符
(大于),=
(大于或等于)应产生<1
,如果指定的关系为假,则产生<0
。结果的类型为int
也许是这个
60 + !!(s > 73)
双爆炸将非零值映射为1,将零映射为零。如果我们假设
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,因为>是一个关系运算符,它将根据表达式s>73的结果返回1或0,因为返回值为int,所以它可以正常工作你不想为面试时问这类问题的人工作。正确答案是“去其他地方面试,问一些有价值的问题”@AraK,只有不了解面试目的的人。@AraK:是的,有些面试官对自己的聪明才智感到十分惊讶,他们告诉自己,他们只想雇佣那些足够聪明的人来回答他们那些晦涩而无用的琐事问题,但实际上,他们只是想给可怜的受访者留下深刻印象,告诉他们自己有多聪明:在x86-64上用-O3编译Carl的答案和gcc 4.2.1中的三元运算符,这两个结果都是相同的。如果没有-O3(因此运行正常),卡尔的答案会变小。但是,为什么要发布一个不是-O3的版本,特别是如果速度是一个问题的话?这是一个解决糟糕问题的优雅方法;)这也是在C++中进行的,比较结果是<代码> BOOL<代码>,其中代码> > +代码>促进整数操作数,其中代码< > BOOL分别促进< <代码> 0 > /代码>和<代码> 1代码> > <代码> false < /C> >和<代码>真< /代码>。(假设s
是一个普通的int
而不是某个类)。是的,但它实际上是一个缩减吗D我们得看看asm,不是吗?;)不需要这样做,规范保证关系运算符返回1或0。第6.5.8节第6段。@Ari,litb:很高兴你喜欢。