JavaとCの演算子評価順序の違いについて


Javaの初学者です。

以下のCとJavaのプログラムで実行結果が異なります。  
何が原因なのでしょうか。  
原因に関連するキーワードなど教えていただきたいです。  
よろしくお願いします。

・Javaのコード

[code]

    int a = 0;
    if(a == ++a)
    {
        System.out.println("equal");
    }else{
        System.out.println("not equal");
    }
    
[/code]

実行結果  
not equal

Cのコード

[code]

    int a = 0;
    if(a == ++a)
    {
        printf("equal\n");
    }else{
        printf("not equal\n");
    }
    
[/code]

実行結果  
equal




Javaは仕様で左辺を評価してから右辺を評価する、と決まっていたはずです。  
よって常に`a == ++a`はaとそれよりも1大きい値と比較されるので偽です。

一方Cはどちらの評価が先かは未定義であったと思います。  
左辺が先であればJavaと同じになりますし、右辺が先に評価された場合は`a ==
++a`はaをインクリメントしてからその値自身と比較するので常に真となります。

実際gccでコンパイルしたところ、結果は`not
equal`となり、他の手軽なWebサイト上のインタープリターでやってみたところ`equal`と異なる結果となりました。

(根拠となる仕様の参照先とかは、Cの方はどなたかフォローしてくれると嬉しいです)




Javaは仕様で左辺を評価してから右辺を評価する、と決まっていたはずです。  
よって常に`a == ++a`はaとそれよりも1大きい値と比較されるので偽です。

一方Cはどちらの評価が先かは未定義であったと思います。  
左辺が先であればJavaと同じになりますし、右辺が先に評価された場合は`a ==
++a`はaをインクリメントしてからその値自身と比較するので常に真となります。

実際gccでコンパイルしたところ、結果は`not
equal`となり、他の手軽なWebサイト上のインタープリターでやってみたところ`equal`と異なる結果となりました。

(根拠となる仕様の参照先とかは、Cの方はどなたかフォローしてくれると嬉しいです)

