C での代入の論理値
-
11-09-2019 - |
質問
while (curr_data[1] != (unsigned int)NULL &&
((curr_ptr = (void*)curr_data[1]) || 1))
2 つの部分からなる質問。
どうなるだろう (curr_ptr = (void*)curr_data[1])
論理的には次のように評価されます。 TRUE
?
また、かなりハックっぽいのは承知していますが、 while
ステートメント法的 C?この割り当てをコード内の別の場所に置くには、かなりの苦労を強いられることになるので、そのまま残せれば本当に嬉しいのですが、全員の目玉が発火するほどひどい場合は、変更します。 。
解決
質問に答えるには:
- 次の場合は true と評価されます。
curr_ptr
に設定されていませんNULL
(すなわち、curr_data[1]
0ではありません)。 - 私はこれが合法だと信じていますが、このコード行にはさらに大きな問題があります。
とにかく、あなたはこのコードを書かなかったと思います。それを取り出すこと。そこで、このコード行を誰が書いたかを突き止めて、重い鈍器を紹介してもらいたいと思います。
(unsigned int)NULL
おかしいです。なぜこんなことをするのでしょうか?これはおそらくただ書いているのと同じでしょう0
(それが標準で保証されているかどうかはわかりません)。- どのようなデータが入っているのか
curr_data[1]
それがポインタにキャストされている場合(そしてポインタがそれにキャストされている場合)?ポインタを整数型として保持する必要がある場合は、次の型を使用する必要があります。intptr_t
またはuintptr_t
で提供される<stdint.h>
その目的のため (コンパイラが C99 をサポートしていない場合)ptrdiff_t
許容可能な代替品になる可能性があります)。 - の
|| 1
最後は冗長なようです。もしcurr_ptr = (void*)curr_data[1]
false と評価された場合は、最初の条件でそれを検出したでしょう。
面倒かもしれませんが、この行を書き直すことを真剣に考え直してください。IOCCCのエントリーのようです。
他のヒント
(curr_ptr = (void*)curr_data[1])
null ポインタでない限り、TRUE と評価されます。
仮定して curr_data
はポインターの配列であり、やりたいことは、これらのポインターの 2 番目が null でない間にループを実行し、その値を に代入することです。 curr_ptr
, 、私ならこうします:
while ((curr_ptr = (void*)curr_data[1]) != NULL) { ... }
代入は C の式なので、あなたが持っているものは機能します。変更する ;
に {}
はまったく同じ意味で、はるかに明確です。少なくとも変更してください。より明確な代替手段がある場合 (通常はこれが当てはまります)、条件での代入は避けるべきですが、この場所でこれが最も明確な場合は、それを使用してください。
代入の結果は、assigned-to オブジェクトです。 a = value
割り当てを実行してから評価します a
. 。これは次のようなことを行うために使用されます a = b = 0
.
コードをさらにクリーンアップするには、void キャストの必要はありません。これが文字の場合は、NULL (ポインターのみで使用されるはずです) の代わりに '\0' (null 文字) を使用します。
「大きな歪み」を経験する必要はありません。それは完全に同等です。
while (curr_data[1]) {
curr_ptr = (void *)curr_data[1];