2

最近、次の質問に遭遇しました。この表現を減らす方法: s>73?61:60; .

与えられたヒントは、条件演算子を使用する代わりに、正常に機能する単純な比較を使用できるということでした

よくわかりませんが、GCC拡張機能で可能だと思いますが、自分で理解することはできません。

EDIT:式全体はこれです:s-=s>73?61:60

4

7 に答える 7

15

他の答えと同じように:

s -= (s > 73) + 60;

この式が機能するのは、仕様が関係演算子の結果を定義しているためです。セクション 6.5.8 パラグラフ 6:

<(より小さい)、>(より大きい)、<=(より小さいか等しい)、および>=(より大きいか等しい)の各演算子1は、指定された関係が true の0場合と false の場合に生成されます。結果の型はintです。

于 2010-03-17T18:11:02.100 に答える
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;
}

多田!保守不可能なコードの醜い部分は、読み取り可能で保守可能なコードのブロックに縮小されます。

于 2010-03-17T18:34:50.173 に答える
4

これは私が書いたとは信じられないほど醜いコードですが、要件を満たしていると思います。

元の質問に対する私の答えは次のs>5?6:9とおりです。

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

更新された質問のために書き直されました:

61 - (int)(s > 73)

于 2010-03-17T18:07:13.160 に答える
2

もしかしてこれ?

60 + !!(s > 73)

ダブルバンは、ゼロ以外の値を 1 に、ゼロをゼロにマッピングします。

于 2010-03-17T18:12:39.570 に答える
0

の値は(s>5)? あなたはそれでいくつかの算数をすることができますか?

ヒントがなければ、これは、能力とは相関しない特定のa-haの洞察を必要とする、悪い「落とし穴」のインタビューの質問だったと思います. ヒントで、それは...いいですが、暗いです。

于 2010-03-17T18:09:55.957 に答える
0

と を仮定するTrue = 1False = 0、これは機能しません。

s-= (60 + (s > 73))
于 2010-03-17T18:14:15.417 に答える
0

s -= (s > 73) + 60 として考えることができます。 > は関係演算子であり、式 s > 73 の結果に応じて 1 または 0 を返します。戻り値は int であるため、正常に動作します。

于 2012-09-21T03:46:57.647 に答える