No.3ベストアンサー
- 回答日時:
> 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
No.5
- 回答日時:
寝ぼけてたのか、間違いを書いてました
訂正しますね
誤:*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を使わない方法だったんですね
気づかなかった・・・・
No.4
- 回答日時:
既に十分な回答が書かれているので補足だけ。
簡単に書くと、下記のコードとほぼ同じ事をやってます。
while (1) {
*s = *t;
if (*s == '\0') break;
s++;
t++;
}
No.2
- 回答日時:
代入演算子=は代入値をその値としてます。
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
No.1
- 回答日時:
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++)
;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 While there will always be a certain amount of cri 2 2023/04/02 16:14
- 英語 Various natural and synthetic barrier membranes ha 3 2022/11/30 17:08
- 英語 Osteogenesis in group B and C were significantly l 2 2022/03/24 05:27
- 英語 (前文)-turning up the volume on the bicycle trend wh 1 2023/02/08 15:57
- その他(プログラミング・Web制作) FANUC(Series 0)のNCプログラムにて、下記のようなWhile文のネスト構造にすることは 1 2023/07/20 20:41
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- 英語 接続詞Whileを主語、動詞無しで使えるのでしょうか? 参考書に次の文がありました。 We shou 3 2023/01/30 06:08
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Ruby プログラミング 3 2023/06/09 14:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
vb.netからエクセル関数書き込み
-
vb.netです。2次元配列の要素を...
-
プログラミングについて。 1つ...
-
DoEventsが必要な理由について
-
流れ図(フローチャート)が分か...
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
範囲指定したセルを1つずつ飛...
-
GIFアニメをループさせたくない
-
ループ内での条件処理
-
vbscriptでIE自動入力(途中で...
-
javaのループ処理の結果を足し...
-
スレッド起動したフォームを正...
-
VB2010でCSVファイルの読み込み
-
UWSCの終了の仕方
-
イベントの発生を待つ
-
DOSコマンドのループ内のTIMEコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vbscriptでIE自動入力(途中で...
おすすめ情報