同一个算法写的,为啥C语言和Java的结果不一样

同一个算法写的,为什么C语言和Java的结果不一样啊
Java code
public class Test{

    public static int sum=0;
    public static void main(String[] arg)
    {
            System.out.print(fun(5));
    }
    public static int fun(int n) {

        if (n == 1)
            return 1;
        else
            sum += fun(n - 1);

        return sum;
    }


C/C++ code
#include<stdio.h>
int sum=0;
int fun(int n) {

        if (n == 1)
            return 1;
        else
            sum += fun(n - 1);

        return sum;
    }

int main()
{
    printf("%d",fun(5));
    
    return 0;
}


java程序的结果是1,C程序的结果是8,为什么啊?
我认为结果应该是8,难道Java的写得有问题?

------解决方案--------------------
有意思的问题,尝试了好久(周末都没了),没有解决,后来在 * 上发了个帖子询问,终于有了答案。

帖子地址:
http://*.com/questions/11813692/java-recursion-bug-i-am-going-crazy/11813707#11813707

就不翻译成中文了,楼主自己看吧,希望楼主可以理解,Good Luck!
------解决方案--------------------
问题还是出在这个表达式上:sum += fun(n - 1);
后面的fun(n-1)在计算时含有sum,算下来成这样的表达式:
sum=sum+++sum+++sum+++sum++;java编译器有自己的计算顺序,它可以在计算之前把sum装入了寄存器,等fun(n-1)返回把结果一加,再存入sum,那结果就离题太远了;
而C编译器也并无规定变量的计算顺序。
这,就是差别。
答案就是将这个语句拆开。else后的语句分拆成这样:
C/C++ code
else{
            int i=fun(n-1);
            sum +=i;
            }