• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      淺析C語(yǔ)言自增自減運(yùn)算符的使用

      2010-01-23 08:41:32夏超群
      關(guān)鍵詞:運(yùn)算符后置C語(yǔ)言

      夏超群

      (武漢工程職業(yè)技術(shù)學(xué)院江北校區(qū) 湖北 武漢:430415)

      C語(yǔ)言的運(yùn)算符非常豐富,在程序中可以靈活使用它們以達(dá)到所需的功能。許多初學(xué)者學(xué)習(xí)使用過(guò)程中,經(jīng)常對(duì)自增、自減運(yùn)算符的運(yùn)算結(jié)果產(chǎn)生質(zhì)疑,弄懂自增、自減運(yùn)算符的運(yùn)算,顯得至關(guān)重要。

      1 自增、自減運(yùn)算符的特點(diǎn)

      1.1 自增運(yùn)算符 ++

      它是單目運(yùn)算符,其功能是使操作數(shù)的值增1。其操作數(shù)必須為變量,++可以置于操作數(shù)前面,也可以放在后面。例如:

      ++n ;n++ ;

      這兩個(gè)語(yǔ)句執(zhí)行的結(jié)果都是使變量n的值增加1,單純從這兩個(gè)語(yǔ)句的執(zhí)行結(jié)果上看++前置和后置似乎沒(méi)有區(qū)別,它們和下面的賦值語(yǔ)句得到的效果也是一樣:

      n=n+1;

      但我們不應(yīng)該被表象迷惑,實(shí)際上,++前置和后置是有區(qū)別的,具體如下:

      n++:先使用n的值,再使n值增加1。

      ++n:先使n值增加1,再使用n的值(使用時(shí)n的值已經(jīng)增加了)。

      例如:int n=1,p,q;

      p=n++;q=++n;

      對(duì)于“p=n++;”這個(gè)語(yǔ)句,是先使用n的值,將其賦給p,再使n的值增加1。即該語(yǔ)句等價(jià)于這樣兩條語(yǔ)句:p=n;n=n+1;所以這個(gè)語(yǔ)句執(zhí)行完后,p的值是1,而n的值變成2。對(duì)于“q=++n;”這個(gè)語(yǔ)句,是先使n的值增加1,再將n的值賦給q。即該語(yǔ)句等價(jià)于這樣兩條語(yǔ)句:n=n+1;q=n;所以這個(gè)語(yǔ)句執(zhí)行完后,n的值變?yōu)?,而q的值也是3。

      無(wú)論前置還是后置,++都會(huì)使其操作數(shù)的值增1。不同的是,++前置(如++n)時(shí),自增表達(dá)式的值等于其操作數(shù)自增后的值;++后置(如n++)時(shí),自增表達(dá)式的值等于其操作數(shù)自增前的值。

      例如:int n=5,p=0,q=0;

      q=++n+q;//該語(yǔ)句執(zhí)行后q為6,n為6

      n=5;

      p=n+++p;//該語(yǔ)句執(zhí)行后p為5,n為6

      上例中,表達(dá)式++n的值等于n自增后的值,即6,所以q最后得到的值為6。表達(dá)式n++的值等于n自增前的值,即5,所以p最后得到的值為5。

      1.2 自減運(yùn)算符 --

      自減運(yùn)算符的功能及應(yīng)用類似于自增運(yùn)算符, --的操作數(shù)也必須為變量。--可置于操作數(shù)前面,也可置于操作數(shù)后面。區(qū)別只在于自減運(yùn)算符使操作數(shù)的值減1,而自增運(yùn)算符使操作數(shù)的值增1。具體如下:

      --n:先使n值減1,再使用n的值(使用時(shí)n的值已經(jīng)減少了)。

      例如:int n=5,p=0,q=0;

      q=--n+q;//該語(yǔ)句執(zhí)行后q為4,n為4

      n=5;

      p=n--+p;//該語(yǔ)句執(zhí)行后p為5,n為4

      不管是自增還是自減,前置運(yùn)算符是“先變后用”,如++n或--n,執(zhí)行后表達(dá)式的值和變量n的值相同;而后置運(yùn)算符是“先用后變”,如n++或n--,執(zhí)行后表達(dá)式的值和變量n的值不同。

      Android系統(tǒng)中含有很多涉及獲取用戶隱私的API(Sources點(diǎn))以及隱秘的數(shù)據(jù)發(fā)送途徑(Sinks點(diǎn)),通過(guò)歸類整理并使用基于過(guò)程間數(shù)據(jù)流分析技術(shù)[5]的污點(diǎn)傳播算法,尋找從Sources點(diǎn)到Sinks點(diǎn)的傳播路徑,從而發(fā)現(xiàn)這些隱私泄露問(wèn)題。

      1.3 優(yōu)先級(jí)

      自增運(yùn)算符和自減運(yùn)算符的優(yōu)先級(jí)比+-*/的優(yōu)先級(jí)要高。因此“n*m++”表示“n*(m+ +)”,而不是“(n*m)++”。而且“(n*m)++”是錯(cuò)誤的使用方式。因?yàn)?+和--的操作數(shù)只能是變量,不能是表達(dá)式或常量,而“n*m”是表達(dá)式。

      注意,不要把優(yōu)先級(jí)和運(yùn)算順序混淆了。

      例如:int x=1,y=2,z;

      z=(x+y++)*3;//該語(yǔ)句執(zhí)行后z值為9, y值為3

      用數(shù)字代替上面的語(yǔ)句得:z=(1+2)*3;

      優(yōu)先級(jí)表明的是++作用于y,而不是(x+y),但它決定不了y的值何時(shí)增1。我們可以肯定的是,在整個(gè)語(yǔ)句執(zhí)行完畢后,y的值肯定增加了。但是,我們不知道該語(yǔ)句執(zhí)行中的什么時(shí)候,y的值會(huì)增1,這是由編譯器決定的。

      2 自增、自減運(yùn)算符的應(yīng)用

      C語(yǔ)言表達(dá)式的應(yīng)用非常靈活,這種靈活性可使C程序簡(jiǎn)潔,但同時(shí)也會(huì)引起副作用:使程序費(fèi)解,分析程序時(shí)易于發(fā)生誤解或錯(cuò)誤。而且C語(yǔ)言發(fā)展至今,不同的軟硬件環(huán)境有不同版本的編譯軟件,對(duì)同一個(gè)C的源程序,不同軟硬件環(huán)境、不同的編輯編譯軟件處理的結(jié)果不同。由于現(xiàn)在一般都是使用圖形界面的操作系統(tǒng),使用的編譯軟件也是簡(jiǎn)單直觀的圖形界面為主,下面以VC++6.0環(huán)境C程序中自增、自減運(yùn)算符的應(yīng)用來(lái)進(jìn)行詳細(xì)分析。

      例1:分析下面程序運(yùn)行后的輸出

      分析:由于單目運(yùn)算符的優(yōu)先級(jí)高于雙目運(yùn)算符,而且自增自減運(yùn)算符的結(jié)合性是自右至左的,所以程序的4、6、8行的語(yǔ)句分別等價(jià)于:a=(++b)+ (c--);a=(b--)-c;a=-(b++)+c;我們前面說(shuō)過(guò)自增自減符前置時(shí)是“先變后用”,執(zhí)行后表達(dá)式的值和變量的值相同;后置時(shí)是“先用后變”,執(zhí)行后表達(dá)式的值和變量n的值不同。

      由此分析知:第4行語(yǔ)句執(zhí)行情況為:表達(dá)式+ +b的值為6,變量b的值為6;表達(dá)式c--的值為5,變量c的值為4;所以a=6+5。

      同理,第6行語(yǔ)句執(zhí)行情況為:表達(dá)式b--的值為6,變量b的值為5;所以a=6-4。第8行語(yǔ)句執(zhí)行情況為:表達(dá)式b++的值為5,變量b的值為6;所以a=-5+4。所以程序運(yùn)行的輸出如圖1所示。

      圖1 例1在VC++6.0下的運(yùn)行結(jié)果

      例2:分析下面程序運(yùn)行后的輸出

      分析:該例4、5行語(yǔ)句中各有若干個(gè)自增表達(dá)式,從理論上分析第4行語(yǔ)句中表達(dá)式(i++)+(i+ +)+(i++)的值應(yīng)為5+6+7,實(shí)際卻是不論何種編譯器執(zhí)行結(jié)果都是5+5+5,這說(shuō)明后置自增自減運(yùn)算符的“先用后變”的“變”是指在下一條語(yǔ)句執(zhí)行前統(tǒng)一改變,而不是剛用完就變,故第4行語(yǔ)句等價(jià)于:p=i+i+i;i=i+1;i=i+1;i=i+1;

      第5行語(yǔ)句執(zhí)行結(jié)果和所用的編譯器有關(guān),由于我們前面已經(jīng)說(shuō)明在VC++6.0環(huán)境下分析運(yùn)算符運(yùn)算結(jié)果,因此該語(yǔ)句等價(jià)于:j=j+1;j=j+1; q=j+j;j=j+1;q=q+j;

      造成這種結(jié)果是因?yàn)楦呒?jí)語(yǔ)言的一條語(yǔ)句經(jīng)編譯解釋成若干條機(jī)器指令,這若干條機(jī)器指令的順序最終決定該等價(jià)高級(jí)語(yǔ)言語(yǔ)句的執(zhí)行結(jié)果。

      該例是教學(xué)時(shí)所用教材上的實(shí)例,教材上分析認(rèn)為運(yùn)行輸出如圖2所示,教材上并未說(shuō)明該結(jié)果是在何編輯環(huán)境下的輸出。我校機(jī)房運(yùn)行調(diào)試C程序用的是VC++6.0,為了讓學(xué)生能理解運(yùn)行環(huán)境對(duì)結(jié)果的影響,我特意讓學(xué)生上機(jī)運(yùn)行這個(gè)程序,結(jié)果輸出如圖3所示。

      圖2 例2在TC下的編譯輸出

      圖3 例2在VC++6.0下的編譯輸出

      為了讓學(xué)生分析該例第5行為什么會(huì)得到非預(yù)期或者說(shuō)與教材不同的結(jié)果,將該例代碼稍作修改后以c1.c為文件名保存,同時(shí)為學(xué)生提供不同的編輯編譯環(huán)境,讓學(xué)生分別在不同編譯環(huán)境中調(diào)試運(yùn)行該程序,并分析得到這種運(yùn)行結(jié)果的原因。通過(guò)自己動(dòng)手上機(jī)調(diào)試分析,學(xué)生很容易理解自增、自減運(yùn)算符前后置時(shí)運(yùn)行結(jié)果為何不同。

      文件名為c1.c的源代碼如下:

      例3:分析下程序運(yùn)行后的輸出。

      分析:由上兩個(gè)程序的分析知:后置自增或自減運(yùn)算符時(shí),自增或自減變量值是在本語(yǔ)句執(zhí)行后,下一語(yǔ)句執(zhí)行前改變。因此有:表達(dá)式x++的值為17 (先用),表達(dá)式—y的值為4,y值也為4,17/4結(jié)果取整為4,x=17*4。第4行語(yǔ)句執(zhí)行后再執(zhí)行表達(dá)式x++的變(后變),程序的運(yùn)行結(jié)果如圖4所示。

      圖4 例3在VC++6.0下的編譯輸出

      3 結(jié)束語(yǔ)

      C語(yǔ)言運(yùn)算符的靈活應(yīng)用可能會(huì)讓初學(xué)者對(duì)程序造成誤解,甚至不明白程序?yàn)楹蔚玫酱朔N結(jié)果。學(xué)習(xí)程序關(guān)鍵在于多分析、多設(shè)計(jì)程序,程序的運(yùn)行一定會(huì)遵循某一規(guī)律。而對(duì)于自增自減運(yùn)算符來(lái)說(shuō),都知道運(yùn)算符后置時(shí)是先用后變,但相關(guān)變量的值何時(shí)變才是關(guān)鍵,要明白這一點(diǎn),就需要在實(shí)踐中理解掌握。如果通過(guò)實(shí)踐明白的先用后變的“變”是在下一語(yǔ)句執(zhí)行前進(jìn)行的,那么再錯(cuò)綜復(fù)雜的運(yùn)算符的應(yīng)用,分析它的運(yùn)算結(jié)果也得心應(yīng)手了。

      [1] 譚浩強(qiáng).C程序設(shè)計(jì)[M].北京:清華大學(xué)出版社.

      [2] 陽(yáng)曉霞,劉清華.C語(yǔ)言教學(xué)探討——易造成學(xué)生困惑的幾種運(yùn)算符[J].福建電腦,2007,(11):212-214.

      [3] 吳 瓊.C語(yǔ)言運(yùn)算符的結(jié)合性分析[J].電腦知識(shí)與技術(shù), 2007,(2):463-464.

      猜你喜歡
      運(yùn)算符后置C語(yǔ)言
      老祖?zhèn)魇诨具\(yùn)算符
      基于Visual Studio Code的C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)探索
      非正交五軸聯(lián)動(dòng)數(shù)控機(jī)床后置處理算法開(kāi)發(fā)
      基于C語(yǔ)言的計(jì)算機(jī)軟件編程
      電子制作(2018年16期)2018-09-26 03:27:08
      高職高專院校C語(yǔ)言程序設(shè)計(jì)教學(xué)改革探索
      沉淀后置生物處理組合工藝的工程應(yīng)用
      Review of Research on the Prevention of HPV Infection and Cervical Cancer
      論子函數(shù)在C語(yǔ)言數(shù)據(jù)格式輸出中的應(yīng)用
      后置式自動(dòng)發(fā)卡機(jī)系統(tǒng)應(yīng)用
      C++運(yùn)算符重載剖析
      霍邱县| 昭苏县| 延安市| 日土县| 江川县| 黄大仙区| 南靖县| 成安县| 武宣县| 河南省| 洮南市| 通河县| 通辽市| 南丰县| 高唐县| 阆中市| 墨竹工卡县| 稻城县| 类乌齐县| 招远市| 新乡市| 黑水县| 南皮县| 洪洞县| 寿阳县| 内丘县| 唐河县| 安西县| 东港市| 永顺县| 彰武县| 乐陵市| 德清县| 平陆县| 富裕县| 慈溪市| 彩票| 神农架林区| 定陶县| 临澧县| 阿克|