為什麼 i 不能做左值,而 i 可以

2021-06-11 22:10:03 字數 801 閱讀 4968

算下來已經很久以前了,大概有那麼幾個星期了吧。看到了帖子上有人問為什麼下面的語句的對錯原因

int i = 0;

int *ip = &(i++); //錯誤

int *ip = &(++i); //正確

看到上面的語句,當時以為兩個都是是對的啊,可是當我用vs2010的編譯器試了試之後,才發現第乙個取位址確實是錯誤的語句,具體的提示是:error c2102: 「&」要求左值,而第二個取位址是正確的。

左值:

c/c++語言中可以放在賦值符號左邊的

變數,即具有對應的可以由使用者訪問的儲存單元,並且能夠由使用者去改變其值的量。左值表示儲存在計算機記憶體的物件,而不是

常量或計算的結果。或者說左值是代表乙個記憶體位址值,並且通過這個記憶體位址,就可以對記憶體進行讀並且寫(主要是能寫)操作;這也就是為什麼左值可以被賦值的原因了。相對應的還有右值:當乙個符號或者

常量放在操作符右邊的時候,計算機就讀取他們的「右值」,也就是其代表的真實值。簡單來說就是,左值相當於位址值,右值相當於資料值

看完左值的定義就不難理解為什麼取位址運算子需要作用在乙個左值物件上了。可為什麼i++與++i有如此的區別呢?

原因是:i

++不是儲存在x中的值,他們的具體函式實現請看下面:

// 字首形式:

int& int::operator++() //這裡返回的是乙個引用形式,就是說函式返回值也可以作為乙個左值使用

//字尾形式:

const int int::operator++(int) //函式返回值是乙個非左值型的,與字首形式的差別所在。

為什麼 i 不能做左值,而 i 可以

算下來已經很久以前了,大概有那麼幾個星期了吧。看到了帖子上有人問為什麼下面的語句的對錯原因 int i 0 int ip i 錯誤 int ip i 正確 看到上面的語句,當時以為兩個都是是對的啊,可是當我用vs2010的編譯器試了試之後,才發現第乙個取位址確實是錯誤的語句,具體的提示是 error...

i 為什麼不能作為左值,而 i可以作為左值

今天看書見到如下 int a 2 a 根據操作符的優先順序和結合性知,操作符 的優先順序為3,結合性為右結合,即 a 可以理解為 a 但我把 放在vs2015上,結果報錯,如圖 意思就是所a 不能作為左值,那a 為什麼不能作為左值呢?我們先來看左值的定義 左值 lvalue 是b語言 c語言 c 語...

i 為什麼不能作為左值?

1 首先說左值和右值的定義 變數和文字常量都有儲存區,並且有相關的型別。區別在於變數是可定址的 addressable 對於每乙個變數都有兩個值與其相聯 1 它的資料值,儲存在某個記憶體位址中。有時這個值也被稱為物件的右值 rvalue,讀做are value 我們也可認為右值的意思是被讀取的值 r...