- ベストアンサー
while(*s++=*t++)の判定は?
while(*s++=*t++)において、どのような時が真あるいは偽なのですか? 今年もよろしくおねがいします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> while(*s++=*t++) これは No.1 のお礼で書かれている通り、文字列コピーのもっとも一般的な方法です。 この while は、*s++=*t++ の結果でループ継続の判断をします。 「*s++=*t++ の結果」は構文解釈上は *s のことですが、*s には *t が代入されているので、結局は *t だと考えることができます。 *t というのは文字列に含まれるいずれかの文字データなので、通常は非0(while での評価は「真」)です。 しかし、文字列の終端は '\0' (値は0)なので、この時に限り「偽」と判定されます。 while が真偽判定を行うのは *t が *s に代入された後なので、'\0' までコピーした(つまり文字列のコピーが完了した)時点でループ終了となるわけです。 ※この構文の詳しい解釈方法については、こちらのURLをご覧ください。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=267777 質問:C言語のポインタ表現 - 回答No.4
その他の回答 (4)
- nagare
- ベストアンサー率33% (280/831)
寝ぼけてたのか、間違いを書いてました 訂正しますね 誤:*s++=*t++の結果が1の場合にループします 正:*s++=*t++の結果が0以外の場合にループします 誤: 1)*t++ 2)*s=1)の結果 3)*s++ 4)3)の結果が1であればループ 正: 1)*s=*t 2)*t++ 3)*s++ 4)1)の結果が0以外であればループ 詳細はNo.3,4さんの回答を >/* strcpy:tをsにコピーする */ あ strcpyを使わない方法だったんですね 気づかなかった・・・・
お礼
回答ありがとうございます。
- gimmick
- ベストアンサー率49% (134/270)
既に十分な回答が書かれているので補足だけ。 簡単に書くと、下記のコードとほぼ同じ事をやってます。 while (1) { *s = *t; if (*s == '\0') break; s++; t++; }
お礼
回答ありがとうございます。
- osamuy
- ベストアンサー率42% (1231/2878)
代入演算子=は代入値をその値としてます。 Cでは0以外なら真ですので、*tの値が0なら偽になります。 実際、 while ( *s++ = *t++ ){ は、gcc/x86だと以下のように展開されます: .L2: movb (%edx), %al movb %al, (%ecx) incl %edx incl %ecx testb %al, %al jne .L2 レジスタedxがポインタtで、レジスタecxがポインタsですので、 1) edxが指すメモリの内容をレジスタalにロード 2) alの内容をecxの指すメモリにストア 3) ecxを+1 4) edxを+1 5) alの内容をテスト 6) alの内容が0でなければ、L2にループ →即ち、0だったらwhileから抜ける。 ちなみに、PowerPCだとこんな感じ: L2: lbz r0,0(r11) addi r11,r11,1 extsb r2,r0 stb r0,0(r9) cmpwi cr7,r2,0 addi r9,r9,1 bne+ cr7,L2
お礼
回答ありがとうございます。 >Cでは0以外なら真ですので、*tの値が0なら偽になります。 良く分かりました。
- nagare
- ベストアンサー率33% (280/831)
while(1) { } と書くと無限ループになります これはOKですか? ということは、*s++=*t++の結果が1の場合にループします これはOKですか? *s++=*t++の結果なんですが、 1)*t++ 2)*s=1)の結果 3)*s++ 4)3)の結果が1であればループ です ☆while(*s++==*t++)の間違いじゃないですか?
お礼
while(1) { } と書くと無限ループになります >これはOKですか? OKです。 ということは、*s++=*t++の結果が1の場合にループします >これはOKですか? OKです。 >*s++=*t++の結果なんですが、 >1)*t++ >2)*s=1)の結果 >3)*s++ >4)3)の結果が1であればループ >です 済みません。ここの説明が良くわかりません。 >☆while(*s++==*t++)の間違いじゃないですか? K&Rに載ってるそうです。 /* strcpy:tをsにコピーする */ void strcpy(char *s, char *t) { while(*s++=*t++) ; }
お礼
回答ありがとうございます。 大変良く分かりました。