したがって、ifステートメントを次のようにしたい: if (foo == ("bar" | "barbar"))
. これはビットごとの OR 演算子だと思いますが、よくわかりません。とにかく、これはうまくいきません。私が間違っていることについてのアイデアはありますか?
4 に答える
@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 であるかどうかを確認する必要があることに注意してください。これは等しいことを示します。
文字列を比較したい場合は、使用する必要がありますstrcmp()
( manpage ):
if (strcmp(foo, "bar") == 0 ||
strcmp(foo, "barber") == 0)
{
...
}
とにかく、これはうまくいきません。私が間違っていることについてのアイデアはありますか?
ビットごとの or 演算子は文字列リテラルに対して定義されていないため、そのコンテキストで使用しても意味がありません。
ビット単位の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