June29,2023补充两个大佬的解答:A:例如,在形如x=f()+g();的语句中,f()可以在 g()之前计算,也可以在 g()之后计算。因此,如果函数 f或g改变了另一个函数所使用的变量,那么 x 的结果可能会依赖于这两个函数的计算顺序。为了保证 特定的计算顺序,可以把中间结果保存在临时变量中 。函数调用、嵌套赋值语句、自增与自减运算符都有可能产生"副作用’--在对表达式 求值的同时,修改了某些变量的值。在有副作用影响的表达式中,其执行结果同表达式中的 变量被修改的顺序之间存在着微妙的依赖关系,下列语句就是一个典型的令人不愉快的情况:a[i]=i++;问题是·数细下标;是引用旧值还是引用新值?对这种情况编译器的解释可能不同,并因此 产生不同的结果。C 语言标准对大多数这类问题有意未作具体规定。表达式何时会产生这种副 作用(对变量赋值),将由编译器决定,因为最佳的求值顺序同机器结构有很大关系-C程序设计语言 第2版。B:是的 主要是由于这些副作用,代码到真正的机器执行运行,中间还有个编译器在帮你做一些修改,编译器会决定一些不明确行为到底应该怎么做最合适。一些支持函数式编程的语言就在尽量避免这个问题,一切皆表达式,每个表达式都有一个对应确定的类型。