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