嵌套括号求值顺序(深度优先vs左到右)及BackInOut函数变量疑问
嵌套括号的求值顺序——深度优先与从左到右
以下为相关代码:
public static float BackInOut(float from, float to, float time) { const float s = 1.70158f * 1.525f; to -= from; if ((time /= .5f) < 1f) return to * .5f * (time * time * ((s + 1f) * time - s)) + from; return to * .5f * ((time -= 2) * time * ((s + 1f) * time + s) + 2f) + from; }
技术问询解答
咱们直接针对你问的第二个return语句拆解分析:
return to * .5f * ((time -= 2) * time * ((s + 1f) * time + s) + 2f) + from;
在C#中,表达式的求值顺序是严格从左到右执行的,所以这里的time变量是先完成修改,之后所有用到time的地方都是修改后的值,不存在“修改前后同时被使用”的情况:
- 第一步执行
time -= 2:这个复合赋值操作会先读取time当前的原值,减去2后把结果重新赋值给time,同时这个表达式的返回值就是更新后的time数值。 - 后续所有出现
time的位置(比如* time、(s + 1f) * time),引用的都是已经完成-=2修改后的新值。
简单总结:这条语句里time的修改是一次性完成的,之后的所有计算都基于修改后的数值,不会再用到修改前的time值。
内容的提问来源于stack exchange,提问作者Rakka Rage
相关产品推荐
相关产品推荐

