28426


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


CC BY-SA 3.0
2016-08-22T06:29:28.317
28425
2016-08-22T23:33:33.180
2016-08-22T23:33:33.180
5044
18547
question
java c
JavaとCの演算子評価順序の違いについて


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

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

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

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


CC BY-SA 3.0
2016-08-22T07:19:41.133
28426
2016-08-22T07:30:37.707
2016-08-22T07:30:37.707
16900
16900
28425
answer


C言語についてですが、式の評価順序は実装依存となっていてequal / not equalどちらにもなり得ます。equalが得られたのは一例にすぎません。

そのため各種コンパイラーは警告を出します。

[code]

    GCC
    prog.c:4:13: warning: operation on 'a' may be undefined [-Wsequence-point]
        if(a == ++a)
                ^
    
    clang
    prog.c:4:13: warning: unsequenced modification and access to 'a' [-Wunsequenced]
        if(a == ++a)
           ~    ^
    
[/code]

（Visual C++は警告を出さないようです。）


CC BY-SA 3.0
2016-08-22T22:12:39.150
28437
2016-08-22T22:12:39.150
4236
28425
answer