這個概念暫時很模糊,打算學完這一章再總結。目前的理解是,左值有名字,可以通過名字訪問記憶體,右值沒有名字,一般是運算的中間結果或者字面值常量等。
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.賦值運算需要乙個左值作為左側運算物件,得到結果仍然是...