1

とにかく、以下のステートメントは何をしていますか?

それは私を混乱させます。ifC のステートメントで条件演算子を使用できることに驚いています。より良い方法はありますか?

ステートメントの条件演算子がわかりifにくすぎる。&& と || を使用してみることができます。オペレーターですが、間違いを犯す可能性があります。

以下のステートメントをより単純な形に書き直すにはどうすればよいでしょうか?

if ( (offset < 0) ?
         ( input->binData.bounds.lo >= (unsigned long)(-offset) ) :
         ( input->binData.bounds.hi < (unsigned long)(-offset) ) )

BitHoist オープン ソース パッケージで、この C コード行を見つけました。

4

3 に答える 3

5

三項演算子の各解像度で、三AND項条件(offset < 0)とその反対( )を使用できます。offset >= 0

if ( ((offset < 0) && ( input->binData.bounds.lo >= (unsigned long)(-offset) )) ||
     ((offset >= 0) && ( input->binData.bounds.hi <  (unsigned long)(-offset) )) ) {
于 2012-07-23T01:52:24.650 に答える
3

input->binData.bounds.lo <= 0 <= input->binData.bounds.hiとの両方がであると仮定するとlong、符号なし算術演算と比較を利用して、単一の条件に減らすことができます。

if ((unsigned long)(-offset) - input->binData.bounds.lo <
    input->binData.bounds.hi - input->binData.bounds.lo) { ... }

(正しさの証明については、 Hacker's Delight 4-1 Checking Bounds of Integers を参照してください。)

于 2012-07-23T02:00:44.417 に答える
2

これについて考えるための混乱の少ない方法は次のとおりです。

 overallBool = 0;

if ( (offset < 0) {
       overallBool = input->binData.bounds.lo >= (unsigned long)(-offset);
} else {
       overallBool = input->binData.bounds.hi < (unsigned long)(-offset);
}

if (overallBool) {
    do your thing.
}

しかし、明らかにそれは実装においてはるかに大きいです。

于 2012-07-23T01:54:51.527 に答える