前置与后置运算符是非常常用的运算符,但它们有什么区别?这里以++
为例子,看下面的代码:
public class Test
{
public static void main(String[] args)
{
int x = 0;
x ++;
++ x;
}
}
在这段代码中,x++
与++x
的效果是一样的。再看下面的代码:
public class Test
{
public static void main(String[] args)
{
int x = 0;
int y = x++;
int z = ++x;
System.out.println(x);
System.out.println(y);
System.out.println(z);
}
}
输出结果是
2
0
2
来分析一下代码,x++
与++x
语句的结果都是将x
的值加1,而它们的区别就是它们的返回值不一样,x++
返回的值是x
原来的值(加1之前的值),所以y
的值为0,此时x
的值为1,++x
返回的值是加1之后的值,因此z的值为2,x的值也是2。
C/C++中的前置与后置运算符##
C/C++中的前置与后置运算符对操作数进行运算的结果与Java中是一样的,但有一点不一样,还是它们的返回值不一样,有些同学可能要问,返回值跟Java中是一样的啊,哪里不一样了,看看下面的代码你就明白了:
#include <iostream>
using namespace std;
int main()
{
int x = 0;
(x++) ++; // 这句编译错误,提示:error: non-lvalue in increment
(++x) ++;
cout << x << endl;
}
看明白了吗?重点就在于(x++) ++
与(++x) ++
,前者会编译错误,提示非左值不能进行自增操作,而后者可以正常编译。也就是说,在C/C++,x++
返回的仅仅是一个值而已,不能对其进行写操作,而++x
返回的是x
本身这个变量,可以对其进行写操作。
而在Java中,如下:
public class Test
{
public static void main(String[] args)
{
int x = 0;
(x++) ++; // 编译错误
(++x) ++; // 编译错误
}
}
两者都会编译错误,说明在Java中,不管是前置还是后置运算符返回的都是值,不能作为左值进行写操作。
左值
左值(lvalue) 是B语言/C语言/C++语言等类C语言中的一类表达式。“左”(left)的原意是指可以放在赋值符号“=”的左边,但其实也表示能作为&和++等操作符的操作数(B语言中已经如此)。而且,现代C/C++中的含义已经不局限于此。lvalue的l被重新解释为location。这也对应于ISO C11/ISO C++11的内存位置(memory location)。(引自左值-百度百科)