4
int main()
{
char str1[] = "Overflow";
char str2[] = "Stack";
char *s1 = str1, *s2=str2;
while(*s1++ = *s2++)
printf("%s", str1);
return 0;
}

この状態が崩れると

(while(*s1++ = *s2++))

ロジックを説明してください

来る出力は

ここに画像の説明を入力

4

5 に答える 5

4

*s1++は、この変数で*は よりも優先 され++ます。以下のコードでは、

while(*s1++ = *s2++); //There should be a semicolon.Your code does not has.
  1. *s1 = *s2最初に評価されます。
  2. C のほとんどすべての式は値を返します。したがって*s1 = *s2、最初の文字であり、明らかにnullではない値を返します。while()ループが実行されます。
  3. 次にs1、 とs2がインクリメントされます。
  4. 文字列の最後にs2到達すると、 に割り当てられているものを*s2返します。. これで、この式も値を返し、ループは終了します。'\0's1*s1=*s2'\0'while('\0')
于 2013-11-15T07:06:58.693 に答える
3

この while ループは、C の任意の条件式で非ゼロが true と評価されるという事実に依存しています。

この操作を実行するより明白な方法から、この省略形まで、別の方法で作業する方がおそらくより明確です。

以下から開始できます。

while(*s2 != '\0')
{
    *s1 = *s2;
    s1++;
    s2++;
}

これは、「s2 がターミネータ文字に達していない間、s2 から s1 に文字をコピーし続ける」ことを意味します。各コピーの後に両方のポインターを前方に移動して、次のコピーの準備をします。

ただし、コピーと同じ行にインクリメント操作を含めることで、これを短縮できます。これはポストインクリメント操作なので安全です。コピーが完了するまで評価されません。コードは次のようになります。

while(*s2 != '\0')
{
    *s1++ = *s2++;
}

ここで、非ゼロが真と同等であることを考えると、さらに単純化できます。*s2 != '\0' は *s2 だけに相当します。

while(*s2)
{
    *s1++ = *s2++;
}

最後に、コピー自体を while ステートメントに移動できます。while ステートメント自体は、文字を *s2 から *s1 にコピーし、*s1 を以前と同様に評価します。その後、インクリメントが発生し、丸められます。したがって、コードは次のようになります。

while(*s1++ = *s2++);

したがって、あなたの場合、whileステートメントの後にセミコロンが必要です。そうしないと、複数回出力されます。

于 2013-11-15T07:18:20.420 に答える
2

このループは の内容を にコピーstr2しますstr1:

while(*s1++ = *s2++);

str2 の最後のバイト (0 になる) に遭遇したときに停止する場合。

つまり、str1[] = "Overflow"になりstr1[] = "Stacklow"ます。


更新: より詳細な説明。

  • 最初のループでは、 から 1 文字だけをコピーしstr2ますS。なのでstr1からOverflowとなりSverflowます。
  • 2ループ目、 となりSterflowます。
  • 3回目のループ、 となりStarflowます。
  • 4ループ目、 となりStacflowます。
  • 5ループ目、 となりStacklowます。

これらはスクリーンショットに表示されている線であることに注意してください。

その後、 0 バイトに遭遇し、 にコピーされるstr1ため、 になりStack\0owますが、印刷しません。あなたがそれを印刷するなら、それはちょうど印刷されますStack.

于 2013-11-15T07:06:58.130 に答える
0

s2 で文字列ターミネータ ('\0') に遭遇するまでループします。

while(*s1++ = *s2++)
printf("%s", str1);

while(*s1++='S') prints "Sverflow"
while(*s1++='t') prints "Sterflow"
while(*s1++='a') prints "Starflow"
while(*s1++='c') prints "Stacflow"
while(*s1++='k') prints "Stacklow"
while(*s1++='\0') ends loop 
于 2013-11-15T07:15:39.660 に答える