Я портирую некоторый код Java на Xojo, который не имеет той же языковой конструкции, что и Java.
У меня есть ошибка в порту, и я думаю, что сузил ее на этот бит Java кода:
int maxIndex = 0;
int n = vertices.length; // vertices is an array
double max = dot(vertices[0]), candidateMax; // I'm assuming `candidateMax` is being initialised to 0 here.
if (max < (candidateMax = vector.dot(vertices[1]))) {
// Search to the right
do {
max = candidateMax;
maxIndex++;
} while ((maxIndex + 1) < n && max < (candidateMax = vector.dot(vertices[maxIndex + 1])));
} else if ( max < (candidateMax = vector.dot(vertices[n - 1])) ) {
maxIndex = n;
// Search to the left
do {
max = candidateMax;
maxIndex--;
} while (maxIndex > 0 && max <= (candidateMax = vector.dot(vertices[maxIndex - 1])));
}
return maxIndex;
Я перенес его на этот код (Xojo - более подробный, чем код выше):
Var maxIndex As Integer = 0
Var n As Integer = Vertices.Count
Var max As Double = vector.Dot(Vertices(0))
Var candidateMax As Double
candidateMax = vector.Dot(Vertices(1))
If max < candidateMax Then
// Search to the right.
Do
max = candidateMax
maxIndex = maxIndex + 1
// Exit?
If maxIndex + 1 >= n Then
Exit
Else
candidateMax = vector.Dot(Vertices(maxIndex + 1))
If max > candidateMax Then Exit
End If
Loop
Else
candidateMax = vector.Dot(Vertices(n - 1))
If max < candidateMax Then
maxIndex = n
// Search to the left.
Do
max = candidateMax
maxIndex = maxIndex - 1
// Exit?
If maxIndex <= 0 Then
Exit
Else
candidateMax = vector.Dot(Vertices(maxIndex - 1))
If max > candidateMax Then Exit
End If
Loop
End If
End If
Return maxIndex
Я предполагаю условное выражение while
l oop:
if (max < (candidateMax = vector.dot(this.vertices[1]))) {
// Search to the right
do {
max = candidateMax;
maxIndex++;
} while ((maxIndex + 1) < n && max < (candidateMax = vector.dot(vertices[maxIndex + 1])));
переводится как: «Выполните содержимое l oop хотя бы один раз. После каждой итерации l oop проверьте, не maxIndex + 1
меньше n
. Если нет, выйдите из l oop. Если maxIndex + 1
больше n
, присвойте результат метода vector.dot
candidateMax
и проверьте, max
меньше candidateMax
. Если это так, продолжайте повторять ".
Это правильно? Я думаю, что неправильно интерпретирую порядок оценки условного выражения while
.