最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++中宏定義(#define)

 更新時間:2017年02月16日 11:43:39   作者:OlderDriver  
#define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字符串,該標識符被稱為宏名,被定義的字符串稱為替換文本。接下拉通過本文給大家分享C/C++中宏定義(#define)知識,需要的朋友參考下

#define是C語言中提供的宏定義命令,其主要目的是為程序員在編程時提供一定的方便,并能在一定程度上提高程序的運行效率,但學生在學習時往往不能 理解該命令的本質(zhì),總是在此處產(chǎn)生一些困惑,在編程時誤用該命令,使得程序的運行與預期的目的不一致,或者在讀別人寫的程序時,把運行結(jié)果理解錯誤,這對 C語言的學習很不利。

宏的定義在程序中是非常有用的,但是使用不當,就會給自身造成很大的困擾。通常這種困擾為:宏使用在計算方面。

本例子主要是在宏的計算方面,很多時候,大家都知道定義一個計算的宏,對于編譯和編程是多么的有用。現(xiàn)在定義有以下一個計算 “乘法” 的宏。

#include <stdio.h>
#define MUL(a) ((a)*(a)*(a))
int main(int argc,char *argv[])
{
 int i = 10;
 int sum = MUL(i);
 printf("MUL(%d) = %d\n",i,sum);
 return 0;  
}
</stdio.h>

  上面程序的這種做法對于非負數(shù)而言那就是沒有問題的,比如,程序中的 變量 i=10,這個時候,調(diào)用宏得到的數(shù)據(jù)如下:

  但是如何變量的數(shù)值是自加或者自減的操作的話,結(jié)果就不一樣了。

  假如我們將上面的程序變?yōu)橄旅孢@樣的

#include <stdio.h>
#define MUL(a) ((a)*(a)*(a))
int main(int argc,char *argv[])
{
 int i = 10;
 int sum = MUL(++i);
 printf("MUL(%d) = %d\n",i,sum);
 return 0;  
}
</stdio.h>

  得到的結(jié)果并不是 11 * 11 *11 = 1331這個數(shù)據(jù),而是 1872,這時候有人會問為什么?

  得到宏的朋友或者了解過宏在計算方面的朋友就會知道,這除了是宏的問題,還是本身程序員編寫這段代碼的問題。當使用了 ++i 和 i++ 的時候,

要特別注意在宏中是全部使用 ++i或者i++的,變成的格式如下

MUL(i++) ((i++)*(i++)*(i++))
 MUL(++i) ((++i)*(++i)*(++i))

  上述的做法顯然不是我們想要的計算結(jié)果,可能在我們程序中看到的是MUL(++i) 或者 MUL(i++),認為實際上是如下情況:

//當i的初始化數(shù)值為10的時候,進行i++的 MUL(i++)宏計算,即是:int i = 10;
//MUL(i ++)的數(shù)值計算結(jié)果相比是 10 * 11 * 12的,這是沒有問題的,但是 i的值呢??是11嗎??顯然不是。    MUL(i++) = 10 * 11 *12;i = ??;

  i的數(shù)值如下圖所示

  誠然,i的數(shù)值變成了 13,這是為什么呢??

  那就是因為這個MUL(a)這個宏和程序員的 “自加自減” 操作所造成的。這里先普及一下 C/C++語言的 “自加自減” 操作:

//自加自減的操作

i++ 和 ++i  ----> 這里的操作屬于++后操作,可以替換成 i = i+1 的結(jié)果。                   

    但是,當它賦值給一個變量的時候,表示的內(nèi)容和含義就有不同: (假設i = 10)

    1.  sum1 = i++;

    2.  sum2 = ++i; 

    1中的sum1的數(shù)值就是 10, i為 11

    2中的sum2的數(shù)值就是 11, i為 11

這是因為:

    i++ 操作是 先賦值給 sum1后,自己在執(zhí)行 i = i+1的操作

    ++i 操作是 先進行 i = i+ 1的操作,然后再賦值給sum2 

這樣得到的結(jié)果當然不同了,但是i最終的結(jié)果是要加1的,只不過是賦值給變量的時候會有不同

  通過對自加自減的操作進行說明,不知道大家是否明白為什么了嗎??

當 i  = 10的時候,MUL(i++)就是為  (i++)*(i++)*(i++)的計算結(jié)果,考慮到C/C++的運算符結(jié)合性, 

先計算第一個 i++,這是一個先計算后賦值的自加方式,那么這是后第一個 (i++)的數(shù)值待定為 10 ,那么第 

二個的i是因為第一個數(shù)據(jù)的 (i++)起了作用而變化的,這時候第二個(i++)的數(shù)值為11,然后加1,這時候 根 

據(jù)結(jié)合性,先計算前面兩個數(shù)據(jù),就是(i++) * (i++)的數(shù)值了,即為:10 * 11了,這時候的i數(shù)值是 12; 

然后計算第三個 i++的數(shù)值,這時候第三個i++中的i數(shù)值為 12,計算后再加1,也就是說,10 * 11 * 12之后,

i= 12 的數(shù)值在進行i++變?yōu)?13了。所以  MUL(i++) = 10 * 11 * 12 = 1320。   

  另外,在進行++i的操作和上述的情況差不多,只不過是先做自加的運算,在進行賦值。

當 i = 10的時候,MUL(++i)實際上也為 (++i)*(++i)*(++i)的方式,這時候先計算第一個 (++i),這是一 

