2017-02-08 3 views
-3

私はC.にはDO-しばらく-doループが存在しない、なぜ私は書くのが自然であるだろう:Cやる-しばらく-doループ

do 
    --y; 
while (y - 3 != -1) 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 

が、私は書き込みでシミュレートする必要があります。

do 
    { 
    --y; 
    if (y - 3 != -1) // do-while-do 
     oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
    else 
     ; 
    } 
while (y - 3 != -1); 
+0

あなたの質問は何ですか?なぜしないのですか?ほとんどの言語でdo whileループの標準形式です!それはデザインです。 – minigeek

+2

「コーヒーを持って来てください」と書いても当然です。しかし何らかの理由でCはそれを理解していません。どうして? –

+1

do-while-do-loopを持つ言語は何ですか? (好奇心が強い、これまでに会ったことはありません。あなたの最初のコードが何をするのか分かりません。) – Mat

答えて

0

forループを使用した反復では、同じ値のyが得られます。

for(--y; y > 2; --y) { 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
} 
1

ループの最も自然な構造には、ループ述語を途中でテストする必要があると不平を言っています。確かに、私が知っているC言語も他のどの言語も、これを直接構文的にサポートしているわけではありませんが、それを実装する方法はたくさんあります。私は

--y; 
while (y - 3 != -1) { 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
    --y; 
} 

、または@StoryTellerが提示する類似forループを介したとして、あなたの特定のコードを書くために傾けられます。それはループ述語を最初にテストする前にループの一部を繰り返しますが、この場合でもかなりきれいです。

あなたは完全に不合理ではないコードの重複を避けるためにしたい場合は、あなたが途中でループ終了を置くことによってそれを行うことができます。

while (1) { 
    --y; 
    if (y - 3 == -1) break; 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
} 

またはこの特定のケースでは、ではないが、一般的に、述語テストに先行するコードを述語テストにマージすることができます。

while (--y - 3 != -1) { 
    oGrid->ooPiece[x][y] = oGrid->ooPiece[x][y - 3]; 
} 
+1

2番目の例では、テストはループを継続するのではなく中断するため、テスト条件を逆にする必要があります。 – Dmitri

+0

@Dmitri、ありがとう、修正されました。 –

関連する問題