2

したがって、ifステートメントを次のようにしたい: if (foo == ("bar" | "barbar")). これはビットごとの OR 演算子だと思いますが、よくわかりません。とにかく、これはうまくいきません。私が間違っていることについてのアイデアはありますか?

4

4 に答える 4

2

@cnicutar が述べたように、ビットごとの OR 演算子|は文字列リテラルに対して定義されていません。

foo が「bar」または「barbar」のいずれかに等しい場合、コードを実行しようとしているように思えます。これ(これは機能しないことに注意してください)次のようになります(標準のブールOR演算子を使用||):

if ((foo == "bar") || (foo == "barbar"))

"bar" と "barbar" (そしておそらく foo も) は文字ポインターであり、この if ステートメントはこれらの文字列の ADDRESSES を比較するため、これは機能しません (コンパイルはされますが、おそらく意図したとおりには機能しません)。あなたがすることはこれです:

if ((strcmp(foo, "bar") == 0) || (strcmp(foo, "barbar") == 0))

strcmp() の結果が 0 であるかどうかを確認する必要があることに注意してください。これは等しいことを示します。

于 2012-09-16T18:18:44.840 に答える
1

文字列を比較したい場合は、使用する必要がありますstrcmp()( manpage ):

if (strcmp(foo, "bar") == 0 ||
    strcmp(foo, "barber") == 0)
{
    ...
}
于 2012-09-16T18:15:54.970 に答える
1

とにかく、これはうまくいきません。私が間違っていることについてのアイデアはありますか?

ビットごとの or 演算子は文字列リテラルに対して定義されていないため、そのコンテキストで使用しても意味がありません。

于 2012-09-16T18:13:18.240 に答える
0

ビット単位のOR演算子は、ORされる値の個々のビットに対してOR演算を実行します。

例:0b10111001 | 0b01101101 == 0b11111101

uint8_t a = 0xF0;
uint8_t b = 0x0F;
uint8_t c = a | b; // This is 0xFF

リテラルの場合、OR演算子によって操作される値はそれらのアドレスであるため、コードが意図しているようには機能しません。

以前の回答で述べたように、文字列を比較するには、ライブラリのstrcmpまたはstrncmp関数を使用する必要があります。string.h

于 2012-09-16T18:27:26.710 に答える