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

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

(curr_ptr = (void*)curr_data[1])論理的に何に評価されますか。TRUE

また、私はそのかなりハックっぽいことを知っていますが、whileステートメントは合法的なCですか?コード内の別の場所に割り当てを配置するには、大きなゆがみを経験する必要があるので、そこに残しておくことができれば本当にいいのですが、それが非常にひどいためにみんなの目が炎上する場合は、変更します。

4

4 に答える 4

3

(curr_ptr = (void*)curr_data[1])nullポインタでない限り、TRUEと評価されます。

curr_dataそれがポインターの配列であり、これらのポインターの2番目がnullでないときにループを実行し、その値をに割り当てていると仮定すると、次のようcurr_ptrになります。

while ((curr_ptr = (void*)curr_data[1]) != NULL) { ... }
于 2009-12-02T08:45:12.190 に答える
2

あなたの質問に答えるには:

  1. curr_ptrがに設定されていない場合NULL(つまりcurr_data[1]、0でない場合)はtrueと評価されます。
  2. それは合法だと思いますが、このコード行にはもっと大きな問題があります。

とにかく、私はあなたがこのコードを書かなかったと思います、なぜならあなたはそれを残すことと取り出すことについて議論しているからです。ですから、このコード行を誰が書いたかを調べて、それらを重い鈍いオブジェクトに紹介してほしいのです。

  1. (unsigned int)NULLばかげています。なぜあなたはこれをしますか?これはおそらく単に書くことと同じでしょう0(それが標準によって保証されているかどうかはわかりません)。
  2. curr_data[1]ポインターにキャストされている(そしてポインターがポインターにキャストされている)場合、どのような種類のデータが含まれますか?ポインタを整数型として保持することになっている場合は、その型を使用するintptr_tか、その目的のためにuintptr_t提供されている必要があります(コンパイラがC99をサポートしていない場合は、代わりに使用できます)。<stdint.h>ptrdiff_t
  3. 最後の|| 1は冗長なようです。falseと評価されたとしたらcurr_ptr = (void*)curr_data[1]、最初の条件でそれを捕らえたでしょう。

お尻が痛いかもしれませんが、この行を書き直すことを真剣に考え直してください。IOCCCのエントリのように見えます。

于 2009-12-02T08:51:29.620 に答える
1

割り当てはCの式なので、あなたが持っているものは機能します。;toを変更すること{}は、まったく同じことを意味し、はるかに明確です。少なくとも、その変更を行ってください。より明確な代替案がある場合(通常はこれが当てはまります)、条件での割り当ては避ける必要がありますが、これがこの場所で最も明確である場合は、それを使用してください。

割り当ての結果は、割り当て先オブジェクトです。 a = value割り当てを行ってから、に評価しaます。これは、のようなことを行うために使用されますa = b = 0

コードをさらにクリーンアップするために、voidキャストは必要ありません。これが文字の場合は、NULL(ポインターでのみ使用されることになっています)の代わりに「\ 0」(ヌル文字)を使用してください。

于 2009-12-02T08:52:39.180 に答える
0

あなたは「大きなゆがみ」を経験する必要はありません、それは完全に同等です

while (curr_data[1]) {
    curr_ptr = (void *)curr_data[1];
于 2009-12-02T08:57:43.273 に答える