アプリ版:「スタンプのみでお礼する」機能のリリースについて

while(*s++=*t++)において、どのような時が真あるいは偽なのですか?

今年もよろしくおねがいします。

A 回答 (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

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=267777
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

大変良く分かりました。

お礼日時:2004/01/04 21:16

寝ぼけてたのか、間違いを書いてました


訂正しますね

誤:*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を使わない方法だったんですね
気づかなかった・・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2004/01/04 21:18

既に十分な回答が書かれているので補足だけ。


簡単に書くと、下記のコードとほぼ同じ事をやってます。

while (1) {
  *s = *t;
  if (*s == '\0') break;
  s++;
  t++;
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2004/01/04 21:17

代入演算子=は代入値をその値としてます。


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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>Cでは0以外なら真ですので、*tの値が0なら偽になります。
良く分かりました。

お礼日時:2004/01/04 21:14

while(1)


{
}
と書くと無限ループになります
これはOKですか?

ということは、*s++=*t++の結果が1の場合にループします
これはOKですか?

*s++=*t++の結果なんですが、
1)*t++
2)*s=1)の結果
3)*s++
4)3)の結果が1であればループ
です

☆while(*s++==*t++)の間違いじゃないですか?
    • good
    • 0
この回答へのお礼

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++)
;
}

お礼日時:2004/01/04 08:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A