「a += (a=5)」はどう処理すべき?

今の計算スクリプトだと

a = 0
a += (a=5)

は5になるんだけど、10の方がいいんだろうか。
Rubyでは5になった。Perlでは10に。他の言語の処理系でも試してみる。

      • -

というか、Perl

$a = 5;
print $a + ($a = 100);

も200になったりするのか。

      • -

BCCVC++

#include <stdio.h>

int main() {
	int a, b;
	a = 5;
	printf( "%d\n", a + (a = 100) );
	a = 5;
	printf( "%d\n", (a = 100) + a );
	b = 0;
	printf( "%d\n", b += (b = 5) );
}

両方をそれぞれC,C++で(計4パターン)試したけど全て同じ結果だった。

200
200
10
      • -

PHP

<?php

$a = 5;
echo ($a + ($a = 100)). "\n";
$a = 5;
echo (($a = 100) + $a). "\n";
$b = 0;
echo ($b += ($b = 5)). "\n";
200
200
10

まさか200と10になる方が多数派?

      • -

Java

class Test {
	public static void main( String args[] ) {
		int a, b;
		a = 5;
		System.out.println( a + (a = 100) );
		a = 5;
		System.out.println( (a = 100) + a );
		b = 0;
		System.out.println( b += (b = 5) );
	}
}
105
200
5

おお。

      • -

おっと、PerlRubyでもちゃんとした結果を示さないと。
Perl

$a = 5;
print($a + ($a = 100));
print "\n";
$a = 5;
print(($a = 100) + $a);
print "\n";
$b = 0;
print($b += ($b = 5));
200
200
10

Ruby

a = 5
puts(a + (a = 100))
a = 5
puts((a = 100) + a)
b = 0
puts(b += (b = 5))
105
200
5
      • -

D言語

import std.cstream;

void main() {
	int a, b;
	a = 5;
	dout.writefln( a + (a = 100) );
	a = 5;
	dout.writefln( (a = 100) + a );
	b = 0;
	dout.writefln( b += (b = 5) );
}
200
200
10
      • -

Javascript
IE, Firefox, Opera, Safariで同じ結果。

var a, b;
a = 5;
alert(a + (a = 100));
a = 5;
alert((a = 100) + a);
b = 0;
alert(b += (b = 5));
105
200
5
      • -

Perl

print( ($a = 5) + ($a = 100) ); #=>200

は。
これはさすがに105になると思っていたんだけど。マジで?
上に挙げた言語で(a = 5) + (a = 100)を試してみたけど、PerlVC++は200でBCCやその他は全て105だった。