プロが教える店舗&オフィスのセキュリティ対策術

C言語で
*dest++ = *src++;
と書かれてあるのですが、
これは、どう考えればよいですか?

A 回答 (4件)

これは「メモリの内容を連続してコピーする時の慣用表現」です。


「dest」は destination の略で、データのコピー先を表す時によく使われます。
また「src」は source の略で、データのコピー元を表す時によく使われます。

それぞれの演算子の評価順についてですが、これは「演算子の優先順位」と「演算子の結合規則」に従って解決されます。
(「C言語 演算子 優先順位 結合規則」で検索すれば、結構ヒットします。)

まずは優先順位の高いものから評価します。
優先順位とは、例えば「加算と乗算が混じっている式では、乗算が優先される」というようなことです。
問題の式の中では * と ++ は同一の優先順位を持ち、= はそれより低くなっています。
ですので、代入より先に「*dest++」と「*src++」が評価されます。

ちなみに = の前後(「*dest++」と「*src++」)の評価順については規定されておらず、結果は処理系に依存します。
(どちらが先に評価されるかは不定なので、この評価順に影響されるようなコードを書いてはいけません。)

次に dest や src にくっついている * と ++ の評価順ですが、このような同一の優先順位を持つ演算子同士の評価は、結合規則に従います。
結合規則とは、例えば「乗算と除算が続いている場合、左から順に計算する」というようなことです。
(このような「左から右」の規則以外に、「右から左」という規則があります。)
* と ++ の結合規則は、ともに「右から左」です。(同一優先順位の演算子は、同じ結合規則を持ちます。)
なので、例えば dest に着目した場合、まず右側の ++ と結合して評価され、その後 * と結合して評価されます。

よって、最終的には、
  (*(dest++)) = (*(src++));
という順で評価されます。

ただし、++ が最初に評価されていても、実際にインクリメント処理が行われるのは「式全体が評価された後」、つまり代入が行われた後です。
* より先に ++ が評価されたことで、「++ が作用するのは *dest ではなく、dest である」ということが決定されるのです。
    • good
    • 0
この回答へのお礼

本当によく分かりました。助かりました。ありがとうございました。

お礼日時:2002/05/13 09:33

#include <iostream.h>



main( ) {

 char *src = "abcde";
 char d[50];

 d[0] = src[0]; // d[0] = 'a';
 d[1] = src[1]; // d[1] = 'b';

 d[2] = 0;

 cout << d; // ab

}

////////////////////////////////////////

#include <iostream.h>

main( ) {

 char *src = "abcde";
 char d[50];

 char *dest = d;

 *dest = *src; // d[0] = src[0];

 *dest++; // *dest = d[1];
 *src++; // *src = src[1];

 *dest = *src; // d[1] = src[1];

 *++dest = 0; // d[2] = 0;

 cout << d; // ab

}

////////////////////////////////////////

#include <iostream.h>

main( ) {

 char *src = "abcde";
 char d[50];

 char *dest = d;

 *dest++ = *src++; // d[0] = src[0]; その後添え字に1を足す
 *dest++ = *src++; // d[1] = src[1];

 *dest = 0; // d[2] = 0;

 cout << d; // ab

}

////////////////////////////////////////
    • good
    • 0
この回答へのお礼

参考にさせていただきました。ありがとうございました。

お礼日時:2002/05/13 09:34

ポインタsrcが示す場所のデータをポインタdestが示す場所にコピーし、その後でポインタsrcとポインタdestをインクリメントしています。



forループなどの中で使って配列/文字列をコピーしたりするときに使います。
    • good
    • 0
この回答へのお礼

参考にさせていただきました。ありがとうございました。

お礼日時:2002/05/13 09:35

*dest = *src;


dest++;
src++;
きっと,例えば,src[n], dest[n]を用意してあって,
その中身をコピーする場合などですね.
    • good
    • 0
この回答へのお礼

参考にさせていただきました。ありがとうございました。

お礼日時:2002/05/13 09:35

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