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

首頁 > 編程 > C > 正文

在C語言編程中使用變量的基礎教程

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

C語言在明面上將數的變量分為兩類,整型變量以及浮點數,對應著現實世界的整數和小數。

首先是整數,使用了這么多的C語言之后,每當在使用整數之時都會將其想象成二進制的存在,而不是十進制。原因在于,這是程序的本質所在,稍有研究編譯器工作原理的都會發現,在編譯器處理乘法乃至除法的時候,優秀的編譯器總會想方設法的加快程序的速度,毫無疑問在所有運算中移位運算是最快速的"乘法"以及"除法":

1<<2 == 4 ,8>>2 == 2

而正常一個乘法相當于十數次的加法運算的時間消耗,移位則不用(除法的消耗更大,但是隨著CPU的進步,這些差距正在逐漸縮小,就目前來看依舊是有著不小的差距但無論如何優化,乘法時間都會大于加法)。正如前面所說,C語言設計之初便是給了程序員所有的權利,而程序員要做的就是掌控所有能掌控的,即便是數的計算亦是如此,比如在優秀的編譯器看來:

2*7 ====> (2<<3) - 25*31 ====> (5<<5) - 5

毫無疑問經過編譯器優化后的代碼此前者要快許多。這就是為什么我們要將一個數看作二進制,這不僅僅是表面,而是要在深層次的認為它是二進制,總體來說C語言的整型是非常簡潔明了的總體分為 有符號 和 無符號,很好理解只需要注意不要讓無符號數進行負數的運算,這里有一個原則,可以很好的規避這種無意之過,不把無符號類型變量和有符號類型變量放于同一運算中,時刻記得保持式子的類型一致是設計時的保障。

浮點數,由于實數域可以看作稠密的,故除了整數以外,還有無數的小數,而小數在計算機中如何表示?一種無限的狀態是無法在計算機中被精確表示,所以有了浮點法,關于浮點法可以參考書籍《深入理解計算機系統》。
這里介紹的是在C語言中我們應該如何正確使用浮點數?很多人(包括我)在初作之時總是想當然的以為計算機是無所不能的,連人類都無法完全表達出來的小數計算機一定可以,實際上并非如此,在這里我可以說,計算機只是近似表達,而最大的忌諱的便是將兩個浮點數進行比較,此處介紹一種浮點數常用的比較方法,精確度法:

 #define DISTANCE 0.00000001 ... float f_x_1 = 20.5; float f_x_2 = 19.5; if(f_x_1 - f_x_2 < DISTANCE)   printf("They are Equal/n"); else   printf("Different/n");

所以說,在很大程度上,當你在程序中使用了浮點數,又直接使用浮點數進行比較,卻發現始終無法達到預期效果,那么你可以檢查一下,是否是這個原因,在這一點上,不得不說是C語言的一個缺憾。

指針變量,是一種比較特別的變量,以至于總是對它進行特別對待。這里有幾個原則:

  • 兩個不相關的指針進行加減操作是無意義的
  • 始終確保自己能夠找到分配的內存
  • 無論何時何地何種情況,都要記住,不使用未初始化的指針,不讓未使用的內存持續存在。

指針在不同位的操作系統上的大小是不一樣的,但是在同一個操作系統下,無論什么類型的指針都是相同大小,這涉及到指針的尋址問題,(題外話:C語言的尋址實際上使用了匯編語言的間接尋址,有興趣的可以自行嘗試,方法之一,使用gcc編譯器的匯編選項,產生匯編代碼,進行一一比對),對于尋址一個籠統一些的說法便是

4Byte = 32bit2^32 = 4G

所以32位的操作系統下C語言指針:

 ... size_t what = sizeof(void*); printf("%d", what); ...

輸出:

$root@mine: 4

對于大部分使用者來說,指針主要用來降低內存消耗以及提高運算效率的,這里設計許多學問,我也無法一一展示,比較有意思也常用的兩個東西便是遞增以及語法糖:++, ->

 ... int dupli_of_me[10] = {0};//也可以使用庫函數memset()進行置0 int *point_to_me = dupli_of_me; int me = 100; while(point_to_me < (dupli_of_me + 10))   *point_to_me++ = me;

其中*point_to_me++ = me;在C語言應用廣泛它相當于是:

 *point_to_me = me; point_to_me++;

的語法糖,對于++,在非必要的情況下,請使用前綴遞增,而非后綴遞增,原因是消耗問題,仔細想想這兩種遞增的區別在何處?
前綴遞增總是在原數上進行遞增操作,然而后綴遞增呢?它首先拷貝一份原數放于別處,并且遞增這份拷貝,在原數進行的操作完畢后,將這份拷貝再拷貝進原數取代它,此中的操作涉及的更多,所以在非必要的情況下,請使用前綴遞增而不是后綴遞增(遞減也是同樣的道理)。
->則是在結構體上使用的非常廣泛:

 typedef struct data{   int test;   struct data* next; }my_struct; ... my_struct temp; my_struct *ptemp = &temp; ptemp->test = 100; ptemp->next = NULL; if(temp.test == 100)   printf("Correctly!/n"); else   printf("That is impossible!/n"); ...

