最近、次の質問に遭遇しました。この表現を減らす方法: s>73?61:60; .
与えられたヒントは、条件演算子を使用する代わりに、正常に機能する単純な比較を使用できるということでした。
よくわかりませんが、GCC拡張機能で可能だと思いますが、自分で理解することはできません。
EDIT:式全体はこれです:s-=s>73?61:60
最近、次の質問に遭遇しました。この表現を減らす方法: s>73?61:60; .
与えられたヒントは、条件演算子を使用する代わりに、正常に機能する単純な比較を使用できるということでした。
よくわかりませんが、GCC拡張機能で可能だと思いますが、自分で理解することはできません。
EDIT:式全体はこれです:s-=s>73?61:60
他の答えと同じように:
s -= (s > 73) + 60;
この式が機能するのは、仕様が関係演算子の結果を定義しているためです。セクション 6.5.8 パラグラフ 6:
<
(より小さい)、>
(より大きい)、<=
(より小さいか等しい)、および>=
(より大きいか等しい)の各演算子1
は、指定された関係が true の0
場合と false の場合に生成されます。結果の型は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)
? あなたはそれでいくつかの算数をすることができますか?
ヒントがなければ、これは、能力とは相関しない特定のa-haの洞察を必要とする、悪い「落とし穴」のインタビューの質問だったと思います. ヒントで、それは...いいですが、暗いです。
と を仮定するTrue = 1
とFalse = 0
、これは機能しません。
s-= (60 + (s > 73))
s -= (s > 73) + 60 として考えることができます。 > は関係演算子であり、式 s > 73 の結果に応じて 1 または 0 を返します。戻り値は int であるため、正常に動作します。