0

このコードはどのようにして正でない値を見つけますか?

#include <map>
#include <cstdio>

#define until(cond) while(!(cond))

using namespace std;

int main() {
  // initialization
  map<int,int> second;
  int i=10;
  int testme[10]={4,3,1,-3,7,-10,33,8,4,14};
  while (i --> 0) second[i]=testme[i];

  // find the first non-positive value in second
  map<int,int>::reverse_iterator p = --second.rend();
  do {
    printf("Is %d non-positive?\n",second[++i]);
  } until(-- p --->   second < 0);
    // "second < 0" to check if the value in second is non-positive

  printf("Yes it is!\n");
}

出力は次のとおりです。

Is 4 non-positive?
Is 3 non-positive?
Is 1 non-positive?
Is -3 non-positive?
Yes it is!

では、「second <0」文字列はどのようにして正でない値をチェックするのでしょうか?

4

2 に答える 2

7

解析のヒント--p--->second。として評価され--((p--)->second)ます。(露骨なエラーを修正してくれた @AProgrammer に感謝します!)

  • pポインタまたはイテレータです。

  • p--デクリメントしますが、以前の値を右辺値としてp返します

  • (p--)->secondその値の member にアクセスしますsecond

  • --((p--)->second)その値 (つまり、マップされた値) をデクリメントし、デクリメントされた新しい値を返します

  • その新しい値が比較されます0

ノート:

  • p--はコンテナの反復を処理します。それ以外の場合、ループには の明示的な変更がないことに注意してくださいp

  • 外側の--make は0負の数としてカウントされます。副作用として、ループはマップ内のすべての値を減らします。

  • の 2 番目の使用法iはやや冗長です。すでにイテレータを持っているので、p->secondではなくループ内に書くこともできました。second[++i]実際、second[++i]ツリー全体の検索が必要です。

コードは次と同等です。

do { /* ... */
    auto q = p;
    --p;
    --(q->second);
} until (q->second < 0);
于 2012-08-23T09:08:56.697 に答える
0

実際には、値が正でも負でもないかどうかを確認します

ケレックが言ったように

do { /*...*/ }
until(-- p --->   second < 0);

次と同等です。

do { /*...*/ }
until(--((p--)->second) < 0);

これは次と同等です:

do { /*...*/ } 
while(((p--)->second)-- > 0);

したがって、値があれば0それも壊れます。

于 2012-08-23T09:29:27.173 に答える