前置與后置運算符是非常常用的運算符,但它們有什么區別?這里以++
為例子,看下面的代碼:
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)。(引自左值-百度百科)