可以很清楚的看出其實ptemp->test便是(*ptemp).test的語法糖

變量限定

const 是最常用的變量限定符,它的意思是告訴編譯器,這個變量或者對象在初始化以后不能被改變,常用它來保護一些必要的返回值,參數以及常量的定義。

volatile 這個關鍵字常常被C語言教材所忽略,它很神秘。實際上確實如此,他的作用的確很神秘:一旦使用了,就是告訴編譯器,即使這個變量沒有被使用或修改其他內存單元,它的值也可能發生變化。通俗的說就是,告訴編譯器,不要把你的那一套優化策略用在我身上。

   /* 此時我們將編譯器優化等級提高到 -O2 */   int     test_num  = 100; //測試一個迭代加法   int     nor_result = 0;   volatile int vol_result = 0;   /* 測試無volatile限定下,該程序的耗時 */        for(int i = 0;i < 10000;++i)     for(int j = 0;j < 10000;++j)         nor_result += test_num;

接下來就是測試volatile限定下的代碼

   for(int i = 0;i < 10000;++i)     for(int j = 0;j < 10000;++j)         vol_result += test_num;

在使用一些手段后,得到運行時間,可以很清晰的看出差別,在我的機器上,i5-4CPU,得到的結果是后者比前者慢大概十五倍。 從某一些方向上證明了,volatile的一些作用,比如調試的時候,或者一些特殊用途。涉足不多,故不記錄。

變量說明

extern 用于將不同文件的,帶有外部鏈接性的變量引用到本文件中。所謂外部鏈接性就是可以被除本文件外的其他文件"看見"的變量,如全局變量,使用方法:

 /* 以下為一個工程內可見 */ /*file1.c*/ int glo_show;//對于該全局變量來說,它們在聲明時無初始化,則默認初始為0 int glo_print = 10;//聲明定義完成后,自動分配內存以存儲信息   ... /* file2.c */ extern glo_print; //僅僅是引用名字,并不會額外分配空間          //所以,只需要寫正確變量名字即可,后方的初始化無須完全          //因為變量的初始化定義只能有一次。 void print() {   printf("The Globle Value is %d /n", glo_print); }

auto 可以姑且忽略,因為沒有什么實際意義。

變量獲取

格式化輸入輸出在C語言的初學中使用的比較頻繁,但是到后期會發現,由于I/O操作過于消耗資源,換句話來說就是會極大影響程序的執行效率,會漸漸的在發行版程序中消除。

常見格式化輸入標準函數: sacnf, fscanf, sscanf

對于常見的使用不贅述,有兩種比較不常見的格式:`%[]` 和 `%*`,
前者是用于限制讀取類型,常見于字符串的過濾(不是真正的過濾)

    scanf("%d %[a-z]", &tmp, str);    scanf("%d %[^i]", &tmp, str);    scanf("%d %[^,]", &tmp, str);

假設輸入的是:22 hello,string to me!
讀取到的分別為:22 hello 和 22 hello,str 和 22 hello
后者則是忽略第一個輸入:

    scanf("%*d %d", &tmp);

假設輸入的是:22 33
讀取到的則是:33
其中開頭的%*d忽略的輸入,必須和其類型匹配,例如輸入:string 33則會讀取失敗。
也可以將其解讀為文件寬度,例如在使用printf格式化輸出的時候:

  char str[10] = "dir";  printf("%*s%s",4 ,"" , str);  /* 輸出:  dir */ 四個空白占位  

