1

いくつかのコードにコメントして、それが何をするかを説明するよう求められました。すべてが順調で、スイッチのケースで何が行われていたかをよく理解していましたが、ケースのいずれかがこれまでに満たされているかどうかはわかりません. 現在、通常のソフトウェアをすべて使用しているメイン マシンがダウンしているため、このコードを実行またはテストする必要はありません。

この while ループの条件で、デフォルト以外に switch のケースのいずれかが使用されますか? i は単純に 32 にインクリメントされ、スイッチを行う前に rByte が返されますか? とは何ですか; しばらくの間の条件の後?; ではなく {....} が続くべきではありませんか? ?

while(pCommand[--Ptr.Five] > 10 && ++i <32);
if(i==32)
{
    return rByte;
}
switch(pCommand[Ptr.Five++])
{
    case 2: ... (lots of code)
           break;
    case 4: ...  (lots of cod)
           break;
    default: ...
           break;
}

また、--Ptr.Five と Ptr.Five++ はどのように処理されますか? 私の理解では、最初はポインターを戻してその値を使用し、2 番目は現在の値を使用してインクリメントをポストします。

何か不足していますか?; を過ぎても移動します。while の条件と {} の欠如の後、Ptr.Five の値は > 10 になり、したがって 2 または 4 になることはありませんか?

とともに ; しばらくの間の条件の背後で、rByte を返す場合、to32 にぶつかり、次のようになりますか?

4

5 に答える 5

2

セミコロン自体は空のステートメントです。そうやって例えば

while (complicated_expression)
    ;

以下と同じです:

while (complicated_expression)
{
}

complicated_expression副作用がある場合によく使用されるため、ループ本体は必要ありません。

于 2013-04-25T18:08:04.190 に答える
0
while(pCommand[--Ptr.Five] > 10 && ++i <32);

本体はありませんが、ループ条件自体に副作用があるため、何かを行います。

これを次のように書き直すことができます。

while (1) {
    --Ptr.Five;
    if (pCommand[Ptr.Five] <= 10)
        break;
    ++i;
    if (i == 32)
        break;
}
if (i == 32) {
    /* we never hit the pCommand condition */
}

理由

  • を逆方向に検索しpCommand、オフセットPtr.Fiveから最大 32 エントリ前まで、値を探します。<= 10
  • 32 エントリ以内にそのような値が見つからない場合は、戻りますrByte
  • そのような値が見つかった場合は、その値をオンにして何らかの作業を行います
    • PtrFiveスイッチがディスパッチされた後、この値の後の次のエントリを示すためにインクリメントされます

また、--Ptr.Five と Ptr.Five++ はどのように処理されますか? 私の理解では、最初はポインターを戻してその値を使用し、2 番目は現在の値を使用してインクリメントをポストします。

その通りです。の:

pCommand[--Ptr.Five] > 10

Ptr.Five式の残りの部分が評価される前にデクリメントされますが、次の場合:

pCommand[Ptr.Five++]

式は の古い値で評価され、Ptr.Fiveその後すぐにインクリメントされます。ここでは、 switch が の古いエントリpCommand( であるため while ループを終了したエントリ<= 10)に基づいていることを意味しPtr.Fiveますが、ケース内のコードが実行される前にインクリメントされます。


副作用に関する簡単なメモ: John Bode がコメントで指摘しているように、デクリメント前とインクリメント後の式に関する私の説明は正確ではありません。これは、新しい値をすぐに格納するPtr.Five 必要がないためです。ただし、次のシーケンス ポイント (ここでは であるかのように) までに (あたかも) 発生する必要があるため&&、あいまいさはありません。

これは通常、複数の相互に依存する副作用のある式を 1 つのステートメントにまとめた場合にのみ問題になります。だから、あなたが知っている、それを避けるようにしてください.

于 2013-04-25T18:10:33.423 に答える
0

推定i開始時刻0- while ループは、pCommand配列の 31 要素 (1 ~ 31) を解析し、値をチェックする前にデクリメントPtr.Fiveして、 未満の値を探します10。見つからない場合、関数は戻ります。次に、インクリメントする前rByteに値をチェックします...したがって、スイッチで使用される値は、条件で使用される値と同じです。値が小さいことがわかっているため、値はスイッチ条件のいずれかである可能性があります。pCommand[Ptr.Five] while10

于 2013-04-25T18:10:34.813 に答える