本章的內容比較簡單,基本上沒有什麼理解上的困難,都是知識上的問題。先開始想要不要寫呢,本來是不準備寫的,但是既然讀了書就要做筆記,還是寫一寫,畢竟還是有點點收穫的東西。那麼,我只就一些容易弄糊塗和忽略的地方提出來,為日後變成作參考。
一、表示式
(一)概念
表示式時由乙個或者多個運算物件組成的,對乙個表示式求值將得到乙個結果。把乙個運算發和乙個或者多個運算物件組合起來可以生成較為複雜的表示式。
作用於乙個物件的運算子是
一元運算子
例如:「&
」,「*
」等。運用於兩個物件的運算子是
二元運算子
,例如「+
」、「-
」、「==
」、「!
=」等。
在c++
中表示式要麼是
左值,要麼是
右值。左值可以位於賦值語句的左側、右值不能。當乙個物件被用作右值的時候,用的是物件的值(內容);當物件被用作左值的史詩,用的是物件的身份(在記憶體中的位置)。我們熟悉的運算子都是要用到左值的。
使用關鍵則
decltype
的時候,我們根據左值右值的判斷可以知道
decltype
得到的型別。如果表示式求值的結果是左值,
decltype
得到乙個引用型別,如果表示式求值結果是右值,則得到乙個指標型別。例如int *p
;那麼decltype(*p),*p
是左值,得到的是
int &
引用,decltype(&p)
得到的結果是指標,
int**
。(二)
一些值得注意的運算子
取負,一元符號運算是物件值取負後,返回其(提公升後)的副本。
要注意,無符號型的數和bool
型的數不能做這樣的運算
。無符號型取負值會提公升成有符號型別,如果沒有溢位就相安無事,如果溢位了一般會發生「環繞」,跟第一章中間講的溢位差不多的性質。布林型的資料取負後會提公升成int
型,我們知道
true=1
,取負就成了
-1。但是對於
bool
型是非0
為true,0
為false
,所以取負以後還是
true
。取模運算「%
」,我們規定m%(-n)=m%n
,(-m)%n=-(m%n)
。簡單的說,
取模運算的符號是由前面那個數的符號決定的
。所說,(-m)%(-n)=-(m%n)
。遞增運算子(++
)和遞減運算子(--)
,即為物件加1
和物件減
1。這兩種運算也可以用於不支援算數運算的迭代器。我們以遞增運算子為例,遞減運算子類似,分為前置版本
++i,和後置版本
i++。
前置版本的意思是先對i加1
再作為左值返回,後置版本是將物件的原始值的副本作為右值返回,再自加
。int
i=0;
intj=i++;
cout
<
j=++i;
cout
<
第乙個j=i++;是j
賦值為i
的原始值副本以後,
i再自加。第二個
++i,是
i先自加以後再賦值給
j。一般我們更習慣用
++i而不採用
i++。
另外,還要值得注意的是,++
運算子的優先順序是高於解引用運算子的。我們假設
p是乙個指標,那麼
*p++
的意思是*(
p++);把
p的值加
1,然後返回
p的值的初試副本作為其求值結果,解引的值是沒有自加後的結果。
inta[10];
int*p=a;
for(
inti=0;i<10;++i)
a[i]=i;
for(
inti=0;i<10;++i)
條件運算子(?:)
, 這裡有幾個有趣的例子。
intgrade=50;
cout<
"fail"
:"pass"
);cout<
"fail"
:"pass"
;cout
:"pass"
;第三條cout語句是編譯都通不過的,前面兩條是對的。我們輸出結果看一看。
第乙個輸出的是
(grade<60)?
"fail"
:"pass"
這個語句的值,第二個輸出的是1
,其實就是
grade<60
的值是true。所以當你不清楚優先順序的時候最穩妥的方法就是打括號。
位移運算子(<>)
,按照二進位制移動,記住
左移《變大,右移》變小,多的去掉
。我們可以用位移運算子來處理類似於bool型的陣列問題,這裡不詳述。另外我們熟悉的cout<>這種過載版本的io運算子,io過載我們會在後面的章節詳述,需要了解的是「cout<
sizeof()運算子,
是的它是乙個運算子,不是乙個函式,它的運算結果部分的依賴於作用的型別。對應用型別執行sizeof()得到的是被引用物件所佔空間大小。對指標執行sizeof()運算得到的是指標本身所佔的空間。我們可以用下面這種語句來求陣列元素的個數:
inta[10]=;
cout<<
"sizeof(a):"
<<
sizeof
(a)<
cout<<
"sizeof(*a):"
<<
sizeof
(*a)<
cout<<
sizeof
(a)/
sizeof
(*a)<
顯示轉化static_cast。
可以消除強制型別轉換的時候報warnning
把常量轉化成變數:
const_cast
;隱式的型別轉換我們再第一章中已經說過了,不再贅述。
在我們程式設計的過程中基本上碰到的一些奇怪的操作符就是上面著一些的,如果你的表示式得到的結果並不是你想要的最好的方法就是多試幾遍。
二、語句
語句就是我們基本說的條件語句、迭代語句什麼的,平時都很常用,這裡只對一些需要注意的點說明一下。
if-else語句
,這種語句我們都很熟悉,唯一需要說明的是,在c++中規定else是跟最近的未匹配的if配對。
if(a) if(b) else c;
這裡的else 是跟if(b)匹配的。不過建議還是用花括號來明確表示吧。
switch()語句。
switch內部的變數必須是個常量且為整數,char,int,bool都可以,但是不能是浮點數。另外每乙個case對應乙個break,如果不寫break的話,會接著做下一條case,且不用滿足下一條case的條件,這個應該都很熟悉了;不能夠跨case宣告變數。也就是
case 1:int a;break;
case 2:a=3;break;
這樣是不行的,原因可以參見一下變數的作用域問題。
跳轉語句break,continue。
作用於最近的迴圈語句。break是跳出迴圈,continue是碰到了以後不再做下面的語句,直接進入下一次迴圈。
下面一小段**可以說明這個問題:
break是碰到大於7的數就跳出迴圈了。而continue是不輸出大於7的數。
另外還有goto語句,一般都不會用到它,它會造成一些混亂,但是有時候卻有你意想不到的奇效,不過還是能不用盡量不用吧,這屬於高難度動作啦。
最後還有丟擲異常語句,簡單的說一下就是try然後用catch接住這個異常並且做相應的處理。對於程式的健壯性和安全性的處理是件很困難的事情,經驗很重要。
如果有人看是我寫下去的動力啦~當然沒人不看我也會寫的,因為知識和成長是自己的~~~
小豬豬逆襲成博士之C 基礎篇(三)字串
string 寫在題外的話 字串型別是我們經常用到的,下面介紹一些平時常用的功能。string需要包含的標頭檔案 include 一 一些基本的操作 1 string 的初始化大概有以下幾種 string s1 cout s1 string s2 aaa cout s2 string s3 s2 c...
C 學習筆記 表示式 語句 函式
這三節的內容特別多但是比較基礎,所以我把他們放在了一起,把一些比較重要 個人認為的 的一些知識點記錄下來,以便以後查閱。c 新標準規定商一律先0取整 即直接切除小數部分 對於除法和取模的運算規則 相等與布林值的碰撞 只有當 val 等於 1 時才成立,因為布林值true轉換成 val 的型別 if ...
C 學習筆記之三(C 語句基礎之表示式與語句)
一 運算子 運算子概述 c 語言中的運算子是可以讓c 編譯器能夠識別的具有運算意義的符合。編譯器把這些符合及組成的表示式翻譯成相應的機器 就可以由計算機執行出正確的結果。如下圖的表示 c 中包含了c語言中所有的運算子,並且在其基礎上又增加了一下幾種新的運算子。作用域運算子 new 動態分配記憶體運算...