色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

幾個(gè)實(shí)用的C語(yǔ)言知識(shí)點(diǎn)

硬件攻城獅 ? 來(lái)源:硬件攻城獅 ? 2023-02-15 10:25 ? 次閱讀

一、變量與值得比較

1、布爾變量與零值的比較

不可將布爾變量直接與 TRUE、 FALSE或者 1、 0進(jìn)行比較 。據(jù)布爾類(lèi)型的語(yǔ)義,零值為“ 假”(記為 FALSE),任何非零值都是“ 真”(記為T(mén)RUE)。

TRUE的值究竟是什么并沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。例如 Visual C++ 將 TRUE定義為 1, 而 Visual Basic則將 TRUE定義為-1 。

假設(shè)布爾變量名字為 flag,它與零值比較的標(biāo)準(zhǔn) if語(yǔ)句如下:

if (flag) // 表示flag為真
if (!flag) // 表示flag為假

其它的用法都屬于不良風(fēng)格,例如:

if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)

2、整形變量與零值的比較

應(yīng)當(dāng)將整型變量用“ ==” 或“ !=” 直接與 0比較 。假設(shè)整型變量的名字為 value,它與零值比較的標(biāo)準(zhǔn) if語(yǔ)句如下:

if (value == 0)
if (value != 0)

不可模仿布爾變量的風(fēng)格而寫(xiě)成:

if (value) // 會(huì)讓人誤解 value是布爾變量
if (!value)

3、浮點(diǎn)變量與零值的比較

不可將浮點(diǎn)變量用“ ==” 或“ !=” 與任何數(shù)字比較 。千萬(wàn)要留意, 無(wú)論是 float還是 double類(lèi)型的變量, 都有精度限制。

所以一定要避免將浮點(diǎn)變量用“ ==” 或“ !=” 與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“ >=” 或“ <=” 形式。假設(shè)浮點(diǎn)變量的名字為 x,應(yīng)當(dāng) 將:

if (x == 0.0) // 隱含錯(cuò)誤的比

轉(zhuǎn)化為:

if ((x>=-EPSINON) && (x<=EPSINON))

其中 EPSINON是允許的誤差(即精度) 。

4、指針變量與零值的比較

應(yīng)當(dāng)將指針變量用“ ==” 或“ !=” 與 NULL比較 。指針變量的零值是“ 空”(記為 NULL)。

盡管 NULL 的值與 0相同,但是兩者意義不同。假設(shè)指針變量的名字為 p,它與零值比較的標(biāo)準(zhǔn) if語(yǔ)句如下:

if (p == NULL) // p與 NULL顯式比較,強(qiáng)調(diào) p是指針變量
if (p != NULL)

不要寫(xiě)成:

if (p == 0) // 容易讓人誤解 p是整型變量
if (p != 0)

或者:

if (p) // 容易讓人誤解p是布爾變量
if (!p)

二、變量及基本運(yùn)算

1、整型數(shù)

如果我們確定整數(shù)非負(fù),就應(yīng)該使用unsigned int而不是int。

有些處理器處理無(wú)符號(hào)unsigned 整形數(shù)的效率遠(yuǎn)遠(yuǎn)高于有符號(hào)signed整形數(shù)(這是一種很好的做法,也有利于代碼具體類(lèi)型的自解釋)。

因此,在一個(gè)緊密循環(huán)中,聲明一個(gè)int整形變量的最好方法是:

registerunsignedint variable_name;

記住,整形in的運(yùn)算速度高浮點(diǎn)型float,并且可以被處理器直接完成運(yùn)算,而不需要借助于FPU(浮點(diǎn)運(yùn)算單元)或者浮點(diǎn)型運(yùn)算庫(kù)。

盡管這不保證編譯器一定會(huì)使用到寄存器存儲(chǔ)變量,也不能保證處理器處理能更高效處理unsigned整型,但這對(duì)于所有的編譯器是通用的。

例如在一個(gè)計(jì)算包中,如果需要結(jié)果精確到小數(shù)點(diǎn)后兩位,我們可以將其乘以100,然后盡可能晚的把它轉(zhuǎn)換為浮點(diǎn)型數(shù)字。

2、除法和取余數(shù)

在標(biāo)準(zhǔn)處理器中,對(duì)于分子和分母,一個(gè)32位的除法需要使用20至140次循環(huán)操作。

除法函數(shù)消耗的時(shí)間包括一個(gè)常量時(shí)間加上每一位除法消耗的時(shí)間。

