java 中的递增运算符
increment operator in java
刚开始学习 java,很抱歉问这样一个武断和愚蠢的事情...但是我无法理解 java 中的增量运算符。
为什么这样做:
int a = 5;
int a = ++a;
System.out.println(a);
>>6
如果不是:
int a = ++5;
System.out.println(a);
>>Compilation error: Found value - Required variable.
这个运算符不应该像其他算术运算符一样工作吗?为什么这个特别需要一个变量?我的意思是 a = 5+1;
有效,为什么 a = ++5
无效?
有什么方法可以直接使用 ++
值吗?
答案是++x
改变x
的值,同时提供一个表达式结果。如果您尝试使用 ++5
.
,则无法更改 5 的值
如果你想要一个"one more than x
"的值,并且你不需要改变实际存储在x
中的值,那么通常的做法当然是[=15] =].
++x
不是 x + 1
的快捷方式,它是 x += 1
的快捷方式。也就是说,除了计算 x+1
之外,它还会将 x
的值递增 1。这意味着两件事:
x = ++x;
是多余的,因为 ++x;
本身已经完成了同样的事情。
++1
没有意义,因为您无法更改 1
的值 - 它是一个常量。
万一有人感兴趣...
我听到原始问题背后的微弱回声是 "Why is this operator here?"。答案涉及到一些计算历史。
Digital Equipment Corporation 创造了一种小型计算机——在当时(大约 1970 年),我们所知道的大多数 "computers" 都是 Big Iron,IBM 统治着计算世界,而 DEC 的小型计算机是新贵,没有分布广泛。我相信当时美国政府只从IBM购买了"computers",因此DEC称他们的机器为"programmable data processors"(PDP)。他们的 PDP 机器多年来一直是 16 位计算世界的领导者,尽管还有其他人。不到一百万美元就可以买到!
AT&T 的一些研究人员可以使用他们的早期机器;这些机器没有太多的操作系统或软件,研究人员开发了一种语言(名为 C)和操作系统(Unix)。
从早期命名为 'a' 和 'bcpl' 的语言开始,研究人员正在开发一种 "system" 语言,一种 "structured assembler" -- 它不是,也不意味着是一种 'high-level' 语言,而是一种可用于为这些更小、更慢的机器编写高效代码的语言,允许在低于 FORTRAN 和 COBOL 的水平上控制代码大小和速度,但具有编程结构高于汇编程序。
PDP 机器的寻址模式允许使用一个寄存器指向内存块的开头,另一个寄存器指向第一个寄存器的 'index'(偏移量)。当然,代码遍历数组(比方说指针)是很常见的,依次对数组中的每个元素执行某些操作。因此,机器语言中有一种寻址模式,允许从数组的 'current' 元素中的位置获取内存中的值,同时递增索引,所有这些都在一条机器语言指令中完成。
因此 C 语言的开发人员将这种自动递增和自动递减构建到语言中,使编译器编写者有机会使用寻址模式从 C 代码生成比其他方式更高效的机器代码。并且运算符从C继承到Java,大量借鉴了C的语法和运算符用法
因为 ++i 是一个 prefix increment ,它自增 1 然后使用 [=17= 的新值]i 在表达式中,但是 i++ 是 postfix increment 这实际上是:使用 的当前值i 然后将它增加 1。这里有一些例子可以更好地理解它:
public static void main(String [] args){
int a = 3;
int b = 5;
System.out.println(++a);
System.out.println(b++);
System.out.println(b);
}
这是输出:
- 4
- 5
- 6
刚开始学习 java,很抱歉问这样一个武断和愚蠢的事情...但是我无法理解 java 中的增量运算符。
为什么这样做:
int a = 5;
int a = ++a;
System.out.println(a);
>>6
如果不是:
int a = ++5;
System.out.println(a);
>>Compilation error: Found value - Required variable.
这个运算符不应该像其他算术运算符一样工作吗?为什么这个特别需要一个变量?我的意思是 a = 5+1;
有效,为什么 a = ++5
无效?
有什么方法可以直接使用 ++
值吗?
答案是++x
改变x
的值,同时提供一个表达式结果。如果您尝试使用 ++5
.
如果你想要一个"one more than x
"的值,并且你不需要改变实际存储在x
中的值,那么通常的做法当然是[=15] =].
++x
不是 x + 1
的快捷方式,它是 x += 1
的快捷方式。也就是说,除了计算 x+1
之外,它还会将 x
的值递增 1。这意味着两件事:
x = ++x;
是多余的,因为++x;
本身已经完成了同样的事情。++1
没有意义,因为您无法更改1
的值 - 它是一个常量。
万一有人感兴趣...
我听到原始问题背后的微弱回声是 "Why is this operator here?"。答案涉及到一些计算历史。
Digital Equipment Corporation 创造了一种小型计算机——在当时(大约 1970 年),我们所知道的大多数 "computers" 都是 Big Iron,IBM 统治着计算世界,而 DEC 的小型计算机是新贵,没有分布广泛。我相信当时美国政府只从IBM购买了"computers",因此DEC称他们的机器为"programmable data processors"(PDP)。他们的 PDP 机器多年来一直是 16 位计算世界的领导者,尽管还有其他人。不到一百万美元就可以买到!
AT&T 的一些研究人员可以使用他们的早期机器;这些机器没有太多的操作系统或软件,研究人员开发了一种语言(名为 C)和操作系统(Unix)。
从早期命名为 'a' 和 'bcpl' 的语言开始,研究人员正在开发一种 "system" 语言,一种 "structured assembler" -- 它不是,也不意味着是一种 'high-level' 语言,而是一种可用于为这些更小、更慢的机器编写高效代码的语言,允许在低于 FORTRAN 和 COBOL 的水平上控制代码大小和速度,但具有编程结构高于汇编程序。
PDP 机器的寻址模式允许使用一个寄存器指向内存块的开头,另一个寄存器指向第一个寄存器的 'index'(偏移量)。当然,代码遍历数组(比方说指针)是很常见的,依次对数组中的每个元素执行某些操作。因此,机器语言中有一种寻址模式,允许从数组的 'current' 元素中的位置获取内存中的值,同时递增索引,所有这些都在一条机器语言指令中完成。
因此 C 语言的开发人员将这种自动递增和自动递减构建到语言中,使编译器编写者有机会使用寻址模式从 C 代码生成比其他方式更高效的机器代码。并且运算符从C继承到Java,大量借鉴了C的语法和运算符用法
因为 ++i 是一个 prefix increment ,它自增 1 然后使用 [=17= 的新值]i 在表达式中,但是 i++ 是 postfix increment 这实际上是:使用 的当前值i 然后将它增加 1。这里有一些例子可以更好地理解它: public static void main(String [] args){
int a = 3;
int b = 5;
System.out.println(++a);
System.out.println(b++);
System.out.println(b);
}
这是输出:
- 4
- 5
- 6