Struct1とStruct2という2つの異なる構造があるとします。それらは両方ともそれらの中に異なる要素を持っています。このように比較するとどうなりますか?
if((Struct1) && (Struct2))
{
doSomething();
}
このロジックを使用したコードを見つけたところ、何が起こっているのか疑問に思いました。ありがとう!
編集: Struct1とStruct2は両方とも、構造自体ではなく、2つの異なる構造へのポインターです。
Struct1とStruct2という2つの異なる構造があるとします。それらは両方ともそれらの中に異なる要素を持っています。このように比較するとどうなりますか?
if((Struct1) && (Struct2))
{
doSomething();
}
このロジックを使用したコードを見つけたところ、何が起こっているのか疑問に思いました。ありがとう!
編集: Struct1とStruct2は両方とも、構造自体ではなく、2つの異なる構造へのポインターです。
で構造体を使用するif
ことはCにとって違法な構文であり、準拠するコンパイラでは受け入れられません。別の言い方をすれば、ブールコンテキストで構造を使用することはできません。
ほとんどの場合、コード内(真のコードのStruct1
場合)は構造体ではなく、(おそらく)ポインターまたはその他のものです。その場合、両方がNULL以外の場合、ifが使用されます。
ここには2つの可能性があります。
これにより、st1とst2の両方がNULLを指していないかどうかがチェックされます。
struct Struct1 *st1 = ...;
struct Struct2 *st2 = ...;
if (st1 && st2) {
...
}
これは無効なコードです:
struct Struct1 st1 = ...;
struct Struct2 st2 = ...;
if (st1 && st2) {
...
}
これも無効なコードであることに注意してください。
struct Struct1 st1 = ...;
if (st1) {
...
}
それが機能するためには、構造ではなくポインタが必要です。つまり、コードは次のようになります。
void somefunc(struct structA *Struct1, struct structB *Struct2)
{
if (Struct1 && Struct2)
{
doSomething(Struct1, Struct2);
}
}
これは、ポインタを使用する前に、どちらのポインタもNULLでないことを確認します。構造を直接比較することはできないため、コードが次の場合:
void somefunc(struct structA Struct1, struct structB Struct2)
{
if (Struct1 && Struct2)
{
doSomething(Struct1, Struct2);
}
}
セマンティックエラーが発生します。構造全体を何かと比較することはできません。
変数の大文字化は従来型です。
すべてのサブフィールドが同一の場合は「true」または1を返し、それ以外の場合は「false」または0を返します。
これらの条件演算子の基本的な概念です。
&&演算子の詳細については、こちらをご覧ください
ありがとう。