直接上代碼
demo 代碼(一)
#include <iostream>
using namespace std;
int demo()
{
int i = 0;
return i;
}
int main()
{
demo() = 888;
return 0;
}
編譯:
demo 代碼(二)
#include <iostream>
using namespace std;
int demo()
{
int i = 0;
return i;
}
int main()
{
int ret = demo();
// demo() = 888;
return 0;
}
左值和右值的概念
存儲的層次結構
左值和右值的概念
按字面意思,通俗地說。以賦值符號 = 爲界,= 左邊的就是左值(lvalue),= 右邊就是右值(rvalue)。
int a = 666;
左值 右值
int b = 888;
左值 右值
int c = a + b;
左值 右值 右值
lvalue - 代表一個在內存中佔有確定位置的對象(換句話說就是有一個地址)。
rvalue - 通過排他性來定義,每個表達式不是lvalue就是rvalue。因此從上面的
lvalue的定義,rvalue是在不在內存中佔有確定位置的表達式,而是存在在寄存器中。
所有的左值(無論是數組,函數或不完全類型)都可以轉換成右值。
通過彙編加深理解
編譯:
gcc demo.c -S
生成這個文件
cat demo.s
老師的講解:
demo 代碼(三)
#include <iostream>
using namespace std;
int &demo()
{
static int i = 0;
cout << "i=" << i << endl;
return i;
}
int main()
{
//int ret = demo();
demo() = 888; /* demo() 返回的i的引用, 別名 */
demo();
system("pause");
return 0;
}
編譯:
執行:
結語:
時間: 2020-06-30