编译器如何评估数学表达式?

Ahm*_*hem 2 c java compiler-construction

我正在阅读这个问题,然后我做了以下内容.

a = b + (c - (b = c)) + (a - (c = a))
Run Code Online (Sandbox Code Playgroud)

我在C和Java中尝试过.它适用于java,但不适用于C.

当然,这取决于编译器如何评估这些表达式,在谷歌搜索之后,我找不到答案.

Mys*_*ial 7

它在C中不起作用的原因是因为C没有准确指定何时c = a发生.它可以在该语句中引用的另外两次之前或之后发生.

因此,根据编译器何时决定执行赋值c = a,表达式的值会有所不同.它没有定义.

即如果b = c 在此之前进行评估c = a,b则将采用原始值c.如果在之后进行评估,那么它将取值a.