「a += (a=5)」はどう処理すべき?
今の計算スクリプトだと
a = 0 a += (a=5)
は5になるんだけど、10の方がいいんだろうか。
Rubyでは5になった。Perlでは10に。他の言語の処理系でも試してみる。
-
-
- -
-
というか、Perlは
$a = 5; print $a + ($a = 100);
も200になったりするのか。
-
-
- -
-
#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になる方が多数派?
-
-
- -
-
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
おお。
-
-
- -
-
おっと、PerlとRubyでもちゃんとした結果を示さないと。
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
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
-
-
- -
-
print( ($a = 5) + ($a = 100) ); #=>200
は。
これはさすがに105になると思っていたんだけど。マジで?
上に挙げた言語で(a = 5) + (a = 100)を試してみたけど、PerlとVC++は200でBCCやその他は全て105だった。