但是實際上scanf并不太好用,所謂的好用指的是功能上以及設計上的缺陷,總是讓很多人摸不著頭腦的出了錯,往往很難調試。例如它會將每一行輸入的/n保留在輸入流里面,這個缺陷導致如果不明所以得人將其與其他的輸入函數,例如fgets或者gets配合會出現差錯。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜精品久久久久久久久久久久| 亚洲天堂av女优| 精品自拍视频在线观看| 国产精品看片资源| xx视频.9999.com| 日韩中文字幕在线免费观看| 欧美制服第一页| 疯狂做受xxxx欧美肥白少妇| 久久精品国产成人| 国产精品视频一| 亚洲美女性生活视频| 亚洲一区二区久久久久久久| 欧美日韩国产999| 欧美性猛交xxxx免费看| 97精品久久久| 中文字幕久久亚洲| 欧美日韩亚洲网| 久久久www成人免费精品| 最近中文字幕2019免费| 亚洲新中文字幕| 国产女人精品视频| 91人成网站www| 92福利视频午夜1000合集在线观看| 国产欧美精品日韩精品| 欧美国产日韩一区二区在线观看| 久久免费福利视频| 国产精品久久在线观看| 97人洗澡人人免费公开视频碰碰碰| 国产精品久久久久久久9999| 国产日产亚洲精品| 久久亚洲电影天堂| 欧美xxxx14xxxxx性爽| 555www成人网| 日韩一区二区三区国产| 国产免费一区二区三区香蕉精| 国产香蕉精品视频一区二区三区| 亚洲电影免费观看高清| 国产啪精品视频| 亚洲欧美精品在线| 在线观看精品国产视频| xxav国产精品美女主播| 中文字幕日韩精品在线| 日韩黄色高清视频| 日韩欧美在线观看| 中文字幕亚洲无线码a| 一道本无吗dⅴd在线播放一区| 精品少妇v888av| 91免费精品国偷自产在线| 日韩精品在线视频| 性欧美暴力猛交69hd| 日韩美女av在线免费观看| 7777免费精品视频| 欧美激情亚洲一区| 91av在线播放视频| 日韩美女免费线视频| 亚洲精品国产精品自产a区红杏吧| 2024亚洲男人天堂| 国产精品久久久久91| 97在线视频免费看| 欧美久久精品一级黑人c片| 91国产高清在线| 欧美xxxx做受欧美.88| 亚洲综合一区二区不卡| 欧美在线视频一二三| 欧美日韩国产va另类| 91精品国产乱码久久久久久久久| 色香阁99久久精品久久久| 国产亚洲精品美女久久久| 欧美精品在线观看91| 美女扒开尿口让男人操亚洲视频网站| 欧美成人小视频| 日韩精品免费在线视频观看| 国产精品www网站| 亚洲国产精品va在线看黑人| 欧美二区乱c黑人| 在线丨暗呦小u女国产精品| 97精品视频在线播放| 成人免费自拍视频| www.美女亚洲精品| 国产成人自拍视频在线观看| 久久69精品久久久久久国产越南| 91亚洲永久免费精品| 91久久精品国产91性色| 国产成人精品在线| 久热国产精品视频| 久久久久久亚洲精品中文字幕| 久久视频这里只有精品| 国产精品久久久久久超碰| 国产精品稀缺呦系列在线| 欧美性猛交xxxx乱大交| 久久精品视频在线| 一区二区三区四区在线观看视频| 中文字幕亚洲天堂| 日本在线观看天堂男亚洲| 欧美国产日韩二区| 91深夜福利视频| 欧美专区在线视频| 亚洲国产精品推荐| 欧美野外wwwxxx| 久久青草精品视频免费观看| 国产视频在线观看一区二区| 国产精品亚洲欧美导航| 日韩精品免费视频| 久久高清视频免费| 欧美精品少妇videofree| 91中文字幕在线| 久久精品国产清自在天天线| 国产欧美日韩亚洲精品| 国产日韩在线看| 日韩国产精品亚洲а∨天堂免| 日韩少妇与小伙激情| 一本色道久久综合狠狠躁篇的优点| 亚洲一区中文字幕| 97在线视频免费看| 久久好看免费视频| 国产精品第七十二页| 久久免费精品视频| 国内精品久久久久久久久| 亚洲欧美国产精品专区久久| 992tv成人免费影院| 亚洲欧美日韩精品久久亚洲区| 中文字幕精品视频| 久国内精品在线| 欧美在线观看日本一区| 草民午夜欧美限制a级福利片| 日韩欧美福利视频| 亚洲成av人影院在线观看| 亚洲精品自产拍| 日韩在线观看免费网站| 91高清免费视频| wwwwwwww亚洲| 日韩av中文字幕在线播放| 欧美电影免费观看高清| 成人日韩av在线| 久久久精品日本| 国产成人亚洲综合91| 国产精品第2页| 成人在线视频福利| 久久久久久久999精品视频| 日韩一区在线视频| 久久久免费高清电视剧观看| 欧美国产日韩二区| 国产精品久久久精品| 日韩av网站电影| 亚洲欧美一区二区精品久久久| 国产精品白丝av嫩草影院| 国产精品成人va在线观看| 96pao国产成视频永久免费| 黑人狂躁日本妞一区二区三区| 国产精品永久免费| 高清日韩电视剧大全免费播放在线观看| 色综合91久久精品中文字幕| 久久免费视频这里只有精品| 国产精选久久久久久| 久久香蕉频线观| 亲爱的老师9免费观看全集电视剧| 91亚洲精品久久久| 中文字幕日韩精品在线| 国产精品久久久久久一区二区| 久久精品福利视频| 精品少妇一区二区30p| 亚洲国产精品中文| 亚洲日韩中文字幕在线播放| 国产精品久久一区|