- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

D Edit

やっぱ、文字列が組み込みなのは、
余計なこと考えなくていいから楽でいいねー。

ただし、Delphiと違いcopy on writeを自動で行ってくれないので、
変更するときは、明示的なコピーが必要。
Delphiのつもりで、代入後、変更すると痛い目を見ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void main(char[][] argv)
{
  char[] s, s2;

  s = "Del";
  printf("s = %s\n", cast(char *)s);

  // 代入 & 汚染
  s2 = s;
  s2[0..2] = 'c';
  printf("汚染した s2 = %s\n", cast(char *)s2);

  // 汚染確認
  printf("汚染された s = %s\n", cast(char *)s);

  // ちゃんとしたコピー
  s = "Del";
  s2[] = s;
  s2[0..2] = 'c';
  printf("コピーした s2 = %s\n", cast(char *)s2);

  // 汚染されていないのを確認
  printf("汚染されていない s = %s\n", cast(char *)s);
  
  // 加算
  s ~= "phi";
  printf("加算した s = %s\n", cast(char *)s);

  // 比較
  if (s < "Java")
    printf("s < Java\n");
  else
    printf("s >= Java\n");
}

出力結果

s = Del
汚染した s2 = ccl
汚染された s = ccl
コピーした s2 = ccl
汚染されていない s = Del
加算した s = Delphi
s < Java

Delphi Edit

copy on writeが効くので、
:= で、代入後、変更しても元のに影響しない。
変更時にコピーされている。

それにしても、Delphiも文字列の比較が比較演算子でできるとは知らなかった。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
program main;

{$APPTYPE CONSOLE}
var
  s, s2: string;
begin
  s := 'Del';
  Writeln('s = ', s);

  // 代入(コピー) & 汚染
  // 文字列のindexは、1から始まるのに注意
  s2 := s;
  s2[1] := 'c';
  s2[2] := 'c';
  Writeln('汚染した s2 = ', s2);

  // 汚染されていない!
  Writeln('汚染されていない s = ', s);

  // 加算
  s := s + 'phi';
  Writeln('加算した s = ', s);

  // 比較
  if s < 'Java' then
    Writeln('s < Java')
  else
    Writeln('s >= Java');
end.

出力結果

s = Del
汚染した s2 = ccl
汚染されていない s = Del
加算した s = Delphi
s < Java



Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2005-07-06 Wed 19:29:39 JST (5271d)