作者: dune
日時: 2004/8/30(01:04)
極悪です。

>#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?