Ошибка при пропуске точки с запятой - может кто-нибудь объяснить, почему?

Может кто-нибудь объяснить, почему, если я опущу точку с запятой в строке while(nums[right-1] == nums[right--]);что я получаю синтаксическую ошибку? Я вообще понимаю точку с запятой, но почему именно эта строка, а не другие?

var threeSum = function(nums) {
    nums.sort((a,b)=>a-b);
    let result = [];
    for (let i=0;i<nums.length;i++) {
        let t = -nums[i];
        let left = i+1, right = nums.length-1;
        while(left < right) {
            if (nums[left] + nums[right] == t) {
                result.push([nums[i], nums[left], nums[right]]);
                while(nums[left+1] == nums[left++]);
                while(nums[right-1] == nums[right--]);
            } else if (nums[left]+nums[right] < t) left++;
            else right--;
        }
        while(nums[i+1]==nums[i]) i++
    }

    return result;

};

2 ответа

Решение

Циклу нужно что-то перебрать. В основном либо оператор, либо блок кода. Например:

while (something) {
  this.isInACodeBlock();
}

или:

while (something)
  this.isAStatement();

Имейте в виду, что заявление может быть запретным. Сама по себе точка с запятой служит этой цели. И поскольку возврат каретки не имеет значения для языка, это цикл с оператором:

while (something);

Сделав шаг вперед, этот цикл находится внутри блока кода, который заканчивается сразу после цикла:

if (somethingElse) {
  while (something)
}

Если бы после whileцикл, тогда это будет синтаксически правильным, даже если поведение является неожиданным или ошибочным. Но есть закрывающая фигурная скобка.

Итак, интерпретатор ожидает либо оператор, либо открывающий блок, но встречает закрывающий блок. Это ошибка.

Хорошее объяснение от @David, я добавлю, что, чтобы избежать этой ошибки, вам следует подумать о том, чтобы следовать руководству по стилю, например airbnb. Сделайте ваш код более удобным для чтения.

Способ добиться этого: заменить ++ по +=. Прокомментируйте основные части вашего кода... и т. Д.

Хороший код - это код, который вы можете понять, прочитав его. Я должен был понять чтоthreeSums функция делает и почему вы выполняете диссертации while просто взглянув на это.

// the function do blabla
function threeSums(nums) {
  nums.sort((a, b) => a - b);

  const result = [];

  for (let i = 0; i < nums.length; i += 1) {
    // what is t?
    const t = -nums[i];

    let left = i + 1;
    let right = nums.length - 1;

    while (left < right) {
      // what is the case covered by this if?
      if (nums[left] + nums[right] == t) {
        result.push([
           nums[i],
           nums[left],
           nums[right],
        ]);

        while (nums[left + 1] == nums[left]) {
          left += 1;
        }

        while (nums[right - 1] == nums[right]) {
          right -= 1
        }
      } else if (nums[left] + nums[right] < t) {
        left += 1;
      } else {
        right -= 1;
      }
    }

    while (nums[i + 1] == nums[i]) {
      i += 1;
    }
  }

  return result;
};
Другие вопросы по тегам