将JS逻辑转换为C#时返回值偏差10的问题排查求助
问题分析与解决
首先咱们先把这段JavaScript函数的逻辑拆解清楚,它用了逗号运算符和短路逻辑,看起来有点绕,其实展开后是这样的:
function rir(t, e, c, n) { // 只有当t在(e, c]这个区间时,才执行调整逻辑 if (t > e && t <= c) { // 给t加上n对(c-e)取模的结果(避免超出区间太多) t += n % (c - e); // 如果加完后t超过了c,就把它循环回[e, c)区间 if (t > c) { t = t - c + e; } } // 不管有没有调整,最终返回t return t; }
你说转换后的C#方法返回值始终比JS少10,那大概率是转换时某个细节没对齐,我猜可能是这几个原因:
- 运算符或赋值方向搞反了:比如把
t += ...写成了t -= ...,或者调整t的公式写错了(比如把t - c + e写成了c - t + e)。如果刚好你的n%(c-e)结果是10,那t -=10就会直接少10。 - 类型处理不一致:JS会自动把字符转成ASCII码数值计算,比如你传入
t='a',JS会当成97来算。但C#里如果用char类型直接运算,虽然也会按ASCII处理,但如果返回时没正确转成数值,或者参数类型没对应上,也可能出问题。 - 短路逻辑的误解:JS里
&&是短路求值,前面条件不满足就不会执行后面的赋值。如果你在C#里把整个逻辑写成了返回&&表达式的结果(而不是返回t),那结果肯定不对,但这种情况差距会很大,不太像只少10。
下面是和JS逻辑完全对齐的C#实现,不管你传入的是数值还是字符都能正确工作:
针对数值类型的实现
public static int Rir(int t, int e, int c, int n) { if (t > e && t <= c) { int mod = n % (c - e); t += mod; if (t > c) { t = t - c + e; } } return t; }
针对字符类型的实现(自动处理ASCII码)
public static char Rir(char t, char e, char c, int n) { int tVal = t; int eVal = e; int cVal = c; if (tVal > eVal && tVal <= cVal) { int mod = n % (cVal - eVal); tVal += mod; if (tVal > cVal) { tVal = tVal - cVal + eVal; } } return (char)tVal; }
你可以对比一下你的C#代码,看看是不是上面说的某个细节出错了。比如如果你的调用是rir(97, 87, 97, 10),正确返回应该是97,要是你把t += mod写成t -= mod,就会得到87,刚好比正确值少10,这很符合你说的情况。
内容的提问来源于stack exchange,提问作者Fletcher
相关产品推荐
相关产品推荐

