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

在C語言編程中使用變量的基礎(chǔ)教程

 更新時間:2016年02月07日 15:30:01   投稿:goldensun  
這篇文章主要介紹了在C語言編程中使用變量的基礎(chǔ)教程,特別需要注意C語言中的指針變量,需要的朋友可以參考下

C語言在明面上將數(shù)的變量分為兩類,整型變量以及浮點數(shù),對應(yīng)著現(xiàn)實世界的整數(shù)和小數(shù)。

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

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

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

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

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

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

 #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");

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

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

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

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

4Byte = 32bit
2^32 = 4G

所以32位的操作系統(tǒng)下C語言指針:

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

輸出:

$root@mine: 4

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

 ...
 int dupli_of_me[10] = {0};//也可以使用庫函數(shù)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語言應(yīng)用廣泛它相當于是:

 *point_to_me = me;
 point_to_me++;

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

 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 是最常用的變量限定符,它的意思是告訴編譯器,這個變量或者對象在初始化以后不能被改變,常用它來保護一些必要的返回值,參數(shù)以及常量的定義。

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

   /* 此時我們將編譯器優(yōu)化等級提高到 -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,得到的結(jié)果是后者比前者慢大概十五倍。 從某一些方向上證明了,volatile的一些作用,比如調(diào)試的時候,或者一些特殊用途。涉足不多,故不記錄。

變量說明

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

 /* 以下為一個工程內(nèi)可見 */
 /*file1.c*/
 int glo_show;//對于該全局變量來說,它們在聲明時無初始化,則默認初始為0
 int glo_print = 10;//聲明定義完成后,自動分配內(nèi)存以存儲信息  
 ...

 /* file2.c */
 extern glo_print; //僅僅是引用名字,并不會額外分配空間
          //所以,只需要寫正確變量名字即可,后方的初始化無須完全
          //因為變量的初始化定義只能有一次。

 void print()
 {
   printf("The Globle Value is %d \n", glo_print);
 }

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

變量獲取

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • C++基于easyx圖形庫實現(xiàn)打磚塊游戲

    C++基于easyx圖形庫實現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細介紹了C++基于easyx圖形庫實現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 用C語言實現(xiàn)自動售貨機

    用C語言實現(xiàn)自動售貨機

    這篇文章主要為大家詳細介紹了用C語言實現(xiàn)自動售貨機,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)

    C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)

    根據(jù)用于分配內(nèi)存的方法,C++中有3中管理數(shù)據(jù)內(nèi)存的方式:自動存儲、靜態(tài)存儲和動態(tài)存儲。在存在時間的長短方面,以這三種方式分配的數(shù)據(jù)對象各不相同。下面簡要介紹這三種類型
    2022-09-09
  • 函數(shù)指針與指針函數(shù)的學習總結(jié)

    函數(shù)指針與指針函數(shù)的學習總結(jié)

    函數(shù)指針是指向函數(shù)的指針,指針函數(shù)是指一個函數(shù)的返回值是一個指針。以下就是對函數(shù)指針與指針函數(shù)的應(yīng)用進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • C++淺析類與對象基礎(chǔ)點

    C++淺析類與對象基礎(chǔ)點

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲在內(nèi)存中—個可以擁有在某個范圍內(nèi)的可變存儲區(qū)域
    2022-07-07
  • C語言模擬實現(xiàn)庫函數(shù)詳解

    C語言模擬實現(xiàn)庫函數(shù)詳解

    C語言庫函數(shù)是把自定義函數(shù)放到庫里,是別人把一些常用到的函數(shù)編完放到一個文件里,供程序員使用,下面讓我們一起來詳細了解它
    2022-07-07
  • C++函數(shù)中return語句的使用方法

    C++函數(shù)中return語句的使用方法

    C++中的return語句是函數(shù)中一個重要的語句,return語句用于結(jié)束當前正在執(zhí)行的函數(shù),并將控制權(quán)返回給調(diào)用此函數(shù)的函數(shù),需要的朋友可以了解下
    2012-12-12
  • C++中回調(diào)函數(shù)(CallBack)的用法分析

    C++中回調(diào)函數(shù)(CallBack)的用法分析

    這篇文章主要介紹了C++中回調(diào)函數(shù)(CallBack)的用法,較為詳細的分析了C++中回調(diào)函數(shù)(CallBack)的原理并以實例形式總結(jié)了其具體用法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • Qt繪制時鐘效果

    Qt繪制時鐘效果

    這篇文章主要為大家詳細介紹了Qt繪制時鐘效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • c++中創(chuàng)建.in文件的方法步驟

    c++中創(chuàng)建.in文件的方法步驟

    在本篇文章里小編給大家分享了一篇關(guān)于c++中創(chuàng)建.in文件的方法步驟的內(nèi)容以及相關(guān)知識點,需要的朋友們學習下。
    2019-07-07

最新評論

高唐县| 静海县| 上蔡县| 永春县| 循化| 正安县| 福建省| 平潭县| 灌云县| 淳化县| 鄂托克旗| 九寨沟县| 阜城县| 岳西县| 钦州市| 柞水县| 黄浦区| 印江| 明水县| 汝南县| 左云县| 合川市| 陆丰市| 鹤峰县| 西峡县| 吉林市| 石楼县| 涿州市| 临江市| 历史| 萨迦县| 麻城市| 阜城县| 饶河县| 台东市| 开远市| 安福县| 葫芦岛市| 同心县| 宜君县| 鄱阳县|