亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-01-26 14:14:48
字體:
來源:轉載
供稿:網友

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

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

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

#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>

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

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

  假如我們將上面的程序變為下面這樣的

#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>

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

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

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

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

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

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

  i的數值如下圖所示

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

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

//自加自減的操作

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

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

    1.  sum1 = i++;

    2.  sum2 = ++i; 

    1中的sum1的數值就是 10, i為 11

    2中的sum2的數值就是 11, i為 11

這是因為:

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

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

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

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

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

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

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

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

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

i= 12 的數值在進行i++變為 13了。所以  MUL(i++) = 10 * 11 * 12 = 1320?!  ?/p>

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

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

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

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

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

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

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

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

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

總結:

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲尤物视频网| 中日韩午夜理伦电影免费| 国产精品一区二区久久久| 4438全国成人免费| 久久国产精品久久久久久久久久| 亚洲男人第一av网站| 欧美激情xxxx性bbbb| 久久不射电影网| 庆余年2免费日韩剧观看大牛| 国产成人久久久精品一区| 国产精品成人va在线观看| 亚洲天堂网在线观看| 亚洲男人7777| 91精品国产777在线观看| 国模私拍视频一区| 91精品综合久久久久久五月天| 日韩中文字幕av| 国产亚洲aⅴaaaaaa毛片| 欧美成人激情视频免费观看| 欧美日韩精品在线播放| 最近2019中文字幕一页二页| 国产精品亚洲第一区| 91免费看片在线| 一区二区三区黄色| 国内精品小视频在线观看| 久久韩国免费视频| 91av在线播放视频| 国产成人精品久久二区二区91| 国产日韩在线一区| 日本一区二三区好的精华液| 欧美大片免费观看在线观看网站推荐| 亚洲成人精品在线| 日韩有码在线视频| 7777精品视频| 日韩在线观看免费全集电视剧网站| 欧美日本啪啪无遮挡网站| 精品日韩美女的视频高清| 久久精品99久久久久久久久| 欧美激情影音先锋| 国产日韩av在线播放| 亚洲欧洲高清在线| 亚洲老头同性xxxxx| 欧美性猛交xxxxx水多| 久久精品久久久久久| 欧美色播在线播放| 亚洲欧美精品suv| 成人精品久久一区二区三区| 欧洲亚洲妇女av| 亚洲人成自拍网站| 国产亚洲欧美另类中文| 全色精品综合影院| 日本精品久久电影| 国产精品福利无圣光在线一区| 久久久中精品2020中文| 在线观看日韩专区| wwwwwwww亚洲| 亚洲区一区二区| 欧美另类交人妖| 精品久久久久久中文字幕大豆网| 日韩69视频在线观看| 成人精品视频99在线观看免费| 91高清视频免费| 色偷偷av一区二区三区| 久久久亚洲精品视频| 亚洲精品免费一区二区三区| 成人性生交大片免费看小说| 亚洲理论在线a中文字幕| 亚洲三级黄色在线观看| 亚洲欧美在线看| 日韩精品中文字幕在线播放| 国产成人+综合亚洲+天堂| 97国产suv精品一区二区62| 中文字幕亚洲综合| 国产精品久久久久高潮| 国产精品精品视频| 一本久久综合亚洲鲁鲁| 国产一区二区三区在线播放免费观看| 社区色欧美激情 | 久久人人爽人人爽爽久久| 免费91在线视频| 国产成一区二区| 综合网中文字幕| 亚洲午夜精品久久久久久性色| 亚洲精品成a人在线观看| 欧美日韩在线视频一区| 亚洲精品色婷婷福利天堂| 精品视频在线播放免| 亚洲午夜精品久久久久久久久久久久| 韩剧1988免费观看全集| 日韩av在线看| 欧美另类在线观看| 成人自拍性视频| 91精品国产电影| 播播国产欧美激情| 欧美性猛交xxxx黑人猛交| 国产精品久久久久久久av大片| 亚洲天堂第一页| 伊是香蕉大人久久| 粗暴蹂躏中文一区二区三区| 国产97在线|日韩| 亚洲最大成人免费视频| 91在线免费视频| 久久久精品久久久| 久久精品国产电影| 日韩精品视频在线播放| 欧美精品久久久久久久| 91视频免费在线| 在线看福利67194| 亚洲已满18点击进入在线看片| 国产97在线亚洲| 亚洲加勒比久久88色综合| 久久天堂av综合合色| 91亚洲精品一区二区| 亚洲国产99精品国自产| 另类少妇人与禽zozz0性伦| 亚洲人成电影在线观看天堂色| 欧美国产日韩一区二区| 国模精品视频一区二区三区| 久久理论片午夜琪琪电影网| 91午夜理伦私人影院| 国产精品久久久久影院日本| 亚洲成成品网站| 久久久国产精彩视频美女艺术照福利| 少妇久久久久久| 亚洲精品在线视频| 亚洲性生活视频在线观看| 欧美高清视频免费观看| 少妇高潮久久77777| 日本欧美精品在线| 中文亚洲视频在线| 精品丝袜一区二区三区| 国产亚洲精品美女久久久久| 亚洲精品福利在线| 国产精品成人久久久久| 国产精品免费一区| 亚洲午夜未满十八勿入免费观看全集| 国产九九精品视频| 欧美日本啪啪无遮挡网站| 日韩精品在线观| 欧美性videos高清精品| 欧美猛男性生活免费| 成年人精品视频| 国产精品久久久久久婷婷天堂| 81精品国产乱码久久久久久| 日本国产一区二区三区| 国产三级精品网站| 欧美性xxxxxx| 亚洲人av在线影院| 欧美激情啊啊啊| 欧美性20hd另类| 国产精品第一第二| 国产一区二区久久精品| 日韩精品在线观看一区| 中文字幕日韩精品在线观看| 欧美二区在线播放| 亚洲天堂第二页| 精品久久久久久| 国产精品久久久久久五月尺| 日韩大片免费观看视频播放| 亚洲第一精品自拍| 国产精品自拍偷拍| 日韩电影中文字幕av| 亚洲一区制服诱惑| 精品女厕一区二区三区|