質問

while (curr_data[1] != (unsigned int)NULL &&
    ((curr_ptr = (void*)curr_data[1]) || 1))

2 つの部分からなる質問。

どうなるだろう (curr_ptr = (void*)curr_data[1]) 論理的には次のように評価されます。 TRUE?

また、かなりハックっぽいのは承知していますが、 while ステートメント法的 C?この割り当てをコード内の別の場所に置くには、かなりの苦労を強いられることになるので、そのまま残せれば本当に嬉しいのですが、全員の目玉が発火するほどひどい場合は、変更します。 。

役に立ちましたか?

解決

質問に答えるには:

  1. 次の場合は true と評価されます。 curr_ptr に設定されていません NULL (すなわち、 curr_data[1] 0ではありません)。
  2. 私はこれが合法だと信じていますが、このコード行にはさらに大きな問題があります。

とにかく、あなたはこのコードを書かなかったと思います。それを取り出すこと。そこで、このコード行を誰が書いたかを突き止めて、重い鈍器を紹介してもらいたいと思います。

  1. (unsigned int)NULL おかしいです。なぜこんなことをするのでしょうか?これはおそらくただ書いているのと同じでしょう 0 (それが標準で保証されているかどうかはわかりません)。
  2. どのようなデータが入っているのか curr_data[1] それがポインタにキャストされている場合(そしてポインタがそれにキャストされている場合)?ポインタを整数型として保持する必要がある場合は、次の型を使用する必要があります。 intptr_t または uintptr_t で提供される <stdint.h> その目的のため (コンパイラが C99 をサポートしていない場合) ptrdiff_t 許容可能な代替品になる可能性があります)。
  3. || 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];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top