第四章 表示式

2021-09-10 02:54:08 字數 2405 閱讀 9989

這個概念暫時很模糊,打算學完這一章再總結。目前的理解是,左值有名字,可以通過名字訪問記憶體,右值沒有名字,一般是運算的中間結果或者字面值常量等。

const修飾的變數是常量左值

如果decltype()函式的括號中表示式結果是左值,則得到乙個引用型別。例如在下面這段**中,b是int型別,c是int*型別

int a;

decltype(a) b;

decltype(a = 0) c = a

int i = 0;

cout << i << " " << ++i << endl;

輸出是1 1,沒想到吧哈哈。其實1,1這個答案是沒意義的,也就是說,對於運算子"<

只有四種運算子規定了執行順序:邏輯與(&&)運算子,邏輯或(||)運算子,條件(? :)運算子,逗號( , )運算子。

上圖是再次強調求值順序的陷阱,小心寫出了錯誤的**。

編譯器之所以沒有規定求值順序,是為編譯器的優化提供了餘地。

設m,n都是整數,則(-m)/n =m/(-n) = - (m/ n);  m/n = (-m)/(-n) ; (-m)%n = (-m)%(-n) = -(m%n), m%n = m%(-n) 

賦值運算是右結合的。

++i是前置版本,i++是後置版本。前置版本返回的是修改後的物件,作為左值,後置版本將物件修改前的副本作為右值返回。由於後置版本需要儲存原始值的副本,所以效能會較低,建議養成使用前置版本的習慣鴨。

int i = 0;

++i = 3;

//i++ = 3;

cout << i << endl;

while (1){}

return 0;

在上面這段**中,輸出值是3,這是因為++i = 3這句**將3賦值給了物件i 。但是注釋的部分i++ = 3的語句是不合法的,因為i++返回的是右值鴨。

假設p是int型的指標。則*p++的意義是:先儲存p的副本,然後對p加一,然後對未修改的副本執行解引用操作。這是因為遞增運算子的優先順序高於解引用運算子。

p->i 等於 (*p).i 。

對char型別執行位運算會提公升為int型別。

char i;

char *p = &i;

char &r = i;

cout << sizeof(char) << endl;

cout << sizeof i << endl;

cout << sizeof p << endl;

cout << sizeof *p << endl;

cout << sizeof r << endl;

這段**的輸出如下所示:

114

11

對於型別,sizeof運算子要用括號,對於表示式不需要括號。且可以看出,指標型別占用四個位元組,很厲害的。

unsigned int ui = 10;

int i = -11;

unsigned i_ui = i;

cout << i_ui << endl;

cout << ui + i << endl;

對於上面的**,輸出如下:

4294967285

4294967295

可以得出,當運算物件乙個是無符號型別,乙個是帶符號型別且無符號型別不小於帶符號型別時候,先將帶符號型別轉換成無符號型別再運算。

強制型別轉換的表示式為cast_name(expression);其中type為要轉換的目標型別,expression為轉換的表示式,cast_name有四種形式:static_cast, const_cast,reinterpret_cast和dynamic_cast;static_cast是最普通的型別轉換,將一種型別轉換為另一種型別,例如下面這段**輸出0.8

int a = 4, b = 5;

double d = static_cast(a) / static_cast(b);

cout << d << endl;

const_cast改變運算物件的底層const,如下面的**所示,將const char*轉換成char*,const_cast不能像static_cast那樣改變表示式型別。

char ch = '胖';

const char *p1 = &ch;

char *p2 = const_cast(p1);

第四章 表示式

左值,用的是物件的身份 記憶體中的位置 右值,用的是物件的值 解引用生成 左值,取位址生成乙個 右值 bool b true bool c b c為true,因為 bool值在計算的時候被轉換成整型號int,所以b被轉換成 1,不為0,所以賦值給c的時候,為true int b while b ge...

第四章 學習 表示式

4.1 c 將運算子分為三類 1.一元運算子2.二元運算子 3.三元運算子 4.2 使用初等表示式 是運算子的重要組成部分。幾種不同的初等表示式 1 字面值 在c 中 直接使用硬編碼的值。比如 if firstname brain brain 就輸入直接使用硬編碼 也可以這樣 將其存入某個變數中,然...

c primer第四章 表示式

左值 右值 當乙個物件被當做右值的時候使用的是物件的值 內容 當物件被用作左值的時候用的是物件的身份 記憶體 原則 在使用右值的地方可以用左值代替,但是不能把右值當成左值 也就是位置 使用。當乙個左值被用工作右值時,實際上使用的是她的內容 值 1.賦值運算需要乙個左值作為左側運算物件,得到結果仍然是...