Time (numerator / denominator) = C0 + C1* log2 (numerator / denominator)
     = C0 + C1 * (log2 (numerator) - log2 (denominator)).

對(duì)于ARM處理器,這個(gè)版本需要20+4.3N次循環(huán)。這是一個(gè)消耗很大的操作,應(yīng)該盡可能的避免執(zhí)行。

有時(shí),可以通過(guò)乘法表達(dá)式來(lái)替代除法。例如,假如我們知道b是正數(shù)并且b*c是個(gè)整數(shù),那么(a/b)>c可以改寫(xiě)為a>(c*b)

如果確定操作數(shù)是無(wú)符號(hào)unsigned的,使用無(wú)符號(hào)unsigned除法更好一些,因?yàn)樗扔蟹?hào)signed除法效率高。

3、取模的一種替代方法

我們使用取余數(shù)操作符來(lái)提供算數(shù)取模。但有時(shí)可以結(jié)合使用if語(yǔ)句進(jìn)行取模操作。考慮如下兩個(gè)例子:

uint modulo_func1 (uint count)
{
   return (++count % 60);
}

uint modulo_func2 (uint count)
{
   if (++count >= 60)
      count = 0;
   return (count);
}

優(yōu)先使用if語(yǔ)句,而不是取余數(shù)運(yùn)算符,因?yàn)閕f語(yǔ)句的執(zhí)行速度更快。這里注意新版本函數(shù)只有在我們知道輸入的count結(jié)余0至59時(shí)在能正確的工作。

4、使用數(shù)組下標(biāo)

如果你想給一個(gè)變量設(shè)置一個(gè)代表某種意思的字符值,你可能會(huì)這樣做:

switch ( queue )
{
case0 :   letter = 'W';
   break;
case1 :   letter = 'S';
   break;
case2 :   letter = 'U';
   break;
}

或者這樣做:

if ( queue == 0 )
  letter = 'W';
elseif ( queue == 1 )
  letter = 'S';
else
  letter = 'U';

一種更簡(jiǎn)潔、更快的方法是使用數(shù)組下標(biāo)獲取字符數(shù)組的值。如下:

staticchar *classes="WSU";
letter = classes[queue];

5、使用別名

考慮如下的例子:

void func1( int *data )
{
    int i;
 
    for(i=0; i<10; i++)
    {
          anyfunc( *data, i);
    }
}

盡管*data的值可能從未被改變,但編譯器并不知道anyfunc函數(shù)不會(huì)修改它,所以程序必須在每次使用它的時(shí)候從內(nèi)存中讀取它。如果我們知道變量的值不會(huì)被改變,那么就應(yīng)該使用如下的編碼:

void func1( int *data )
{
    int i;
    int localdata;
 
    localdata = *data;
    for(i=0; i<10; i++)
    {
          anyfunc ( localdata, i);
    }
}

這為編譯器優(yōu)化代碼提供了條件。

6、局部變量的類(lèi)型

我們應(yīng)該盡可能的不使用char和short類(lèi)型的局部變量。對(duì)于char和short類(lèi)型,編譯器需要在每次賦值的時(shí)候?qū)⒕植孔兞繙p少到8或者16位。

這對(duì)于有符號(hào)變量稱之為有符號(hào)擴(kuò)展,對(duì)于無(wú)符號(hào)變量稱之為零擴(kuò)展。這些擴(kuò)展可以通過(guò)寄存器左移24或者16位,然后根據(jù)有無(wú)符號(hào)標(biāo)志右移相同的位數(shù)實(shí)現(xiàn),這會(huì)消耗兩次計(jì)算機(jī)指令操作(無(wú)符號(hào)char類(lèi)型的零擴(kuò)展僅需要消耗一次計(jì)算機(jī)指令)。

可以通過(guò)使用int和unsigned int類(lèi)型的局部變量來(lái)避免這樣的移位操作。這對(duì)于先加載數(shù)據(jù)到局部變量,然后處理局部變量數(shù)據(jù)值這樣的操作非常重要。無(wú)論輸入輸出數(shù)據(jù)是8位或者16位,將它們考慮為32位是值得的。

考慮下面的三個(gè)函數(shù):

int wordinc (int a)
{
   return a + 1;
}
short shortinc (short a)
{
    return a + 1;
}
char charinc (char a)
{
    return a + 1;
}

盡管結(jié)果均相同,但是第一個(gè)程序片段運(yùn)行速度高于后兩者。

三、循環(huán)語(yǔ)句

1、多重循環(huán)

