0

以下のようなwhileループがあります。

while (*d++ = *sc++)

dept のポインターを理解したいので、ループに入り、whileループがポインターでどのように機能しているかを理解したいと思いwhileます。

で使用stepしましたが、完全にループgdbには入りません。ループに入り、すべてのステップで操作を理解whileする方法はありますか。while

4

3 に答える 3

4

*postfix よりも強くバインドします++++右側が最後に適用されるため、次のようになります。

while (*d++ = *sc++)

以下と同じです:

while (*d = *sc)
{
  d++;
  sc++;

変更は、 でトレースする方がはるかに優れていますgdb

アップデート:

この OP のようにコーディングしないでください。

クールに見えるかもしれませんが、あなたが賢いことを証明します. 一般的な人間の脳で解析するのは難しいため、エラーが発生しやすいですか? 私たちはどちらを望んでいませんか?

上記で提案されたようなより明確な代替手段を選び、コンパイラーにコードをスクランブルさせてください。

于 2012-10-18T09:31:36.053 に答える
3

オプション 1: Olaf Dietsche の提案に従って、アセンブリ コードのデバッグを調べます。

オプション 2:gcc -S test.cアセンブル後にコンパイラを停止して、プログラムのアセンブリ コードを確認するために使用します。アセンブリ コードを理解するのは少し難しいかもしれません。詳細はこちら

オプション 3: プログラムを次のように書き直します。

while(1)
{
    if(*d++ != *sc++)
    {
        break;
    }
}

ブレークポイントを設定して、値の変化を確認できるようにします。

于 2012-10-18T09:33:13.823 に答える
0

コードを書くための別の、しかし同じ方法は次のとおりです。

*d = *sc;
while (*d > 0)
{
  d++;
  sc++;
  *d = *sc;
}
于 2012-10-18T09:56:18.383 に答える