Indexing 为什么对递归调用中的字符串进行索引会产生不同的结果?

Indexing 为什么对递归调用中的字符串进行索引会产生不同的结果?,indexing,slice,d,Indexing,Slice,D,在编辑测距仪的简单实现中,我必须检查两个字符串的最后一个字符是否匹配: ulong editDistance(常量字符串a、常量字符串b){ 如果(a.length==0) 返回b.length; 如果(b.length==0) 返回a.length; 常数自动增量=a[$-1]==b[$-1]?0:1; 导入标准算法:min; 返回最小值( 编辑距离(a[0..$-1],b[0..$-1])+delt, 编辑距离(a,b[0..$-1])+1, 编辑距离(a[0..$-1],b)+1 ); }

在编辑测距仪的简单实现中,我必须检查两个字符串的最后一个字符是否匹配:

ulong editDistance(常量字符串a、常量字符串b){
如果(a.length==0)
返回b.length;
如果(b.length==0)
返回a.length;
常数自动增量=a[$-1]==b[$-1]?0:1;
导入标准算法:min;
返回最小值(
编辑距离(a[0..$-1],b[0..$-1])+delt,
编辑距离(a,b[0..$-1])+1,
编辑距离(a[0..$-1],b)+1
);
}
这会产生预期的结果,但如果我用其定义替换
delt
,则非空字符串总是返回1:

ulong editDistance(常量字符串a、常量字符串b){
如果(a.length==0)
返回b.length;
如果(b.length==0)
返回a.length;
//常数自动增量=a[$-1]==b[$-1]?0:1;
导入标准算法:min;
返回最小值(
editDistance(a[0..$-1],b[0..$-1])+a[$-1]==b[$-1]?0:1,//delt,
编辑距离(a,b[0..$-1])+1,
编辑距离(a[0..$-1],b)+1
);
}
为什么这个结果会改变?

运算符的优先级与您期望的不同。在
const auto delt=a[$-1]==b[$-1]中?0 : 1;没有歧义,但在
编辑距离(a[0..$-1],b[0..$-1])+a[$-1]==b[$-1]?0:1
,有(看起来)

简化:

auto-tmp=editDistance2(a[0..$-1],b[0..$-1]);
返回最小值(tmp+a[$-1]==b[$-1]?0:1),
//...
);
这里有趣的部分被解析为
(tmp+a[$-1])==b[$-1]?0:1
,并且
tmp+a[$-1]
不等于
b[$-1]
。解决方案是用括号括起来:

editDistance(a[0..$-1],b[0..$-1])+(a[$-1]==b[$-1]?0:1)