0

標準のcコンパイラ(C89)を使用して、以下の2つのifステートメントが同じように評価されるかどうかを思い出そうとしています。

スニペット1:

boolean function(formattype* format)
{
    if(format != null && (*format == format1 || *format == format2 || *format == format3) )
        return true;
    else
        return false;
}

スニペット2と同じ方法で評価されます。

boolean function(formattype* format)
{

    if(format != null && (*format == format1 || format2 || format3) )
        return true;
    else
        return false;
}

2番目の比較の評価にのみ関心があり、説明のために関数を追加しただけです。いくつかの同様の方法を使用して、すべてを入力せずに||'d引数のそれぞれを使用して==を評価したことを覚えているようですが、詳細を思い出せません。

編集:おそらく、この関数は、説明に役立つよりも物事を混乱させました。

私は以下を評価しようとしています

if(format != null && (*format == format1 || *format == format2 || *format == format3) )

1つ目は、nullポインターの逆参照を防ぐための単なるチェックなので、無視してください。次の3つは、参照解除されたフォーマットポインタが3つの異なるフォーマットタイプのいずれかに等しいかどうかを確認しています(知っておく必要がある場合は列挙型になります)。

マクロは使いたくないので、比較を簡単にしたい。それは不可能かもしれません、私は単に同様の操作を実行したという漠然とした記憶を持っています。

2番目の例に沿ったものだと思いました。

if(format != null && (*format == format1 || format2 || format3) )
4

3 に答える 3

1

いいえ、まったく異なります。2番目の例は次と同等です。

if(format != null && ( (*format == format1) || (format2) || (format3) ) )
于 2012-08-21T21:37:40.257 に答える
1

いいえ、そうではありません。最初のチェックは有効ですが、2番目のチェックでは誤った結果が得られます。基本的には、「(* formatがformat1に等しい)OR(format2がゼロ以外)OR(format3がゼロ以外)」という意味です。format2またはformat3のいずれかがゼロ以外であると仮定すると、これは常にtrueと評価されます。

あなたはおそらくビット演算子を改ざんするつもりでした。フォーマット1、2、3が2の累乗である場合*format、それらの1つがを使用しているかどうかを確認できます。

if (*format & (format1 | format2 | format3))

ビット単位(論理に反対)ANDOR演算子ではありません。ただし、このアプローチは安全ではありません。が指すメモリformatがフォーマット1、2、および3の定数の一部の合計である場合でもtrueと評価されます(formattype整数型であると想定)。

于 2012-08-21T21:37:56.833 に答える
0

C ++ 11またはGCC拡張機能にアクセスできる場合は、マクロを使用して必要な処理を実行する2つの実装を次に示します。

// GCC extension version
#define OR_ALL(CMP, VALUES...) \
({ \
    __typeof__(CMP) values_arr[] = { VALUES }; \
    size_t values_cnt = sizeof(values_arr) / sizeof(*values_arr); \
    int found = 0;\
    for (int i = 0; i < values_cnt; i++) { \
        if (CMP == values_arr[i]){ \
            found = 1;\
            break;\
        }\
    }\
    found;\
})

// C++ 11 version
#define OR_ALL_CPP(CMP, VALUES...) or_all_cpp_impl<decltype(CMP), VALUES>(CMP)

template <typename T, T... args>
bool or_all_cpp_impl(T cmp)
{
    T arguments[] = { args... };
    size_t count = sizeof(arguments) / sizeof(T);

    for (int i = 0; i < count; i++) {
        if (cmp == arguments[i])
            return true;
    }

    return false;
}

C ++バージョンが利用可能であれば、それをお勧めしますが、どちらも同じように機能します。

于 2012-08-21T22:02:38.007 に答える