C# と Java で少し奇妙なことがわかりました。この C++ コードを見てみましょう。
#include <iostream>
using namespace std;
class Simple
{
public:
static int f()
{
X = X + 10;
return 1;
}
static int X;
};
int Simple::X = 0;
int main() {
Simple::X += Simple::f();
printf("X = %d", Simple::X);
return 0;
}
コンソールに X = 11 と表示されます (ここで結果を見てください - IdeOne C++ )。
次に、C# で同じコードを見てみましょう。
class Program
{
static int x = 0;
static int f()
{
x = x + 10;
return 1;
}
public static void Main()
{
x += f();
System.Console.WriteLine(x);
}
}
コンソールには 1 (11 ではありません!) が表示されます (ここで結果を見てください - IdeOne C# 今あなたが何を考えているかはわかります - 「どうしてそんなことができるの?」ということですが、次のコードに進みましょう。
Java コード:
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static int X = 0;
static int f()
{
X = X + 10;
return 1;
}
public static void main (String[] args) throws java.lang.Exception
{
Formatter f = new Formatter();
f.format("X = %d", X += f());
System.out.println(f.toString());
}
}
結果は C# と同じです (X = 1、結果はこちらをご覧ください)。
最後に、PHP コードを見てみましょう。
<?php
class Simple
{
public static $X = 0;
public static function f()
{
self::$X = self::$X + 10;
return 1;
}
}
$simple = new Simple();
echo "X = " . $simple::$X += $simple::f();
?>
結果は 11 です (結果はこちらをご覧ください)。
私にはちょっとした理論があります - これらの言語 (C# と Java) は、スタック上に静的変数 X のローカル コピーを作成しています (それらはstaticキーワードを無視していますか?)。それが、これらの言語での結果が 1 である理由です。
他のバージョンを持っている人はいますか?