C++和 PHP 与 C# 和 Java - 结果不相等
我在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的原因。
有人在这里,谁有其他版本?