if ((vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))) {...}
なぜそれが代入ですが、かっこ内のブール式ではないことが分かりますか?どのような状況でこの割り当ては "真"か "偽"とみなされますか?ifステートメント内の代入文がどのように条件として機能しますか?
if ((vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))) {...}
なぜそれが代入ですが、かっこ内のブール式ではないことが分かりますか?どのような状況でこの割り当ては "真"か "偽"とみなされますか?ifステートメント内の代入文がどのように条件として機能しますか?
の比較に基づいてtrueまたはfalseを返し、章§6.5.16、代入演算子(強調鉱山)
ます代入演算子は、左オペランドで指定されたオブジェクトに値を格納します。 代入式の代入後の左オペランドの値は111)ですが、左辺値は ではありません。
だから、最初の割り当てが発生しますし、その後、割り当てられた値がif
で条件文として使用されます。
ので、
if (p = 0)
の場合はFALSEと評価されますと
if (p = 5)
はTRUEになります。
ありがとう、これは私が必要とするものです、私はそれを受け入れるでしょう。 – SWIIWII
Cは、0以外のものはtrue
とみなし、0は偽とみなします。
この割り当ての値は、vnd
に割り当てられた値と同じです(この場合はstruct diam_vnd_t *
)。 ifステートメントは、割り当て後にvnd
がNULL
かどうかをチェックします。
これはと同等のようになります。
vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend);
if (vnd) {...}
Cは非常によくブール型です。そして、ある条件では、任意の式は(int型の)ブール結果に変換されます。 – Olaf
'bool'型は単なる' unsigned int'です。基本的に、言語は「真」/「偽」原子ではなく、「ゼロ」と「非ゼロ」をブール値として扱います。 – Alexander
いいえ、 '_Bool'は' 0'と '1'の値を持つ明示的な符号なし整数型です。' bool'は '_Bool'にマップされる' stdbool.h'のマクロです。 ** ** unsigned intではありません。注:これは標準Cであり、自作のtypedefではありません! "true"/"false"解釈について: '_Bool b = 4;'または 'printf("%d "、(bool)5);'を試してください。ブール論理は、「真」/「偽」の表現方法を定義していないことに注意してください。数学的操作を単純化するので、それらはしばしば「0」/「1」である。 Wikipediaを参照してください。 – Olaf
あなたは変数vnd
に=
後にすべてを割り当てるvnd = (struct...
言っているとき==
である「に等しい」の論理演算子。あなたが真実を必要とする場合は、あなたが使用する必要があります==
割り当ては常に1つの等号で行われます。 =
int i;
i = 0; //assignment
これはi
と呼ばれる整数に0を代入します。
if文でも同じことが起こります。 if文の中にあるかどうかは関係ありません。
(vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))
ブール式を実行するには、==
を使用する必要があります。
(vnd == (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))
これはC11
を引用2つの項目
中途半端な現代コンパイラはそれについて警告します。 – Olaf
@Olaf '((..))'を使用した後でも? –
@SouravGhosh:うーん、本当に気付かなかった。さて、私は "should"に変更します。 gccで検証済み:警告を避けるためにカッコを付けることさえある(彼らも働いている)。ヘックは、警告を抑制するために明示的に比較する必要があります。私に知らせてくれてありがとう。 – Olaf