欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      黑馬程序員C語(yǔ)言教程: cc++專家_交你如何使用c++中的類型轉(zhuǎn)換

      時(shí)間:2019-05-12 20:20:37下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《黑馬程序員C語(yǔ)言教程: cc++專家_交你如何使用c++中的類型轉(zhuǎn)換》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《黑馬程序員C語(yǔ)言教程: cc++專家_交你如何使用c++中的類型轉(zhuǎn)換》。

      第一篇:黑馬程序員C語(yǔ)言教程: cc++專家_交你如何使用c++中的類型轉(zhuǎn)換

      傳智播客C/C++專家– 交你如何使用c++中的類型轉(zhuǎn)換

      關(guān)于C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換是程序猿用的最多的一種轉(zhuǎn)換方式, 不管什么類型的轉(zhuǎn)換統(tǒng)統(tǒng)都是TYTE b =(TYPE)a。但是眾所周知C++程序中對(duì)類型的檢測(cè)非常嚴(yán)格,如果類型轉(zhuǎn)換過(guò)程中使用C風(fēng)格的類型轉(zhuǎn)換就容易出現(xiàn)一些問(wèn)題。所以今天傳智播客C/C++專家在這里給大家介紹一下C++風(fēng)格的類型轉(zhuǎn)換的幾種轉(zhuǎn)換操作符以及使用場(chǎng)合。

      C++風(fēng)格的類型轉(zhuǎn)換提供了4種類型轉(zhuǎn)換操作符: const_cast,static_cast,dynamic_cast,reinterpret_cast 4種類型轉(zhuǎn)換的格式,如:TYPE B = static_cast(TYPE)(a)。? const_cast ? 去掉類型的const或volatile屬性。

      struct SA { int i;};const SA ra;//ra.i = 10;

      //直接修改const類型,編譯錯(cuò)誤

      SA &rb = const_cast(ra);

      rb.i =10;? static_cast 類似于C風(fēng)格的強(qiáng)制轉(zhuǎn)換。主要應(yīng)用場(chǎng)景:

      ? 基類和子類之間轉(zhuǎn)換:其中子類指針轉(zhuǎn)換成父類指針是安全的;但父類指針轉(zhuǎn)換成子類指針是不安全的。(基類和子類之間的動(dòng)態(tài)類型轉(zhuǎn)換建議用dynamic_cast)? 基本數(shù)據(jù)類型轉(zhuǎn)換。

      enum, struct, int, char, float等。static_cast不能進(jìn)行無(wú)關(guān)類型(如非基類和子類)指針之間的轉(zhuǎn)換。? 把空指針轉(zhuǎn)換成目標(biāo)類型的空指針。? 把任何類型的表達(dá)式轉(zhuǎn)換成void類型。

      ? static_cast不能去掉類型的const、volitale屬性(用const_cast)。

      int n =6;// 基本類型轉(zhuǎn)換

      double d = static_cast(n);int*pn =&n;// 無(wú)關(guān)類型指針轉(zhuǎn)換,編譯錯(cuò)誤 double*d = static_cast(&n)// 任意類型轉(zhuǎn)換成void類型 void*p = static_cast(pn);

      ? dynamic_cast

      有條件轉(zhuǎn)換、動(dòng)態(tài)類型轉(zhuǎn)換,運(yùn)行時(shí)會(huì)進(jìn)行類型安全檢查(轉(zhuǎn)換失敗返回NULL):

      ? 安全的基類和子類之間轉(zhuǎn)換。? 必須要有虛函數(shù)。

      ? 相同基類不同子類之間的交叉轉(zhuǎn)換。但結(jié)果是NULL。class ItcastClass { public: int m_iNum;//基類必須有虛函數(shù)。保持多臺(tái)特性才能使用dynamic_cast virtualvoid foo(){};};

      class HeiMaClass: public ItcastClass { public: char*m_szName[100];void bar(){};};

      ItcastClass* pb =new HeiMaClass();

      //子類->父類,靜態(tài)類型轉(zhuǎn)換,正確但不推薦 HeiMaClass *pd1 = static_cast(pb);//子類->父類,動(dòng)態(tài)類型轉(zhuǎn)換,正確

      HeiMaClass *pd2 = dynamic_cast(pb);ItcastClass* pb2 =new ItcastClass();//父類->子類,靜態(tài)類型轉(zhuǎn)換,危險(xiǎn)!訪問(wèn)子類m_szName成員越界

      HeiMaClass *pd21 = static_cast(pb2);//父類->子類,動(dòng)態(tài)類型轉(zhuǎn)換,安全的。結(jié)果是NULL HeiMaClass *pd22 = dynamic_cast(pb2);? reinterpret_cast 僅僅重新解釋類型,但沒(méi)有進(jìn)行二進(jìn)制的轉(zhuǎn)換:

      ? 轉(zhuǎn)換的類型必須是一個(gè)指針、引用、算術(shù)類型、函數(shù)指針或者成員指針。

      ? 在比特位級(jí)別上進(jìn)行轉(zhuǎn)換。它可以把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),也可以把一個(gè)整數(shù)轉(zhuǎn)換成一個(gè)指針(先把一個(gè)指針轉(zhuǎn)換成一個(gè)整數(shù),在把該整數(shù)轉(zhuǎn)換成原類型的指針,還可以得到原先的指針值)。但不能將非32bit的實(shí)例轉(zhuǎn)成指針。? 最普通的用途就是在函數(shù)指針類型之間進(jìn)行轉(zhuǎn)換。? 很難保證移植性。

      int doSomething(){return0;};

      //FuncPtr 是一個(gè)指向函數(shù)的指針,該函數(shù)沒(méi)有參數(shù),返回 值類型為 void typedef void(*FuncPtr)();//10個(gè)FuncPtrs指針的數(shù)組 讓我們假設(shè)你希望(因?yàn)槟承┠?名其妙的原因)把一個(gè)指向下面函數(shù)的指針存 入funcPtrArray數(shù)組: FuncPtr funcPtrArray[10];

      // 編譯錯(cuò)誤!類型不匹配,reinterpret_cast可以讓編譯器以你 的方法去看待它們:funcPtrArray funcPtrArray[0] =&doSomething;//不同函數(shù)指針類型之間進(jìn)行轉(zhuǎn)換

      funcPtrArray[0]=reinterpret_cast(&doSomething);最后傳智播客C/C++專家再為大家總結(jié)一下以上四種類型轉(zhuǎn)換符的使用場(chǎng)景: ? 去const屬性用const_cast。? 基本類型轉(zhuǎn)換用static_cast。

      ? 多態(tài)類之間的類型轉(zhuǎn)換用daynamic_cast。? 不同類型的指針類型轉(zhuǎn)換用reinterpret_cast。今天的內(nèi)容就到這里, 祝大家學(xué)習(xí)愉快!

      第二篇:黑馬程序員C語(yǔ)言教程: CC++培訓(xùn)專家-預(yù)處理命令使用詳解

      傳智播客C/C++培訓(xùn)專家:預(yù)處

      理命令詳解

      作為一枚C/C++程序猿,在我們編寫(xiě)和查看C/C++源代碼的過(guò)程中會(huì)遇到各種編譯指令,這些指令稱為預(yù)處理命令。預(yù)處理命令雖然不是C/C+的一部分,但卻擴(kuò)展了C程序的設(shè)計(jì)環(huán)境,下面?zhèn)髦遣タ虲/C+培訓(xùn)專家將向大家介紹如何應(yīng)用預(yù)處理程序和注釋簡(jiǎn)化程序開(kāi)發(fā)過(guò)程,并提高程序的可讀性。

      ANSI標(biāo)準(zhǔn)定義的C語(yǔ)言所有預(yù)處理命令均以符號(hào)#開(kāi)頭,比如我寫(xiě)程序時(shí)常用的:

      #define,#undef,#include,#if,#else,#elif,#endif,#ifdef,#ifndef, #error 1.#define和 #undef 宏定義命令的一般形式為:

      #define[MacroName][MacroValue],示例如下: #defineITHEIMA 傳智播客黑馬程序員

      在源程序中每次遇到ITHEIMA時(shí),均以定義的值傳智播客黑馬程序員代換它。

      ? 在使用該宏時(shí),有以下幾點(diǎn)注意事項(xiàng):

      ? 該語(yǔ)句沒(méi)有分號(hào)。在標(biāo)識(shí)符和串之間可以有任意個(gè)空格。? 定義宏的時(shí)候,可以使用之前已經(jīng)定義好的宏。

      ? 如果串長(zhǎng)于一行,可以在該行末尾用一反斜杠' '續(xù)行。

      #defineLONG_STRING“good good study,day day up!” ? 在定義宏標(biāo)識(shí)符時(shí),字母一般需要大寫(xiě)。? 預(yù)處理運(yùn)算符的使用:

      ? #--該符號(hào)是“字符串化”的意思,出現(xiàn)在宏定義中的#是把跟在后面的參數(shù)轉(zhuǎn)換成一個(gè)字符串

      #define ERROR_LOG(module)

      fprintf(stderr, “error: ”#module“n”)ERROR_LOG(“add”);轉(zhuǎn)換為 fprintf(stderr,“error: ”add“n”);ERROR_LOG(devied =0);轉(zhuǎn)換為 fprintf(stderr,“error: devied=0n”);? ##--是連接符號(hào),將多個(gè)串連接到一起。char *szStr = “傳播播客_黑馬程序員”;#define ITCAST(exp)cout <

      2.#include 命令#i nclude使編譯程序?qū)⒘硪辉次募度霂в校nclude的源文件,被讀入的源文件必須用雙引號(hào)或尖括號(hào)括起來(lái)。例如:

      #include“stdio.h”或者#include 這兩行代碼均使用C編譯程序讀入并編譯用于處理磁盤(pán)文件庫(kù)的子程序。將文件嵌入#i nclude命令中的文件內(nèi)是可行的,這種方

      式稱為嵌套的嵌入文件,嵌套層次依賴于具體實(shí)現(xiàn)。

      ? 如果顯式路徑名為文件標(biāo)識(shí)符的一部分,則僅在那些子目錄中搜索被嵌入文件。

      例如: #include “../include/head.h”

      ? 如果文件名用雙引號(hào)括起來(lái),則首先檢索當(dāng)前工作目錄。如果未發(fā)現(xiàn)文件,則在命令行中說(shuō)明的所有目錄中搜索。如果仍未發(fā)現(xiàn)文件,則搜索實(shí)現(xiàn)時(shí)定義的標(biāo)準(zhǔn)目錄。例如: include “head.h”

      ? 如果文件名被尖括號(hào)括起來(lái),則首先在編譯命令行中的目錄內(nèi)檢索。如果文件沒(méi)找到,則檢索標(biāo)準(zhǔn)目錄,不檢索當(dāng)前工作目錄。

      例如: include 3.條件編譯命令:#if、#else,#elif及#endif #define MAX 80 #include using namespace std;int main(){ #if MAX > 99 cout<<“MAX is bigger than 99”< #elif MAX > 90 cout<<“MAX is bigger than 90”< #else cout<<“MAX is smaller than 90”< #endif return 0;} ? #if的一般含義是如果 #if后面的常量表達(dá)式為true,則編譯

      它與#endif之間的代碼,否則跳過(guò)這些代碼。命令#endif標(biāo)識(shí)一個(gè)#if塊的結(jié)束。

      跟在#if后面的表達(dá)式在編譯時(shí)求值,因此它必須僅含常量及已定義過(guò)的標(biāo)識(shí)符,不可使用變量。表達(dá)式不許含有操作符sizeof(sizeof也是編譯時(shí)求值)。

      ? #else命令的功能有點(diǎn)象C語(yǔ)言中的else;#else建立另一選擇(在#if失敗的情況下)。注意,#else屬于#if塊。

      ? #elif命令意義與ELSE IF 相同,它形成一個(gè)if else-if階梯狀語(yǔ)句,可進(jìn)行多種編譯選擇。#elif 后跟一個(gè)常量表達(dá)式。如果表達(dá)式為true,則編譯其后的代碼塊,不對(duì)其它#elif表達(dá)式進(jìn)行測(cè)試。否則,順序測(cè)試下一塊。?

      4.#error 命令#error強(qiáng)迫編譯程序停止編譯,主要用于程序調(diào)試。該指令使預(yù)處理器發(fā)出一條錯(cuò)誤消息,該消息包含指令中的文本.這條指令的目的就是在程序崩潰之前能夠給出一定的信息。

      5.#ifdef 和 #ifndef 條件編譯的另一種方法是用#ifdef與#ifndef命令,它們分別表示“如果有定義”及“如果無(wú)定義”。# ifdef的一般形式是:

      # ifdef macroname statement sequence

      #endif #ifdef與#ifndef可以用于#if、#else,#elif語(yǔ)句中,但必須與一個(gè)#endif。

      define MAX 91 #include using namespace std;

      int main(){ #ifdef MAX cout<<“hello,MAX!”< #else cout<<“where is MAX?”< #endif #ifndef LEO cout<<“LEO is not defined”< #endif return 0;} 今天關(guān)于預(yù)處理命令的知識(shí)點(diǎn)傳智播客C/C+培訓(xùn)專家就為大家接受到這里, 歡迎大家留言交流.

      第三篇:黑馬程序員C語(yǔ)言教程: CC++培訓(xùn)專家:漫談軟件編碼風(fēng)格

      傳智播客C/C++培訓(xùn)專家:漫談軟件編碼風(fēng)格

      通過(guò)建立代碼編寫(xiě)規(guī)范,形成開(kāi)發(fā)小組編碼約定,提高程序的可靠性、可讀性、可修改性、可維護(hù)性、一致性,保證程序代碼的質(zhì)量,繼承軟件開(kāi)發(fā)成果,充分利用資源。提高程序的可繼承性,使開(kāi)發(fā)人員之間的工作成果可以共享。代碼的風(fēng)格主要有以下幾點(diǎn):

      1、縮進(jìn)

      縮進(jìn)以4個(gè)空格為單位。預(yù)處理語(yǔ)句、全局?jǐn)?shù)據(jù)、函數(shù)原型、標(biāo)題、附加說(shuō)明、函數(shù)說(shuō)明、標(biāo)號(hào)等均頂格書(shū)寫(xiě)。語(yǔ)句塊的“{”“}”配對(duì)對(duì)齊,并與其前一行對(duì)齊,語(yǔ)句塊類的語(yǔ)句縮進(jìn)建議每個(gè)“{”“}”單獨(dú)占一行。

      2、空格

      變量、類、常量數(shù)據(jù)和函數(shù)在其類型,修飾(如 __fastcall 等)名稱之間適當(dāng)空格并據(jù)情況對(duì)齊。關(guān)鍵字原則上空一格,如: if(...)等,運(yùn)算符的空格規(guī)定如下:“::”、“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正負(fù)號(hào)),“&”(取址或引用)、“*”(指使用指針時(shí))等幾個(gè)運(yùn)算符兩邊不加空格(其中單目運(yùn)算符系指與操作數(shù)相連的一邊),其它運(yùn)算符(包括大多數(shù)二目運(yùn)算符和三目運(yùn)算符“?:”兩邊均加一空格,“(”、“)”運(yùn)算符在其內(nèi)側(cè)空一格,在作函

      數(shù)定義時(shí)還可據(jù)情況多空或不空格來(lái)對(duì)齊,但在函數(shù)實(shí)現(xiàn)時(shí)可以不用。“,”運(yùn)算符只在其后空一格,需對(duì)齊時(shí)也可不空或多空格,“sizeof”運(yùn)算符建議也在其后空一格,不論是否有括號(hào),對(duì)語(yǔ)句行后加的注釋?xiě)?yīng)用適當(dāng)空格與語(yǔ)句隔開(kāi)并盡可能對(duì)齊。

      3、對(duì)齊

      原則上關(guān)系密切的行應(yīng)對(duì)齊,對(duì)齊包括類型、修飾、名稱、參數(shù)等各部分對(duì)齊。另每一行的長(zhǎng)度不應(yīng)超過(guò)屏幕太多,必要時(shí)適當(dāng)換行,換行時(shí)盡可能在“,”處或運(yùn)算符處,換行后最好以運(yùn)算符打頭,并且以下各行均以該語(yǔ)句首行縮進(jìn),但該語(yǔ)句仍以首行的縮進(jìn)為準(zhǔn),即如其下一行為“{”應(yīng)與首行對(duì)齊。

      變量定義最好通過(guò)添加空格形成對(duì)齊,同一類型的變量最好放在一起。

      4、空行

      程序文件結(jié)構(gòu)各部分之間空兩行,若不必要也可只空一行,各函數(shù)實(shí)現(xiàn)之間一般空兩行,由于BCB會(huì)自動(dòng)產(chǎn)生一行“//------”做分隔,另因每個(gè)函數(shù)還要有函數(shù)說(shuō)明注釋,故通常只需空一行或不空,但對(duì)于沒(méi)有函數(shù)說(shuō)明的情況至少應(yīng)再空一行。對(duì)自己寫(xiě)的函數(shù),建議也加上“//------”做分隔。函數(shù)內(nèi)部數(shù)據(jù)與代碼之間應(yīng)空至少一行,代碼中適當(dāng)處應(yīng)以空行空開(kāi),建議在代碼中出現(xiàn)變量聲明時(shí),在其前空一行。類中四個(gè)“p”之間至少空一行,在其中的數(shù)據(jù)與函數(shù)之間也應(yīng)空行。

      5、注釋

      對(duì)注釋有以下三點(diǎn)要求: A.必須是有意義。B.必須正確的描述了程序。C.必須是最新的。

      注釋必不可少,但也不應(yīng)過(guò)多,以下是四種必要的注釋: A.標(biāo)題、附加說(shuō)明。

      B.函數(shù)說(shuō)明。對(duì)幾乎每個(gè)函數(shù)都應(yīng)有適當(dāng)?shù)恼f(shuō)明,通常加在函數(shù)實(shí)現(xiàn)之前,在沒(méi)有函數(shù)實(shí)現(xiàn)部分的情況下則加在函數(shù)原型前,其內(nèi)容主要是函數(shù)的功能、目的、算法等說(shuō)明,參數(shù)說(shuō)明、返回值說(shuō)明等,必要時(shí)還要有一些如特別的軟硬件要求等說(shuō)明。C.在代碼不明晰或不可移植處必須有一定的說(shuō)明。D.及少量的其它注釋。

      注釋有塊注釋和行注釋兩種,分別是指:“/**/”和“//”建議對(duì)A用塊注釋,D用行注釋,B、C則視情況而定,但應(yīng)統(tǒng)一,至少在一個(gè)單元中B類注釋形式應(yīng)統(tǒng)一。

      6、代碼長(zhǎng)度:

      對(duì)于每一個(gè)函數(shù)建議盡可能控制其代碼長(zhǎng)度為53行左右,超過(guò)53行的代碼要重新考慮將其拆分為兩個(gè)或兩個(gè)以上的函數(shù)。函數(shù)拆分規(guī)則應(yīng)該一不破壞原有算法為基礎(chǔ),同時(shí)拆分出來(lái)的部分應(yīng)該是可以重復(fù)利用的。對(duì)于在多個(gè)模塊或者窗體中都要用到的重復(fù)性代碼,完全可以將起獨(dú)立成為一個(gè)具備公用性質(zhì)的函數(shù),放置于一個(gè)公用模塊中(Common.cpp/Common.h)。

      第四篇:黑馬程序員C語(yǔ)言教程: CC++培訓(xùn)專家-編寫(xiě)高效C語(yǔ)言的四大絕招

      傳智播客C/C++培訓(xùn)專家:編寫(xiě)高效C語(yǔ)言的四大絕招

      C語(yǔ)言是很多程序猿的入門(mén)語(yǔ)言,而且C語(yǔ)言也是一門(mén)用不過(guò)時(shí)的語(yǔ)言。編寫(xiě)高效簡(jiǎn)潔的C語(yǔ)言代碼,是許多軟件工程師追求的目標(biāo)。今天傳智播客C/C++培訓(xùn)專家針對(duì)編程工作中的一些體會(huì)和經(jīng)驗(yàn)給大家做相關(guān)的闡述。

      第一招:以空間換時(shí)間

      計(jì)算機(jī)程序中最大的矛盾是空間和時(shí)間的矛盾,那么,從這個(gè)角度出發(fā)逆向思維來(lái)考慮程序的效率問(wèn)題,我們就有了解決問(wèn)題的第1招--以空間換時(shí)間。比如說(shuō)字符串的賦值: 方法A:通常的辦法 #define LEN 32 char string1 [LEN];memset(string1, 0, LEN);strcpy(string1, “This is a example!”);方法B:

      const char string2[LEN] =“This is a example!”;char * cp;cp = string2;

      從上面的例子可以看出,A和B的效率是不能比的。在同樣的存儲(chǔ)空間下,B直接使用指針就可以操作了,而A需要調(diào)用兩個(gè)字符函數(shù)才能完成。B的缺點(diǎn)在于靈活性沒(méi)有A好。在需要頻繁更改一個(gè)字符串內(nèi)容的時(shí)候,A具有更好的靈活性;如果采用方法B,則需要預(yù)存許多字符串,雖然占用了大量的內(nèi)存,但是獲得了程序執(zhí)行的高效率。

      第二招:數(shù)學(xué)方法解決問(wèn)題

      現(xiàn)在我們演繹高效C語(yǔ)言編寫(xiě)的第二招--采用數(shù)學(xué)方法來(lái)解決問(wèn)題。數(shù)學(xué)是計(jì)算機(jī)之母,沒(méi)有數(shù)學(xué)的依據(jù)和基礎(chǔ),就沒(méi)有計(jì)算機(jī)的發(fā)展,所以在編寫(xiě)程序的時(shí)候,采用一些數(shù)學(xué)方法會(huì)對(duì)程序的執(zhí)行效率有數(shù)量級(jí)的提高。舉例如下,求 1~100的和。方法C: int I , j;for(I = 1;I<=100;I ++){ j += I;} 方法D int I;I =(100 *(1+100))/ 2;

      這個(gè)例子是我印象最深的一個(gè)數(shù)學(xué)用例,是我的計(jì)算機(jī)啟蒙老師考我的。當(dāng)時(shí)我只有小學(xué)三年級(jí),可惜我當(dāng)時(shí)不知道用公式 N×(N+1)

      / 2 來(lái)解決這個(gè)問(wèn)題。方法E循環(huán)了100次才解決問(wèn)題,也就是說(shuō)最少用了100個(gè)賦值,100個(gè)判斷,200個(gè)加法(I和j);而方法F僅僅用了1個(gè)加法,1 次乘法,1次除法。效果自然不言而喻。所以,現(xiàn)在我在編程序的時(shí)候,更多的是動(dòng)腦筋找規(guī)律,最大限度地發(fā)揮數(shù)學(xué)的威力來(lái)提高程序運(yùn)行的效率。

      第三招:使用位操作

      實(shí)現(xiàn)高效的C語(yǔ)言編寫(xiě)的第三招——使用位操作。減少除法和取模的運(yùn)算。在計(jì)算機(jī)程序中數(shù)據(jù)的位是可以操作的最小數(shù)據(jù)單位,理論上可以用“位運(yùn)算”來(lái)完成所有的運(yùn)算和操作。一般的位操作是用來(lái)控制硬件的,或者做數(shù)據(jù)變換使用,但是,靈活的位操作可以有效地提高程序運(yùn)行的效率。舉例如下: 方法E int I,J;I = 257 /8;J = 456 % 32;方法F int I,J;I = 257 >>3;J = 456-(456 >> 4 << 4);在字面上好像F比E麻煩了好多,但是,仔細(xì)查看產(chǎn)生的匯編代碼就會(huì)明白,方法E調(diào)用了基本的取模函數(shù)和除法函數(shù),既有函數(shù)調(diào)用,還有很多匯編代碼和寄存器參與運(yùn)算;而方法F則僅僅是幾句相關(guān)的匯編,代碼更簡(jiǎn)潔,效率更高。當(dāng)然,由于編譯器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 來(lái)看,效率的差距還是不小。相關(guān)匯編代碼就不在這里列舉了。

      運(yùn)用這招需要注意的是,因?yàn)镃PU的不同而產(chǎn)生的問(wèn)題。比如說(shuō),在PC上用這招編寫(xiě)的程序,并在PC上調(diào)試通過(guò),在移植到一個(gè)16位機(jī)平臺(tái)上的時(shí)候,可能會(huì)產(chǎn)生代碼隱患。所以只有在一定技術(shù)進(jìn)階的基礎(chǔ)下才可以使用這招。用移位實(shí)現(xiàn)乘除法運(yùn)算

      a=a*4;

      b=b/4;

      可以改為:

      a=a<<2;

      b=b>>2;

      說(shuō)明:

      除2 = 右移1位 乘2 = 左移1位

      除4 = 右移2位 乘4 = 左移2位

      除8 = 右移3位 乘8 = 左移3位

      ......通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的C編譯器,用移位的方法得到代碼比調(diào)用乘除法子程序生成的代碼效率高。

      第四招:匯編嵌入

      高效C語(yǔ)言編程的必殺技,第四招——嵌入?yún)R編?!霸谑煜R編語(yǔ)言的人眼里,C語(yǔ)言編寫(xiě)的程序都是垃圾”。這種說(shuō)法雖然偏激了一些,但是卻有它的道理。匯編語(yǔ)言是效率最高的計(jì)算機(jī)語(yǔ)言,但是,不可能靠著它來(lái)寫(xiě)一個(gè)操作系統(tǒng)吧?所以,為了獲得程序的高效率,我們只好采用變通的方法--嵌入?yún)R編,混合編程。舉例如下,將數(shù)組一賦值給數(shù)組二,要求每一字節(jié)都相符。char string1[1024],string2[1024];方法G int i;for(i =0;i<1024;i++)*(string2 + i)= *(string1 + i)方法H #ifdef _PC_ int I;for(I =0;I<1024;I++)*(string2 + I)= *(string1 + I);#else #ifdef _ARM_ __asm

      { MOV R0,string1 MOV R1,string2 MOV R2,#0 loop: LDMIA R0!, [R3-R11] STMIA R1!, [R3-R11] ADD R2,R2,#8 CMP R2, #400 BNE loop } #endif 方法G是最常見(jiàn)的方法,使用了1024次循環(huán);方法H則根據(jù)平臺(tái)不同做了區(qū)分,在ARM平臺(tái)下,用嵌入?yún)R編僅用128次循環(huán)就完成了同樣的操作。這里有朋友會(huì)說(shuō),為什么不用標(biāo)準(zhǔn)的內(nèi)存拷貝函數(shù)呢?這是因?yàn)樵谠磾?shù)據(jù)里可能含有數(shù)據(jù)為0的字節(jié),這樣的話,標(biāo)準(zhǔn)庫(kù)函數(shù)會(huì)提前結(jié)束而不會(huì)完成我們要求的操作。這個(gè)例程典型應(yīng)用于LCD數(shù)據(jù)的拷貝過(guò)程。根據(jù)不同的CPU,熟練使用相應(yīng)的嵌入?yún)R編,可以大大提高程序執(zhí)行的效率。

      雖然是必殺技,但是如果輕易使用會(huì)付出慘重的代價(jià)。這是因?yàn)?,使用了嵌入?yún)R編,便限制了程序的可移植性,使程序在不同平臺(tái)移植的過(guò)程中,臥虎藏龍,險(xiǎn)象環(huán)生!同時(shí)該招數(shù)也與現(xiàn)代軟件工程的思想相違背,只有在迫不得已的情況下才可以采用。

      今天分享到這里,大家有遇到什么問(wèn)題可以向“傳智播客C/C++培訓(xùn)專家”留言哦!

      第五篇:黑馬程序員C語(yǔ)言教程:QSignalMapper的使用

      QSignalMapper信號(hào)轉(zhuǎn)發(fā)器的使用 適用范圍

      簡(jiǎn)單的理解,可以把SignalMapper這個(gè)類看成是信號(hào)的翻譯和轉(zhuǎn)發(fā)器,它可以把一個(gè)無(wú)參數(shù)的信號(hào)翻譯成帶int參數(shù)、QString參數(shù)、QObject*參數(shù)或者QWidget*參數(shù)的信號(hào),并將之轉(zhuǎn)發(fā)。這么一說(shuō)大家有沒(méi)有聯(lián)想到該類的適用范圍呢?比如說(shuō):我有一堆的button,可以把clicked事件放在一個(gè)函數(shù)里處理,只要給button編個(gè)號(hào)或者給button起個(gè)名就行了,這樣就不用給每個(gè)button寫(xiě)一個(gè)slot了,豈不是很方便?

      使用方法

      ? 首先把原始的信號(hào)連接到QSignalMapper類的map()槽函數(shù),這樣QSignalMapper能在第一時(shí)間接收到原始信號(hào);

      ? 其次調(diào)用setMapping方法建立映射關(guān)系,告訴QSignalMapper對(duì)象怎樣去處理原始信號(hào)。(映射關(guān)系通過(guò)對(duì)應(yīng)一個(gè)整數(shù)、字符串或者QWidget*實(shí)現(xiàn))

      ? 最后通過(guò)接收QSignalMapper類轉(zhuǎn)化后的帶參信號(hào)mapped()與槽函數(shù)連接,在槽函數(shù)中獲得需要的數(shù)據(jù),并作出對(duì)應(yīng)的處理。

      ? 映射的關(guān)系可以通過(guò)removeMappings()被移除。

      示例:

      // 頭文件

      classWidget:publicQWidget { Q_OBJECT

      public: explicitWidget(QWidget*parent=0);~Widget();

      publicslots: //自定義槽函數(shù)

      voidslotClicked(QStringtext);

      private: Ui::Widget*ui;QSignalMapper*signalMapper;};// 源文件

      Widget::Widget(QWidget*parent): QWidget(parent), ui(newUi::Widget){ ui->setupUi(this);

      QStringListtextList;signalMapper=newQSignalMapper(this);// 布局管理器

      QVBoxLayout*vLayout=newQVBoxLayout(this);textList<<“北京”<<“上?!?<“廣州”<<“南京”<<“天津”;for(inti=0;i<5;++i){ // 動(dòng)態(tài)創(chuàng)建按鈕

      QPushButton*button=newQPushButton(textList[i]);button->setFixedSize(50,30);//按鈕的信號(hào)和QSignalMapper類的map()槽函數(shù)關(guān)聯(lián)

      // 原始信號(hào)傳遞給signalMapper connect(button,SIGNAL(clicked(bool)),signalMapper,SLOT(map()));//設(shè)置signalmapper的轉(zhuǎn)發(fā)規(guī)則, 轉(zhuǎn)發(fā)為參數(shù)為QString類型的

      // 信號(hào),并把textList[i]的內(nèi)容作為實(shí)參傳遞。

      signalMapper->setMapping(button,textList[i]);vLayout->addWidget(button);} //將轉(zhuǎn)發(fā)的信號(hào)連接到最終的槽函數(shù)

      connect(signalMapper,SIGNAL(mapped(QString)),this,SLOT(slotClicked(QString)));}

      // 自定義槽函數(shù)

      voidWidget::slotClicked(QStringtext){ QMessageBox::information(this,“ButtonClicked”,text);}

      當(dāng)用戶點(diǎn)擊不同的按鈕,會(huì)彈出不同的對(duì)話框,對(duì)話框中顯示的內(nèi)容為按鈕的標(biāo)題。

      下載黑馬程序員C語(yǔ)言教程: cc++專家_交你如何使用c++中的類型轉(zhuǎn)換word格式文檔
      下載黑馬程序員C語(yǔ)言教程: cc++專家_交你如何使用c++中的類型轉(zhuǎn)換.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