Я нашел что-то странное в С# и Java. Давайте посмотрим на этот код на С++:
#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 С++).
Теперь посмотрим на тот же код на С#:
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 С# Я знаю, что вы сейчас думаете: "Как это возможно?", Но отпустите следующий код.
Код 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());
}
}
Результат будет таким же, как в С# (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 (посмотрите на результат здесь).
У меня есть небольшая теория - эти языки (С# и Java) создают локальную копию статической переменной X в стеке (игнорируют ли это ключевое слово static?). И это причина, по которой результатом этих языков является 1.
Кто-нибудь здесь, у кого есть другие версии?