如果您有这样的for循环:
for(j = 0; j<=90; j++){}
工作正常。但是当你有这样的for循环时:
for(j = 0; j<=90; j+3){}
它不起作用。有人可以向我解释一下吗?
答案 0 :(得分:100)
这是因为j+3
不会更改j
的值。您需要将其替换为j = j + 3
或j += 3
,以便将j
的值增加3:
for (j = 0; j <= 90; j += 3) { }
答案 1 :(得分:39)
由于没有其他人真正解决Could someone please explain this to me?
我相信我会:
j++
是简写,它不是一个实际的操作(确实它确实是,但请耐心解释)
j++
实际上等于操作j = j + 1;
,除了它不是宏或内联替换的东西。这里有很多关于i+++++i
的操作以及这意味着什么的讨论(因为它可以解释为i++ + ++i
或(i++)++ + i
这将我们带到:i++
与++i
。它们被称为post-increment
和pre-increment
运算符。你能猜出他们为什么这么命名吗?重要的部分是它们如何用于作业。例如,您可以执行:j=i++;
或j=++i;
我们现在将进行示例实验:
// declare them all with the same value, for clarity and debug flow purposes ;)
int i = 0;
int j = 0;
int k = 0;
// yes we could have already set the value to 5 before, but I chose not to.
i = 5;
j = i++;
k = ++i;
print(i, j, k);
//pretend this command prints them out nicely
//to the console screen or something, it's an example
i,j和k的值是什么?
我会给你答案并让你解决它;)
i = 7, j = 5, k = 7;
这就是前后增量运算符的强大功能,以及使用它们的危险。但是,这是编写相同操作顺序的另一种方式:
// declare them all with the same value, for clarity and debug flow purposes ;)
int i = 0;
int j = 0;
int k = 0;
// yes we could have already set the value to 5 before, but I chose not to.
i = 5;
j = i;
i = i + 1; //post-increment
i = i + 1; //pre-increment
k = i;
print(i, j, k);
//pretend this command prints them out nicely
//to the console screen or something, it's an example
好的,现在我已经向您展示了++
运算符的工作原理,让我们来看看为什么它不适用于j+3
...还记得我之前怎么称它为“速记”?就是这样,请看第二个例子,因为在使用命令之前,有效编译器所做的事情(它比这更复杂,但这不是第一个解释)。因此,您会看到“展开的速记”包含i =
和i + 1
,这就是您的请求。
这可以追溯到数学。函数定义在f(x) = mx + b
或等式y = mx + b
的位置,所以我们称之为mx + b
...它肯定不是函数或等式。最多只是表达。所有j+3
都是表达式。没有赋值的表达式对我们没有好处,但它确实占用了CPU时间(假设编译器没有优化它)。
我希望能为您澄清一些事情,并为您提供一些提出新问题的空间。干杯!
答案 2 :(得分:9)
在您的示例中,j+=3
增加3。
(这里没什么好说的,如果它的语法相关我先建议谷歌搜索,但我是新来的,所以我可能是错的。)
答案 3 :(得分:7)
for(j = 0; j<=90; j = j+3)
{
}
j+3
不会将新值分配给j,添加j=j+3
会将新值分配给j,循环将向上移动3.
j++
就像在说j = j+1
,所以在这种情况下,您将新值分配给j,就像上面那样。
答案 4 :(得分:6)
更改
for(j = 0; j<=90; j+3)
到
for(j = 0; j<=90; j=j+3)
答案 5 :(得分:4)
应该是这样的
for(int j = 0; j<=90; j += 3)
但请注意
for(int j = 0; j<=90; j =+ 3)
或
for(int j = 0; j<=90; j = j + 3)
答案 6 :(得分:1)
您还可以将代码编写为
for(int i=0;i<n;i++)
{
//statements;
i=i+2;//cause you want to increment i by 3
}
答案 7 :(得分:0)
循环语句的“增量”部分必须更改索引变量的值才能生效。 “++ j”的缩写形式是“j = j + 1”。所以,正如其他答案所说的那样,增量的正确形式是“j = j + 3”,它没有像递增1那样简洁的简写。如你所知,“j + 3”实际上并没有改变j;这是一种表达,其评价无效。
答案 8 :(得分:0)
如果您有这样的for循环:
for(j = 0; j<=90; j++){}
在这个循环中,你使用java语言提供的简写,这意味着后缀运算符(use-then-change)等同于j = j + 1,因此更改的值被初始化并用于下一个操作。
for(j = 0; j<=90; j+3){}
在这个循环中,你只需要将值增加3但不将其初始化为j变量,因此j的值仍然会改变。
答案 9 :(得分:0)
for(j = 0; j<=90; j++){}
j ++表示j = j + 1,j值已经为0,现在我们加1,所以现在j + 1的和值为1,最后我们用和值(1)覆盖j值(0) 所以在这里我们将j值覆盖j + 1。因此,每次迭代j值都会增加1。
for(j = 0; j<=90; j+3){}
这里j + 3表示j值已经为0,现在我们加3,所以j + 3的总和变为3,但是我们不覆盖现有的j值。因此JVM要求程序员,您正在计算新值,但是在哪里将该值分配给变量(即j)。这就是为什么我们遇到编译时错误“ invalid AssignmentOperator”的原因。
如果我们不想将j值增加3,则可以使用以下任一方法。
for (int j=0; j<=90; j+=3) --> here each iteration j value will be incremented by 3.
for (int j=0; j<=90; j=j+3) --> here each iteration j value will be incremented by 3.
答案 10 :(得分:0)
只需尝试
for(int i=0; i<5; i=i+2){//value increased by 2
//body
}
OR
for(int i=0; i<5; i+=2){//value increased by 2
//body
}
答案 11 :(得分:0)
这只是语法错误。您只需将OFFSET X - 1
替换为j+3
或j=j+3
。
答案 12 :(得分:0)
for (let i = 0; i <= value; i+=n) { // increments by n
/*code statement*/
}
此格式适用于我将索引增加n
for (let i = 0; i <= value; i+=4) { // increments by 4
/*code statement*/
}
如果n = 4,它将增加4