極悪です。
>#include <stdio.h>
>void
>sub(int &a, int &b, int &c)
>{
> printf("%d:%d:%d\n", a, b, c);
>}
>
>int
>main()
>{
> int i = 1;
>
> sub(++i, ++i, ++i);
>
> //i = 1;
> //sub(i++, i++, i++); ←これはコンパイルエラー
>
> return 0;
>}
>
>というC++プログラムを作ってコンパイルしたところ、
>
>4:4:4
>
>という出力になりました。
sub(i++, i++, i++); は gcc と cl はエラーになったけど、
bcc と Digital Mars(cl.exe)では通ってしまった。しかも
Digital Mars は結果が変。
試しに
#include <stdio.h>
void
sub(int &a){
a = 100;
printf("%d:",a);
}
int
main()
{
int x;
x = 0; printf("sub( x ) %d:",x); sub( x ); printf("%d\n",x);
x = 0; printf("sub(x+0) %d:",x); sub(x+0); printf("%d\n",x);
x = 0; printf("sub(x++) %d:",x); sub(x++); printf("%d\n",x);
x = 0; printf("sub(++x) %d:",x); sub(++x); printf("%d\n",x);
return 0;
}
を試すと、
D:% bcc32 inc4.cpp & inc4
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
inc4.cpp:
警告 W8030 inc4.cpp 14: 'a' パラメータ(sub(int &))のために一時変数を使用する(関数 main() )
警告 W8030 inc4.cpp 15: 'a' パラメータ(sub(int &))のために一時変数を使用する(関数 main() )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
sub( x ) 0:100:100
sub(x+0) 0:100:0
sub(x++) 0:100:1
sub(++x) 0:100:100
D:% cl.exe inc4.cpp & inc4
sc -Jm -w inc4.cpp -mn
link inc4,,,user32+kernel32/noi;
sub( x ) 0:100:100
sub(x+0) 0:100:0
sub(x++) 0:100:1
sub(++x) 0:100:1
D:%
Digital Mars は ++i のときもオブジェクトのコピーを
作ってる模様。
--
極悪, FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?