在多重循環(huán)中, 如果有可能, 應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最內(nèi)層, 最短的循環(huán)放在最外層,以減少 CPU 跨切循環(huán)層的次數(shù)。例如示例 4-4(b)的效率比示例4-4(a)的高 :

3e64f6c4-ac8d-11ed-bfe3-dac502259ad0.png

2、循環(huán)體內(nèi)的判斷

如果循環(huán)體內(nèi)存在邏輯判斷, 并且循環(huán)次數(shù)很大, 宜將邏輯判斷移到循環(huán)體的外面。

示例 4-4(c)的程序比示例 4-4(d)多執(zhí)行了 N-1次邏輯判斷。并且由于前者老要進(jìn)行邏輯判斷,打斷了循環(huán)“ 流水線” 作業(yè),使得編譯器不能對(duì)循環(huán)進(jìn)行優(yōu)化處理, 降低了效率。

如果N非常大, 最好采用示例 4-4(d)的寫(xiě)法, 可以提高效率。如果 N非常小,兩者效率差別并不明顯,采用示例 4-4(c)的寫(xiě)法比較好, 因?yàn)槌绦蚋雍?jiǎn)潔。

3e7a89a8-ac8d-11ed-bfe3-dac502259ad0.png

3、for 語(yǔ)句的循環(huán)控制變量

不可在 for 循環(huán)體內(nèi)修改循環(huán)變量,防止 for 循環(huán)失去控制 。建議 for語(yǔ)句的循環(huán)控制變量的取值采用“ 半開(kāi)半閉區(qū)間” 寫(xiě)法。

示例 4-5(a)中的 x值屬于半開(kāi)半閉區(qū)間“ 0 =< x < N”,起點(diǎn)到終點(diǎn)的間隔為 N,循環(huán)次數(shù)為 N。

示例 4-5(b)中的 x值屬于閉區(qū)間“ 0 =< x <= N-1”,起點(diǎn)到終點(diǎn)的間隔為 N-1,循環(huán)次數(shù)為 N。

相比之下,示例 4-5(a)的寫(xiě)法更加直觀,盡管兩者的功能是相同的 。

3e979cb4-ac8d-11ed-bfe3-dac502259ad0.png

4、更快的for()循環(huán)

這是一個(gè)簡(jiǎn)單而高效的概念。通常,我們編寫(xiě)for循環(huán)代碼如下:

for( i=0;  i<10;  i++){ ... }

i從0循環(huán)到9。如果我們不介意循環(huán)計(jì)數(shù)的順序,我們可以這樣寫(xiě):

for( i=10; i--; ) { ... }

這樣快的原因是因?yàn)樗芨斓奶幚韎的值–測(cè)試條件是:i是非零的嗎?如果這樣,遞減i的值。對(duì)于上面的代碼,處理器需要計(jì)算“計(jì)算i減去10,其值非負(fù)嗎?

如果非負(fù),i遞增并繼續(xù)”。簡(jiǎn)單的循環(huán)卻有很大的不同。這樣,i從9遞減到0,這樣的循環(huán)執(zhí)行速度更快。

這里的語(yǔ)法有點(diǎn)奇怪,但確實(shí)合法的。循環(huán)中的第三條語(yǔ)句是可選的(無(wú)限循環(huán)可以寫(xiě)為for(;;))。如下代碼擁有同樣的效果:

for(i=10; i; i--){}

或者更進(jìn)一步的:

for(i=10; i!=0; i--){}

這里我們需要記住的是循環(huán)必須終止于0(因此,如果在50到80之間循環(huán),這不會(huì)起作用),并且循環(huán)計(jì)數(shù)器是遞減的。使用遞增循環(huán)計(jì)數(shù)器的代碼不享有這種優(yōu)化。

四、指針

我們應(yīng)該盡可能的使用引用值的方式傳遞結(jié)構(gòu)數(shù)據(jù),也就是說(shuō)使用指針,否則傳遞的數(shù)據(jù)會(huì)被拷貝到棧中,從而降低程序的性能。

函數(shù)通過(guò)參數(shù)接受結(jié)構(gòu)數(shù)據(jù)的指針,如果我們確定不改變數(shù)據(jù)的值,我們需要將指針指向的內(nèi)容定義為常量。例如:

void print_data_of_a_structure ( const Thestruct  *data_pointer)
{
    ...printf contents of the structure...
}

這個(gè)示例告訴編譯器函數(shù)不會(huì)改變外部參數(shù)的值(使用const修飾),并且不用在每次訪問(wèn)時(shí)都進(jìn)行讀取。

