8

初心者の質問で申し訳ありません。まだまだプログラミングを勉強中です。だから私はC ++を使用していて、次のようなことをする必要があります:

int n;
do {
    n = get_data();
    if(n != -1)
        send(n);
} while(n != -1);

これは単なるスケッチです。とにかくエレガントな感じがしない。テストを 2 回受けなければなりません。1 回テストしてフラグを設定することもできますが、フラグを 2 回チェックする必要があるため、あまりエレガントではありません。私がやりたいことはとても簡単なので、これをもっと簡単に行う方法があるはずです。

4

10 に答える 10

19
int n;
while (-1 != (n = get_data())) {
    send(n);
} // while
于 2008-11-16T23:47:09.787 に答える
17

Similar to eed3si9n's but arguably easier to read:

 int n;
 while (n = get_data(), n != -1)
 {
     send(n);
 }
于 2008-11-17T02:53:39.753 に答える
15

breakの使用方法:

int n;
while(1) {
    n = get_data();
    if(n == -1)
        break;
    send(n);
}

この方法では、テストを 1 回だけ行い、get_data が必要なものを返さない場合はすぐに終了します。

于 2008-11-16T23:46:20.037 に答える
11
for (int n = get_data(); n != -1; n = get_data()) {
  send(n);
}
于 2008-11-17T03:15:52.343 に答える
4

元のバージョンで問題ありません。

私の最後の C プログラミングの仕事では、MISRA コーディング標準に従わなければなりませんでした。

MISRA ルールでは、次のようになります。

int n;
while(1) {
    n = get_data();
    if(n == -1)
        break;
    send(n);
}

break、およびこれにより禁止されています。

while((n = get_data()) != -1) { send(n); }

代入はブール コンテキストで表示されるため禁止されているため、元のバージョンと同様のループを書く習慣があります。

意図がより明確になると思われる場合、またはテストが複雑な式である場合は、ブール変数を使用できます。

int n;
bool valid;
do {
    n = get_data();
    valid = n != -1;
    if(valid)
        send(n);
} while(valid);

しかし、" " のような単純なテストのn != -1場合、プログラムを長くする価値はないかもしれません。

于 2008-11-17T00:01:45.450 に答える
2
/* This is cleaner */ 
AGAIN:;
    int n = get_data();
    if (n != -1)
    {
        send(n);
        goto AGAIN;
    }


/* This has some charm as well */ 
int n;
while ((n = get_data()) != -1)
    send(n);
/* and now i see that this is the top answer.  Oh well */ 
于 2011-03-25T01:52:23.443 に答える
1
int n;
n = get_data();
while (n != -1) {
  send(n);
  n = get_data();
}
于 2008-11-18T16:12:30.840 に答える
0

Pythonでは、次のようにします。

while True:
    n = get_data()
    if n == -1:
        break
    send(n)

ご覧のとおり、これはCバージョンよりもそれほど短くはありません。通常、Pythonコードは同等のCコードの5〜10分の1です。これはここでは当てはまらないので、読みやすく、十分に短く、高速なスニペットを楽しんだり、他のことに集中したりできます。

短くしたい場合は、ジョナサンの答えを確認してください。しかし、実際にはこれは問題ではありません。

于 2010-02-22T23:55:01.453 に答える
0

goto:)で構築

int n;
goto inside; do {
  send(n);
inside:
  n=get_data();
} while(n!=-1);
于 2008-11-18T10:47:02.403 に答える
-2
int get_data()
{
 ...
}

void _send(int )
{
 ...
}

int  send(int (*a) ())
{
   int n = a();

   if (n == -1)
      return n;

   _send(n);
   return 1;
}

int main()
{
  int (*fp)();
  fp = get_data;
  while ( send(fp)!= -1 );

  return 0;
}

HTH

于 2008-11-18T12:50:01.453 に答える