语言如何处理复合运算符的副作用?

Kos*_*Kos 8 javascript c c++ programming-languages undefined-behavior

假设这样的情况:

int a = (--t)*(t-2);
int b = (t/=a)+t;
Run Code Online (Sandbox Code Playgroud)

在C和C++中,这是未定义的行为,如下所述:未定义的行为和序列点

但是,这种情况如何:

  • JavaScript中,
  • Java中,
  • PHP ...
  • C#
  • 那么,还有其他任何有复合算子的语言吗?

我正在修复一个Javascript - > C++端口,现在很多地方都没有注意到它.我想知道其他语言通常如何处理这个问题...保留命令undefined以某种方式特定于C和C++,不是吗?

Nul*_*Set 7

根据ECMA脚本规范,我认为javascript应该符合,在乘法和加法语句中,它在评估右侧之前评估左侧.(见11.5和11.6).我认为这意味着代码应该相当于

t = t - 1;
int a = t * (t - 2);
t = t / a;
int b = t + t;
Run Code Online (Sandbox Code Playgroud)

但是,您不应始终相信规范与实现相同!

在这种令人困惑的情况下,最好的办法是尝试对原始操作环境中模糊的代码行进行各种输入,并尝试确定它在做什么.确保测试可以确认假设的案例,并测试可以伪造它的案例.

编辑:显然大多数JavaScript实现了ECMAScript的第3版,所以我改变了链接到该规范.