JavaScript在-/递减中的逻辑是什么?有人能澄清一下吗?
++增量JavaScript在-/递减中的逻辑是什么?有人能澄清一下吗?,javascript,Javascript,++增量 x = ++y // When y = 6 x = 6 x = y++ // And y = 6 x = 5 x = --y // When y = 4 x = 4 x = y-- // When y = 4 x = 5 --减量 x = ++y // When y = 6 x = 6 x = y++ // And y = 6 x = 5 x = --y // Whe
x = ++y // When y = 6 x = 6
x = y++ // And y = 6 x = 5
x = --y // When y = 4 x = 4
x = y-- // When y = 4 x = 5
--减量
x = ++y // When y = 6 x = 6
x = y++ // And y = 6 x = 5
x = --y // When y = 4 x = 4
x = y-- // When y = 4 x = 5
有人能澄清一下吗?
谢谢。唯一有点棘手的情况是:
x = --y // When y = 4 x = 4
之后您必须查看y
。如果在前面查看y
,您会看到5
前缀减量(--y
)和后缀减量(y--
)的基本规则是:
- 无论哪种方式,操作数(
在本例中)递减1。唯一的区别是该表达式(y
或--y
)的结果是什么y--
- 如果运算符在操作数(
)之前,则为“前缀”减量:减量发生在表达式的结果之前。因此,结果是递减后的--y
值y
- 如果运算符在操作数(
)之后出现,则它是一个“后缀”递减:递减发生在表达式的结果获得之后。因此,结果是递减之前的值y--
var x,y;
y=5;
log(“前缀减量前:y=“+y”);
x=--y;//结果是**减量后的**值
log(“前缀减量后:x=“+x+”,y=“+y”);
y=5;
log(“后缀减量前:y=“+y”);
x=y——;//结果是**减量之前**的值
log(“后缀减量后:x=“+x+”,y=“+y”)代码>
唯一稍微棘手的情况是:
x = --y // When y = 4 x = 4
之后您必须查看y
。如果在前面查看y
,您会看到5
前缀减量(--y
)和后缀减量(y--
)的基本规则是:
- 无论哪种方式,操作数(
y
在本例中)递减1。唯一的区别是该表达式(--y
或y--
)的结果是什么
- 如果运算符在操作数(
--y
)之前,则为“前缀”减量:减量发生在表达式的结果之前。因此,结果是递减后的y
值
- 如果运算符在操作数(
y--
)之后出现,则它是一个“后缀”递减:递减发生在表达式的结果获得之后。因此,结果是递减之前的值
示例:
var x,y;
y=5;
log(“前缀减量前:y=“+y”);
x=--y;//结果是**减量后的**值
log(“前缀减量后:x=“+x+”,y=“+y”);
y=5;
log(“后缀减量前:y=“+y”);
x=y——;//结果是**减量之前**的值
log(“后缀减量后:x=“+x+”,y=“+y”)代码>
当运算符位于变量前面时,它会在任何处理之前更改其值。当变量位于运算符之前时,值在处理后更改
y=++x
与以下内容相同:
x = x + 1;
y = x;
y = x;
x = x + 1;
并且y=x++
与:
x = x + 1;
y = x;
y = x;
x = x + 1;
当运算符位于变量之前时,它会在任何处理之前更改其值。当变量位于运算符之前时,值在处理后更改
y=++x
与以下内容相同:
x = x + 1;
y = x;
y = x;
x = x + 1;
并且y=x++
与:
x = x + 1;
y = x;
y = x;
x = x + 1;
在这两种情况下,y
将具有相同的最终值。唯一的区别在于表达式本身的返回值
++y
将在
递增后返回值
y++
将在 递增之前返回值
在这两种情况下,y
将具有相同的最终值。唯一的区别在于表达式本身的返回值
++y
将在
递增后返回值
y++
将在因为你的主要问题是: 背后的逻辑 这一部分的答案就是处理器。许多人已经有了
INC
和DEC
指令很长一段时间了,而且由于C是为了匹配处理器指令而创建的,因此人们认为拥有++
和--
等操作符将有助于优化某些代码
INC WORD [BP+4] ; increment value at address BP+4 by one
DEC WORD [SP+16] ; decrement value at address SP+16 by one
RISC处理器通常要求您使用ADD
和SUB
。在现代处理器中,结果几乎相同,因为这类指令的执行速度大大提高,特别是在指令缓存较大的情况下
Java和JavaScript是C语言的产物,因此继承了这些语言
具体而言,68000处理器的指令如下:
MOV.W D1, (A1)+ ; copy D1 at address A1, then increment A1 by size of D1
MOV.W D2, -(SP) ; decrement stack by size of D2, then copy D2 at address SP
其中包括指令中的隐藏增量(the+)和隐藏减量(the-)
在这些情况下,C与处理器行为完全匹配。你可以这样写:
*a1++ = d1;
*--sp = d2;
在汇编语言中,每一行就变成一条指令。请注意,与堆栈一起使用的++
和--
工作起来很有魅力:
*--sp = d1; // move the stack pointer, then save value on the stack
... // do some work
d1 = *sp++; // restore from the stack, then move the stack pointer back
这里我们想使用寄存器d1,所以我们将它保存在堆栈上,自动预减量完全按照需要工作。然后在离开函数之前,我们从堆栈中恢复,同样,自动后增量完全按照预期工作。英特尔处理器有专门的指令:PUSH
和POP
。但这是同一个概念
当然,用C++和其他面向对象语言(包括java和javcript),现在和我已经有了很大的发展。