C++基礎入門教程(七):一些比較特別的基礎語法總結
這次又到了比較簡單的內(nèi)容了,介紹了一些基本的循環(huán)控制、關系表達式、邏輯控制等。
這里就簡單抽一些稍微比較特別的內(nèi)容來吹吹水,不,是來總結一下吧~
一、i++和++i
不,我不是來解釋i++和++i的區(qū)別的,只是書上提到一點,在使用for循環(huán)的時候,倒底i++和++i有沒有區(qū)別呢?
答案是:幾乎沒有,隨便你用哪一個。
 
但是,要稍微注意一下兩種方式的內(nèi)部處理方式:
i++:先復制一個i的副本,然后將i加1,最后返回i的副本。
++i:將i加1,然后返回i。
 
這么一說,大家都知道誰的效率更高,但對于現(xiàn)在的編譯器而言,是會自動優(yōu)化的(但不知道是不是所有編譯器都這樣)。
然后,C++是允許自定義操作符的行為的,也就是說,我們可以為自己的類定義++操作,這時候,復制類的副本,消耗明顯就不能忽略不計了。
這個,就不多說了。
二、逗號運算符
逗號運算符可以將多條語句放到一起,如:
for (int i = 2, j = 10 * i; i < 999; i++) {
cout << j;
break;
}
int i = 2, j = 10 * i;就是逗號表達式了,那么,j的值是多少呢?沒錯,是20。
再來, 這樣:
int num = 0;
num = 10, 50;
注意,聲明變量賦值的時候是不能使用逗號表達式的,這個自己在編譯器編譯一下就知道了~規(guī)則這東西,沒必要死記~
這里的num值是多少呢?沒錯,是10,因為賦值比逗號表達式優(yōu)先級要高,所以先把10賦值給num,后面的50被舍棄了。
那么,這樣呢:num = (10, 50);  結果是50,因為括號的優(yōu)先級比賦值語句高,逗號表達式沾了光,所以最后是把50賦值給了num。
 
但是,如果有誰非特殊情況下用這樣的賦值形式,那么,我保證不打死他。
三、類型別名(typedef)
這又是新手的一個痛點,大部分初次接觸Cocos2d-x的朋友,一定被這兩條語句嚇死過:
typedef void (Ref::*SEL_SCHEDULE)(float);
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
這看似神復雜的東西,倒底是什么?這其實就是我們使用schedule定時器功能時要用到的。
這里先放著。
 
我們先來看看最簡單的typedef用法:
typedef int IQ;
IQ mutouIQ = 250;
int normalIQ = 1;
所謂類型別名,就是給某個類型的名字取個外號,比如我們把使用IQ代替int,如上代碼。
使用typedef int IQ,就代表把int取了個別名,叫做IQ,以后就可以用IQ來定義整數(shù)了。
粗俗地說,IQ就是int,int就是IQ,懂了吧~
 
再來看看這個:typedef char* mpointer;
那么,我們以后就可以使用mpointer來定義char類型的指針。
 
大家有沒有發(fā)現(xiàn)什么?
如果把typedef去掉,就變成這樣:
int IQ;
char* mpointer;
沒錯,IQ和mpointer就像是一個變量名(在上面這段代碼里它們就是變量名)。
結果就是,在聲明變量之后,前面加上typedef,就然后這個變量成為了類型的別名。
很好理解吧?以后看到typedef很復雜的,就把typedef去掉,看看是聲明的什么變量,那這個別名就是代表這樣的變量了。
 
接下來,再回到那神復雜的兩條語句:
typedef void (Ref::*SEL_SCHEDULE)(float);
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)
先看第一條,很復雜,我們把typedef去掉,變成:void (Ref::*SEL_SCHEDULE)(float);
這是什么,其實我也解釋不了,我C++很水的,但,這明顯就是一個“函數(shù)變量”(暫時這么稱呼它)。
一個返回值為void,參數(shù)為float的函數(shù),并且限定其類為Ref,怎么樣,很好理解吧。
 
把typedef放回去,這句代碼就是把SEL_SCHEDULE定義為上述所說的那種函數(shù)。
接著看第二條代碼,這是一個宏:
1.schedule_selector是宏的名稱
2._SELECTOR是宏的參數(shù)
3.static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)簡化為static_cast<SEL_SCHEDULE>(&_SELECTOR),這是強制類型轉換,將傳遞進來的_SELECTOR轉換為某種類型
4.轉換為什么類型呢?沒錯,就是SEL_SCHEDULE類型,SEL_SCHEDULE是什么類型?剛剛已經(jīng)解釋過了,一個返回值為void,參數(shù)為float,其類為Ref的函數(shù)
 
最后,看看我們平時是怎么使用schedule_selector的:
this->schedule(schedule_selector(HelloWorld::update));
結果就是把我們的HelloWorld的update函數(shù)轉換成了SEL_SCHEDULE類型,然后傳遞給schedule函數(shù)。
 
呼,這回明白了吧,最后看看我們的update函數(shù)是如何定義的:void update(float dt);
返回值為void,參數(shù)為float,HelloWorld類繼承了Layer(最終也是繼承了Ref的)。
update函數(shù)的類型和SEL_SCHEDULE的基本上一樣,除了類的類型以外。
但因為Layer的最終基類是Ref,所以可以把update函數(shù)強制轉換為SEL_SCHEDULE類型。
 
好了,我再解釋下去的話,就越來越說不通了,就到這里吧~
四、新的for循環(huán)(c++11)
C++11新增一種for循環(huán)語法,可以很方便地遍歷數(shù)組、vector以及array。
使用很簡單,如下:
int nums[3] = { 1, 2, 3 };
for (int num : nums) {
}
這樣就能把nums的值以此賦值給num,從而遍歷整個數(shù)組,不多說喇~
五、cctype標準庫
我問大家一個問題,給你一個字母A,要判斷它是大寫還小寫,你怎么判斷?
(小若:你都說了是字母A了,當然是大寫的?。∫袛鄦??)
 
咳咳~!程序!我們是程序員,不能這么簡單地去判斷~!這樣不嚴謹~!
我們應該這樣:
char c = 'A';
if(c >= 'A' and c <= 'Z') {
// 嗯,是大寫
}
一般人應該都會這么想吧?(小若:不,一般人都知道A是大寫,不用判斷)
其實這樣不安全,萬一字符編碼不是ASCII呢?有可能答案就不一樣了。
于是,我們應該這樣寫:
char c = 'A';
if (isupper(c)) {
// 嗯,是大寫
cout << "yes";
}
isupper是cctype庫的函數(shù),用來判斷字母是否是大寫。
這樣就更方便和通用了,
 
cctype庫在頭文件ctype.h里(或者cctype里),關于這個庫的更多函數(shù),百度一下,會有很多~
六、結束
好了,這次就到這里吧,C++果然不是我喜歡的東西,能吹水的地方比較少(都是比較嚴謹?shù)臇|西),我還能堅持多久呢?~
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
 - 01-10深入理解C++中常見的關鍵字含義
 - 01-10使用C++實現(xiàn)全排列算法的方法詳解
 - 01-10c++中inline的用法分析
 - 01-10用C++實現(xiàn)DBSCAN聚類算法
 - 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
 - 01-10C++大數(shù)模板(推薦)
 - 01-10淺談C/C++中的static與extern關鍵字的使用詳解
 - 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
 - 01-10深入理解C/C++混合編程
 


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機閱讀
- 01-10delphi制作wav文件的方法
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-10C#中split用法實例總結
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 04-02jquery與jsp,用jquery
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 


