Когда в условии происходит это назначение? - PullRequest
1 голос
/ 02 февраля 2020

Я портирую некоторый код 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.

1 Ответ

2 голосов
/ 02 февраля 2020

Я полагаю, вы неправильно задали условие выхода l oop.

Оригинал:

while (maxIndex > 0 && max <= (candidateMax = vector.dot(vertices[maxIndex - 1])))

означало бы в Xojo примерно:

  ...
  if maxIndex > 0 then candidateMax = vector.Dot(Vertices(maxIndex - 1))
while (maxIndex > 0) and (max <= candidateMax)

В Вообще, вы можете перевести Java / C do ... while (b) в Xojo do ... loop until not (b).

В вашем случае это будет означать:

  ...
  if maxIndex > 0 then candidateMax = vector.Dot(Vertices(maxIndex - 1))
loop until not ( (maxIndex > 0) and (max <= candidateMax) )
...