2016-05-11 13 views
0
if ((vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend))) {...} 

なぜそれが代入ですが、かっこ内のブール式ではないことが分かりますか?どのような状況でこの割り当ては "真"か "偽"とみなされますか?ifステートメント内の代入文がどのように条件として機能しますか?

+2

中途半端な現代コンパイラはそれについて警告します。 – Olaf

+0

@Olaf '((..))'を使用した後でも? –

+0

@SouravGhosh:うーん、本当に気付かなかった。さて、私は "should"に変更します。 gccで検証済み:警告を避けるためにカッコを付けることさえある(彼らも働いている)。ヘックは、警告を抑制するために明示的に比較する必要があります。私に知らせてくれてありがとう。 – Olaf

答えて

2

の比較に基づいてtrueまたはfalseを返し、章§6.5.16、代入演算子強調鉱山

ます代入演算子は、左オペランドで指定されたオブジェクトに値を格納します。 代入式の代入後の左オペランドの値は111)ですが、左辺値は ではありません。

だから、最初の割り当てが発生しますし、その後、割り当てられた値がifで条件文として使用されます。

ので、

if (p = 0) 

の場合はFALSEと評価されますと

if (p = 5) 

はTRUEになります。

+1

ありがとう、これは私が必要とするものです、私はそれを受け入れるでしょう。 – SWIIWII

0

Cは、0以外のものはtrueとみなし、0は偽とみなします。

この割り当ての値は、vndに割り当てられた値と同じです(この場合はstruct diam_vnd_t *)。 ifステートメントは、割り当て後にvndNULLかどうかをチェックします。

これはと同等のようになります。

vnd = (struct diam_vnd_t *)g_hash_table_lookup(vendors,vend); 
if (vnd) {...} 
+0

Cは非常によくブール型です。そして、ある条件では、任意の式は(int型の)ブール結果に変換されます。 – Olaf

+0

'bool'型は単なる' unsigned int'です。基本的に、言語は「真」/「偽」原子ではなく、「ゼロ」と「非ゼロ」をブール値として扱います。 – Alexander

+0

いいえ、 '_Bool'は' 0'と '1'の値を持つ明示的な符号なし整数型です。' bool'は '_Bool'にマップされる' stdbool.h'のマクロです。 ** ** unsigned intではありません。注:これは標準Cであり、自作のtypedefではありません! "true"/"false"解釈について: '_Bool b = 4;'または 'printf("%d "、(bool)5);'を試してください。ブール論理は、「真」/「偽」の表現方法を定義していないことに注意してください。数学的操作を単純化するので、それらはしばしば「0」/「1」である。 Wikipediaを参照してください。 – Olaf

0

あなたは変数vnd=後にすべてを割り当てるvnd = (struct...言っているとき==

である「に等しい」の論理演算子。あなたが真実を必要とする場合は、あなたが使用する必要があります==

0

割り当ては常に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つの項目

+0

'int i = 0;'は**割り当てではありません**。 @Olaf 'int i; – Olaf

+0

; //宣言 '、' i = 0; //代入 '< - それと同様? – element11

+0

これは別のものです! – Olaf

関連する問題