同時(shí),確保編譯器限制任何對(duì)只讀結(jié)構(gòu)的修改操作從而給予結(jié)構(gòu)數(shù)據(jù)額外的保護(hù)。

五、懶檢測(cè)開(kāi)發(fā)

if(a>10 && b=4)這樣的語(yǔ)句中,確保AND表達(dá)式的第一部分最可能較快的給出結(jié)果(或者最早、最快計(jì)算),這樣第二部分便有可能不需要執(zhí)行。

六、用switch()函數(shù)替代if…else…

對(duì)于涉及if…else…else…這樣的多條件判斷,例如:

if( val == 1)
    dostuff1();
elseif (val == 2)
    dostuff2();
elseif (val == 3)
    dostuff3();

使用switch可能更快:

switch( val )
{
    case1: dostuff1(); break;

    case2: dostuff2(); break;

    case3: dostuff3(); break;
}

在if()語(yǔ)句中,如果最后一條語(yǔ)句命中,之前的條件都需要被測(cè)試執(zhí)行一次。switch允許我們不做額外的測(cè)試。如果必須使用if…else…語(yǔ)句,將最可能執(zhí)行的放在最前面。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137400
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49229
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28441

原文標(biāo)題:幾個(gè)實(shí)用的 C 語(yǔ)言知識(shí)點(diǎn)

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一些小眾的C語(yǔ)言知識(shí)點(diǎn)

    一些小眾的C語(yǔ)言知識(shí)點(diǎn),可能會(huì)比較有趣或者怪異,分享給大家看一下。
    發(fā)表于 09-26 10:16 ?681次閱讀

    嵌入式C語(yǔ)言知識(shí)點(diǎn)總結(jié)

    怎么才能做好嵌入式開(kāi)發(fā)?學(xué)好C語(yǔ)言吧!今天就來(lái)推薦一篇大佬寫(xiě)的嵌入式C語(yǔ)言知識(shí)點(diǎn)總結(jié)。
    發(fā)表于 09-27 09:53 ?1195次閱讀

    C語(yǔ)言鏈表知識(shí)點(diǎn)(2)

    C語(yǔ)言鏈表知識(shí)點(diǎn)(2)
    發(fā)表于 08-22 10:38 ?344次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>鏈表<b class='flag-5'>知識(shí)點(diǎn)</b>(2)

    C51單片機(jī)及C語(yǔ)言知識(shí)點(diǎn)必備秘籍

      電子發(fā)燒友網(wǎng)訊:應(yīng)廣大電子發(fā)燒友網(wǎng)讀者要求,本電子書(shū)《C51單片機(jī)及C語(yǔ)言知識(shí)點(diǎn)必備秘籍》為《單片機(jī)關(guān)鍵知識(shí)點(diǎn)全攻略》單片機(jī)系列教程及《
    發(fā)表于 07-30 13:59 ?9865次閱讀

    【信盈達(dá)】C語(yǔ)言知識(shí)點(diǎn)的總結(jié)

    、算法說(shuō)明:學(xué)習(xí)單片機(jī)C一般只需要前9個(gè)知識(shí)點(diǎn)即可進(jìn)行產(chǎn)品開(kāi)發(fā),但要學(xué)習(xí)嵌入式C還需要要掌握:指針、結(jié)構(gòu)體、鏈表、宏定義等知識(shí)點(diǎn)。二、單片機(jī)C
    發(fā)表于 10-08 14:41

    C語(yǔ)言程序小知識(shí)點(diǎn)總結(jié)

    C語(yǔ)言總結(jié)(stm32嵌入式開(kāi)發(fā))文章目錄C語(yǔ)言總結(jié)(stm32嵌入式開(kāi)發(fā))c程序小知識(shí)點(diǎn)總結(jié)1
    發(fā)表于 11-05 07:45

    淺談幾個(gè)C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)

    文章目錄前言一、位操作二、使用步驟前言這里主要是簡(jiǎn)單的復(fù)習(xí)一下幾個(gè) C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn),引導(dǎo)那些 C 語(yǔ)
    發(fā)表于 12-09 07:14

    C51語(yǔ)言的基礎(chǔ)知識(shí)點(diǎn)實(shí)例講解

    本文檔的主要內(nèi)容詳細(xì)介紹的是C51語(yǔ)言的18個(gè)基礎(chǔ)知識(shí)點(diǎn)實(shí)例講解包括了:C51控制語(yǔ)句和C51數(shù)組和指針
    發(fā)表于 06-04 17:52 ?12次下載
    <b class='flag-5'>C</b>51<b class='flag-5'>語(yǔ)言</b>的基礎(chǔ)<b class='flag-5'>知識(shí)點(diǎn)</b>實(shí)例講解

    C語(yǔ)言學(xué)習(xí)入門(mén)知識(shí)點(diǎn)/干貨

    C語(yǔ)言知識(shí)點(diǎn)總結(jié)
    的頭像 發(fā)表于 07-18 17:54 ?5972次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>學(xué)習(xí)入門(mén)<b class='flag-5'>知識(shí)點(diǎn)</b>/干貨

    STM32中重要的C語(yǔ)言知識(shí)點(diǎn)總結(jié)

    的一些例程中,遇到不懂的C語(yǔ)言知識(shí),再去查相關(guān)的知識(shí)點(diǎn),這樣印象才會(huì)深刻些。 下面就列出了一些STM32中重要的C
    的頭像 發(fā)表于 04-25 16:42 ?2835次閱讀
    STM32中重要的<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>知識(shí)點(diǎn)</b>總結(jié)

    嵌入式C語(yǔ)言知識(shí)點(diǎn)總結(jié)

    導(dǎo)讀:怎么做好嵌入式?相信這個(gè)問(wèn)題無(wú)論問(wèn)誰(shuí)你都會(huì)得到一句學(xué)好C語(yǔ)言!今天推薦一篇大佬寫(xiě)的嵌入式C語(yǔ)言知識(shí)點(diǎn)總結(jié),非常值得一讀。
    的頭像 發(fā)表于 04-13 11:12 ?2740次閱讀

    C語(yǔ)言C++面試知識(shí)點(diǎn)總結(jié)

    相對(duì)而言,C語(yǔ)言C++相關(guān)的面試題比較少見(jiàn),沒(méi)有Java方向?qū)懙娜四敲炊啵@是一篇 C 語(yǔ)言C
    的頭像 發(fā)表于 05-12 14:59 ?1488次閱讀

    C語(yǔ)言C++面試知識(shí)點(diǎn)總結(jié)

    相對(duì)而言,C語(yǔ)言C++相關(guān)的面試題比較少見(jiàn),沒(méi)有Java方向?qū)懙娜四敲炊啵@是一篇 C 語(yǔ)言C
    的頭像 發(fā)表于 05-13 11:59 ?1889次閱讀

    C語(yǔ)言最重要的知識(shí)點(diǎn)

    C語(yǔ)言知識(shí)點(diǎn)總結(jié).doc
    發(fā)表于 02-16 16:37 ?9次下載

    C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)

    C語(yǔ)言是單片機(jī)開(kāi)發(fā)中的必備基礎(chǔ)知識(shí),這里就列舉部分STM32學(xué)習(xí)中會(huì)遇見(jiàn)的C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)
    的頭像 發(fā)表于 05-31 09:07 ?978次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>基礎(chǔ)<b class='flag-5'>知識(shí)點(diǎn)</b>
    主站蜘蛛池模板: 欧美精品熟妇乱| CHESENGAY痞帅警察GV| 99热在线观看精品| 国产亚洲精品成人a在线| 老熟女毛茸茸浓毛| 三级黄色高清视频| 精品视频在线一区| 青草视频久久| 一边吃奶一边添P好爽故事| 草草久久久无码国产专区全集观看| 好吊妞国产欧美日韩视频| 全黄h全肉细节文在线观看| 夜色伊甸园| 国产ts在线| 门事件快播| 亚洲精品免播放器在线观看| xxxx俄罗斯1819| 久久精品熟一区二区三区| 四虎影院网红美女| AV国产乱码一区二区三视频| 九九热这里有精品| 午夜福利视频极品国产83| ⅹxx日本护土| 久久大香线蕉综合爱| 无遮挡午夜男女XX00动态| SM双性精跪趴灌憋尿调教H| 久久日本片精品AAAAA国产| 羞羞答答影院在线| 俄罗斯美女z0z0z0在线| 年轻夫妇韩剧中文版免费观看| 亚洲一区成人| 国产人在线成免费视频| 日日摸天天添天天添无码蜜臀| 99re久久热最新地址一| 久久精品AV一区二区无码| 亚洲国产在线观看免费视频| 丰满艳妇亲伦| 强奷乱码中文字幕熟女免费| 52av我爱| 久久亚洲一级α片| 艳鉧动漫1~6全集观看在线|