新手喜聞樂見的x ,y , x, y

2021-08-02 16:11:36 字數 1320 閱讀 8115

首先明白一點,++、--這些符號叫做操作符,操作符本質上是一種特殊的函式。打個比方,假如c語言並沒有定義操作符這麼個東西,而是用函式代替,那麼語句x=y+z;很有可能會被替換成等價的函式int addition(int x,int y,int z)//打個比喻,也就是說你要addition(x,y,z);才能計算x=y+z,太不方便了。

先來看看以下**:

int x=3;

int y=4;

++x=++y;

那麼執行完上面三行**,x和y的值最終是多少呢?

先不說答案,來分析一下:

++x=++y;假如你遇到這麼個東西,你會怎麼做,沒錯,你會把它拆開為三部分: ++x = ++y;然後計算右邊的值,再把右邊的值賦值給左邊的。

同樣的道理放在程式上,程式根據操作符的優先順序來拆分語句,語句中優先順序最高的是++,然後是=,所以執行的順序是,先計算++x,然後計算++y,再把++y的值賦值給++x,++x和y++執行完之後y的值都會自增1,只是++y是先自增,後使用,而y++是先使用,後自增。從邏輯上來說,相當於y=y+1;所以++y的值為5,++x的值為4,然後把y再賦值給x,所以x和y都等於5。

那假如執行的是x++=y++;呢,從邏輯上來說,你是想把y的值賦值給x++,然後y自增1。

那麼問題來了,x++返回的值是什麼呢,y的值是賦值給了自增前的x,還是自增後的x呢?

編譯器給出的答案是 [error] lvalue required as left operand of assignment//錯誤 左值應為左運算元

什麼是左值,什麼是右值?

左值:左值可以出現在賦值語句的左邊或右邊

右值:右值只能出現在賦值的右邊,不能出現在賦值語句的左邊。

簡單來說,int a;a是左值,因為a在記憶體中佔據空間,但a+5就不是了,a+5表示的是乙個數值,它在記憶體中就沒有佔據空間,程式並沒有專門為a+5開闢記憶體去存放,它僅僅是個數值,是不能被賦值的,就像你不能把4賦值為3。

那麼x++返回的是什麼呢,顯然是自增前的x,但它返回的是自增前的數值,並不是乙個變數,也就是說,在x++自增的過程中,存放x的變數的記憶體由此自終只有一處,而x++返回的不是x變數本身,而是x的值,你能給變數賦值,但不能給值賦值。

上面的++x=++y;可以成功執行,顯然++x返回的是x變數本身。

綜上,x++和++x不同之處重點在於兩處:

1、x++是先使用,後自增,++x是先自增,後使用。

2、x++返回的是x自增前的值,是x物件的值,而++x返回的是x自增後x物件本身。

1411 喜聞樂見的a b ZCMU

喜聞樂見的a b來了,當然二進位制,八進位制,十進位制什麼的估計你們也懶得寫了,來個20進製的a b 給出多組a和b,每個數字一行 數字由0 9和小寫字母a j 10 19 給出的長度不超過100 每組資料輸出a b的和 abcdefghij 99999jjjjj bdfi02467j iiiij0...

ZCMU 1411 喜聞樂見的a b

time limit 1 sec memory limit 128 mb submit 386 solved 144 submit status web board 喜聞樂見的a b來了,當然二進位制,八進位制,十進位制什麼的估計你們也懶得寫了,來個20進製的a b 給出多組a和b,每個數字一行 數...

ZCMU1411 喜聞樂見的a b

喜聞樂見的a b來了,當然二進位制,八進位制,十進位制什麼的估計你們也懶得寫了,來個20進製的a b 給出多組a和b,每個數字一行 數字由0 9和小寫字母a j 10 19 給出的長度不超過100 每組資料輸出a b的和。1234567890 abcdefghij 99999jjjjj 999990...