省略分号时出错 - 有人可以解释为什么吗?
Error in omitting semicolon - can someone explain why?
有人可以解释为什么我在 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;
};
一个循环需要一些东西来循环。基本上是一个语句或一个代码块。例如:
while (something) {
this.isInACodeBlock();
}
或:
while (something)
this.isAStatement();
请记住,语句 可能是空操作。分号本身就是为了这个目的。由于回车 returns 对语言无关紧要,因此这是一个带有语句的循环:
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;
};
有人可以解释为什么我在 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;
};
一个循环需要一些东西来循环。基本上是一个语句或一个代码块。例如:
while (something) {
this.isInACodeBlock();
}
或:
while (something)
this.isAStatement();
请记住,语句 可能是空操作。分号本身就是为了这个目的。由于回车 returns 对语言无关紧要,因此这是一个带有语句的循环:
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;
};