個先計算后賦值的結(jié)合方式,那么 i = i+1 = 11;這時候準備計算第二個(++i)的時候,因為需要先計算后賦值, 

所以 第二個 ++i 之后的數(shù)值為12,但是因為i屬于同一個變量和屬性,那么第一個i也會變成 12了,這時候結(jié)合性

考慮應該是計算前兩個(++i)的結(jié)果,再與第三個(++i)計算,即(++i)*(++i) = 12 * 12;然后,我們計算第三個 

(++i)的數(shù)值,由于前面第二個++i的i值,所以第三個++i即為 13,此時,12 * 12 * 13。  

  有人可能顧慮,為什么最后不是13 * 13 * 13的呢?那不是最后都是13嗎??  ------》其實這種想法是錯誤的,

這必須先理解運算符的結(jié)合性。我們知道,當計算中遇到了括號的時候,我們先計算括號的內(nèi)容,這是我們在數(shù)學中的慣性思維。但是對于計算機而言,計算機必須 有計算的優(yōu)先級,也就是運算符的優(yōu)先級問題。首先我們計算前面兩個括號的內(nèi)容,以為兩個括號之間有乘號(*),所以計算前面兩個(++i)之后,必須進行乘法計算,這就是優(yōu)先級中的乘法計算,自左向右計算。所以結(jié)果變?yōu)榱?12 * 12的最終結(jié)果在和第三個括號的(++i)計算,就是144 * (++ i) = 144 * 13;

   所以MUL(++i)的結(jié)果如下:

總結(jié):

  慎用宏在計算方面的,但是宏的有點還是很多的,對于C語言來說,宏可以減少運行的時間。在C++中,宏由于不會對類型進行檢查,安全性不夠,所以建議使用const來

進行使用,這樣可以保證類型一致。這是C/C++對宏的嚴謹性進行優(yōu)化的結(jié)果。

以上所述是小編給大家介紹的C/C++中宏(#define)定義知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • C++ Vector用法詳解

    C++ Vector用法詳解

    這篇文章主要介紹了C++ Vector用法詳解,vector是C++標準模版庫(STL,Standard Template Library)中的部分內(nèi)容,本文詳細介紹了它的方方面面,需要的朋友可以參考下
    2015-07-07
  • C++11?condition_variable條件變量的用法說明

    C++11?condition_variable條件變量的用法說明

    這篇文章主要介紹了C++11?condition_variable條件變量的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 用C語言實現(xiàn)鏈式棧介紹

    用C語言實現(xiàn)鏈式棧介紹

    大家好,本篇文章主要講的是用C語言實現(xiàn)鏈式棧介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++實現(xiàn)LeetCode(67.二進制數(shù)相加)

    C++實現(xiàn)LeetCode(67.二進制數(shù)相加)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(67.二進制數(shù)相加),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中設置進程優(yōu)先順序的方法

    C語言中設置進程優(yōu)先順序的方法

    這篇文章主要介紹了C語言中設置進程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C字符串操作函數(shù)實現(xiàn)方法小結(jié)

    C字符串操作函數(shù)實現(xiàn)方法小結(jié)

    這篇文章主要介紹了C字符串操作函數(shù)實現(xiàn)方法,實例總結(jié)了C語言字符串操作的相關技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Qt服務應用操作之JSON文件操作方法

    Qt服務應用操作之JSON文件操作方法

    在Qt框架中,處理JSON數(shù)據(jù)包括解析、生成、保存和讀取文件等操作,本文詳細介紹了這些操作的關鍵類和方法,如QJsonDocument、QJsonObject、QJsonArray等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • C語言實現(xiàn)刪除某一個數(shù)組值的方法

    C語言實現(xiàn)刪除某一個數(shù)組值的方法

    這篇文章主要給大家分享C語言數(shù)組中刪除數(shù)組中某個值的方法,既然要學習刪除數(shù)組中的元素,我們就必須得先知道數(shù)組中有哪些元素。同時還要定義一個變量,并將需要刪除的元素賦值給那個變量。下面來看看文章的詳細內(nèi)容吧
    2021-11-11
  • C/C++題解LeetCode1295統(tǒng)計位數(shù)為偶數(shù)的數(shù)字

    C/C++題解LeetCode1295統(tǒng)計位數(shù)為偶數(shù)的數(shù)字

    這篇文章主要為大家介紹了C/C++題解LeetCode1295統(tǒng)計位數(shù)為偶數(shù)的數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Qt寫入Json文件的方法詳解(含源碼+注釋)

    Qt寫入Json文件的方法詳解(含源碼+注釋)

    在Qt庫中,為JSON的相關操作提供了完整的類支持,下面這篇文章主要給大家介紹了關于Qt寫入Json文件(含源碼+注釋)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10

最新評論

常熟市| 宜黄县| 阳泉市| 潮安县| 翼城县| 泗洪县| 瑞金市| 长沙市| 外汇| 邢台市| 尤溪县| 郎溪县| 弋阳县| 桦川县| 武义县| 新平| 周宁县| 阳原县| 两当县| 河间市| 陕西省| 青神县| 益阳市| 淅川县| 来宾市| 竹溪县| 沾化县| 武功县| 文登市| 盘锦市| 河池市| 元氏县| 郑州市| 金秀| 咸阳市| 英德市| 仙游县| 兴宁市| 枣庄市| 会宁县| 万州区|