int main()
{
char str1[] = "Overflow";
char str2[] = "Stack";
char *s1 = str1, *s2=str2;
while(*s1++ = *s2++)
printf("%s", str1);
return 0;
}
この状態が崩れると
(while(*s1++ = *s2++))
ロジックを説明してください
来る出力は

*s1++は、この変数で*は よりも優先 され++ます。以下のコードでは、
while(*s1++ = *s2++); //There should be a semicolon.Your code does not has.
*s1 = *s2最初に評価されます。*s1 = *s2、最初の文字であり、明らかにnullではない値を返します。while()ループが実行されます。s1、 とs2がインクリメントされます。s2到達すると、 に割り当てられているものを*s2返します。. これで、この式も値を返し、ループは終了します。'\0's1*s1=*s2'\0'while('\0')この 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ステートメントの後にセミコロンが必要です。そうしないと、複数回出力されます。
このループは の内容を にコピーstr2しますstr1:
while(*s1++ = *s2++);
str2 の最後のバイト (0 になる) に遭遇したときに停止する場合。
つまり、str1[] = "Overflow"になりstr1[] = "Stacklow"ます。
更新: より詳細な説明。
str2ますS。なのでstr1からOverflowとなりSverflowます。Sterflowます。Starflowます。Stacflowます。Stacklowます。これらはスクリーンショットに表示されている線であることに注意してください。
その後、 0 バイトに遭遇し、 にコピーされるstr1ため、 になりStack\0owますが、印刷しません。あなたがそれを印刷するなら、それはちょうど印刷されますStack.
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