• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    在DEV C++環(huán)境下C語(yǔ)言自加自減運(yùn)算符使用分析

    2016-12-15 20:50:16袁玲
    電腦知識(shí)與技術(shù) 2016年27期

    袁玲

    摘要:針對(duì)C語(yǔ)言運(yùn)算符使用規(guī)則,分析了在DEV C++環(huán)境下自加/自減運(yùn)算符的使用方法和在復(fù)雜表達(dá)式中的求值情況分析,并針對(duì)問題給出了解決方案。

    關(guān)鍵詞:C語(yǔ)言;自增運(yùn)算符;自減運(yùn)算符

    中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)27-0248-02

    Abstract:For the C language operators use rules, analysis of the add-self /sub-self and evaluation in the analysis of complex expressions with DEV C++, and the solutions were given.

    Key words: C language;add-self;add-self

    C語(yǔ)言是典型的結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,在國(guó)內(nèi)外得到了廣泛的使用,也是各大學(xué)普遍開設(shè)的程序設(shè)計(jì)課程。在近年的教學(xué)過程中,大多借用C++的編輯環(huán)境編輯C程序,使用較多的有Visual C++,DEV C++等。在這些編輯環(huán)境下運(yùn)行C程序,對(duì)于某些特定的操作,對(duì)不同的編譯器可能會(huì)得到不同的運(yùn)行結(jié)果。筆者發(fā)現(xiàn),在C語(yǔ)言的運(yùn)算符中,自加和自減運(yùn)算符的使用非常靈活,是C語(yǔ)言的特色之一,但在使用過程中也比較容易出錯(cuò)?,F(xiàn)就這兩種運(yùn)算符在DEV C++環(huán)境中的使用做一個(gè)詳細(xì)的分析。

    1 自加/自減運(yùn)算符的使用方法及運(yùn)算對(duì)象

    自加自減運(yùn)算符是C語(yǔ)言特有的單目運(yùn)算符,只能和一個(gè)變量組成表達(dá)式,有前綴和后綴兩種形式。前綴形式為:++操作數(shù)/- -操作數(shù),后綴形式為操作數(shù)++/操作數(shù)- -。自加運(yùn)算符可以使操作數(shù)的值增加1個(gè)單位,自減運(yùn)算符可以使操作數(shù)的值減少1個(gè)單位。操作數(shù)只能是變量,不允許使用常量和表達(dá)式。比如i和j都是整型變量,使用i++,j++都是合法的,如果對(duì)常量3使用自加運(yùn)算符即3++,則會(huì)使常量3的值增加1,這和常量在程序運(yùn)行期間值不發(fā)生改變的定義相違背;而對(duì)表達(dá)式(i+2)使用自加運(yùn)算符(i+2)++,則會(huì)使表達(dá)式(i+2)的值增加1,但是減少以后的值沒有變量可以存儲(chǔ),因此這兩種使用方法都不合法。

    2 自加/自減運(yùn)算符單獨(dú)使用與在復(fù)合表達(dá)式中使用的區(qū)別

    2.1 自加/自減運(yùn)算符單獨(dú)使用

    以自加運(yùn)算為例,使用整型變量i作為操作數(shù),在運(yùn)算符單獨(dú)使用的情況下,有i++;和++i;兩種形式,不論是用前綴表示還是后綴表示,都可以使i的值增加1,當(dāng)然也可以使用賦值語(yǔ)句i=i+1;實(shí)現(xiàn)。但是,對(duì)于多數(shù)C的編譯程序,利用自加/自減運(yùn)算使變量增加/減少1和使用賦值語(yǔ)句相比,生成代碼的運(yùn)行速度會(huì)快很多,目標(biāo)代碼的效率更高一些。因此從效率上分析,前兩種形式的效率更高。

    2.2 自加/自減運(yùn)算符在復(fù)合表達(dá)式中使用

    同樣以自加運(yùn)算為例,使用整型變量i作為操作數(shù),分析運(yùn)算符在復(fù)合表達(dá)式中的使用情況。

    (1)i=3;y=i++;printf(“i=%d,y=%d”,i,j);

    (2)i=3;y= ++ i;printf(“i=%d,y=%d”,i,j);

    在第一個(gè)程序段中,運(yùn)行結(jié)果為i=4,y=3。說明在y=i++語(yǔ)句中,i先將增加前的值賦給y,在當(dāng)前表達(dá)式計(jì)算完成之后才自己增加1,所以輸出結(jié)果時(shí),i的值是4,而y的值為3。

    在第二個(gè)程序段中,運(yùn)行結(jié)果為i=4,y=4。在y= ++ i語(yǔ)句中,i的值先增加1,再把增加后的值參與本表達(dá)式的運(yùn)算,賦給y,所以i,y的值都為4。

    通過以上兩個(gè)程序段的分析,我們發(fā)現(xiàn),當(dāng)使用后綴表示時(shí),變量i會(huì)先將自己的值賦給y,再對(duì)自己加1,而使用前綴表示時(shí),變量i先自己增加1,再將增加后的值賦給y??梢詫⑦@兩種情況總結(jié)為“變量在前就先使用,變量在后就先加”。

    3 自加/自減運(yùn)算符的優(yōu)先級(jí)和結(jié)合方向

    C語(yǔ)言規(guī)定,在表達(dá)式求值時(shí),先看運(yùn)算符的優(yōu)先級(jí),優(yōu)先級(jí)高的先運(yùn)算,對(duì)于同一優(yōu)先級(jí)的運(yùn)算符,則按照結(jié)合方向確定運(yùn)算次序。自加/自減運(yùn)算符是單目運(yùn)算符,優(yōu)先級(jí)僅次于括號(hào)等運(yùn)算符,結(jié)合方向?yàn)樽杂蚁蜃?。也就是說在出現(xiàn)多個(gè)同等級(jí)的運(yùn)算符時(shí),需要按照自右向左的方向運(yùn)算。

    比如表達(dá)式y(tǒng)=-i++,按照優(yōu)先級(jí)分析,-和++運(yùn)算符的優(yōu)先級(jí)相同,賦值運(yùn)算符優(yōu)先級(jí)最低,因此先進(jìn)行-和++運(yùn)算,又因?yàn)樗麄兊慕Y(jié)合方向都是自右向左,因此變量i應(yīng)該先進(jìn)行自加運(yùn)算再進(jìn)行負(fù)號(hào)運(yùn)算。這樣該表達(dá)式就等價(jià)于y=-(i++),如果i的初值為3,則y的值就為-3。注意,這里使用的是后綴表示,所以應(yīng)該先使用i的值再自加,所以y的值不是-4。

    在另外一個(gè)表達(dá)式y(tǒng)=i+++j中,如果i的初值為3,j的初值為2,該表達(dá)式是按照y=(i++)+j計(jì)算,還是按照y=i+(++j)計(jì)算呢?如果單純從優(yōu)先級(jí)和結(jié)合方向考慮,自加運(yùn)算符的優(yōu)先級(jí)會(huì)高于加法運(yùn)算符,應(yīng)該先進(jìn)行自加運(yùn)算,但是自加的對(duì)象就沒辦法確定了。實(shí)際上,DEV C++編譯器會(huì)從左向右依次掃描表達(dá)式,盡可能多地把多個(gè)符號(hào)組合成一個(gè)運(yùn)算符,因此在掃描三個(gè)加號(hào)時(shí),會(huì)從左到右把前兩個(gè)加號(hào)看做自加運(yùn)算符,因此該表達(dá)式按照y=(i++)+j計(jì)算,由于自加運(yùn)算符是后綴形式,所以先取i的值計(jì)算再自加,最后計(jì)算結(jié)果為i=4,j=2,y=5。

    4 在一個(gè)表達(dá)式中出現(xiàn)多個(gè)自加/自減運(yùn)算符的復(fù)雜情況

    如果在一個(gè)表達(dá)式中出現(xiàn)了多個(gè)自加/自減運(yùn)算符,則表達(dá)式的計(jì)算就會(huì)變得很復(fù)雜,還有可能出現(xiàn)計(jì)算結(jié)果和編譯器相關(guān)的情況。本文中的程序段,均在DEV C++編譯環(huán)境下運(yùn)行。比如設(shè)變量初值為:int i=3;則有如下程序段:

    (1) k=(++i)+++i+++i; printf(“i=%d,k=%d”,i,k);

    (2) k=++i+(++i)+++i; printf(“i=%d,k=%d”,i,k);

    (3) k=(++i)+++i+ (++i); printf(“i=%d,k=%d”,i,k);

    (4) k=(++i)+(++i)+(++i); printf(“i=%d,k=%d”,i,k);

    在第一個(gè)程序段中,由于DEV C++編譯器會(huì)從左到右掃描表達(dá)式,并且合并盡可能多的字符作為一個(gè)運(yùn)算符,所以可以將表達(dá)式看做如下形式:k=((++i)++)+(i++)+i。首先進(jìn)行++i操作,則得到i的值為4,同時(shí)增加后的4值參與本表達(dá)式的運(yùn)算,再進(jìn)行后綴的自加運(yùn)算,則得到增加后的值為5,但是因?yàn)槭呛缶Y形式,所以參與運(yùn)算的依然是增加前的4,在后面的i++中,依然是使用增加前的值4參與運(yùn)算,但此時(shí)i的值已經(jīng)增加到了6,表達(dá)式中最后一個(gè)i的值,因?yàn)楸颈磉_(dá)式還沒有計(jì)算完成,因此依然取增加前的4值,所以最后k的值應(yīng)該等于12,而i的值為6。

    在第二個(gè)程序段中,依照上面的原則,可以將表達(dá)式看做如下形式:k=++i+((++i)++)+i首先進(jìn)行第一個(gè)++i操作,得到i的值為4,再進(jìn)行第二個(gè)++i操作,得到i的值為5,繼續(xù)進(jìn)行后綴的自加操作,在本表達(dá)式中參與運(yùn)算的值就是5,在表達(dá)式計(jì)算結(jié)束以后,i的值才修改為6。在進(jìn)行兩個(gè)結(jié)果相加的時(shí)候,第一個(gè)i的值已經(jīng)被后面的i修改為5 ,所以得到兩個(gè)加數(shù)的和為10,最后一個(gè)i的取值也是前面得到的5。因此,本表達(dá)式的計(jì)算結(jié)果為k=15,i=6。

    在第三個(gè)程序段中,表達(dá)式可以看作為k=((++i)++)+i+(++i)。首先計(jì)算(++i),并且用自加后的4參與后綴的自加運(yùn)算,所以在表達(dá)式計(jì)算結(jié)束時(shí)才自加,這樣就得到了兩個(gè)4相加的結(jié)果8,最后計(jì)算(++i),由于上一個(gè)后綴的自加運(yùn)算,加1的結(jié)果要在表達(dá)式計(jì)算結(jié)束后才進(jìn)行,所以這里的i值還是4,用4作為前綴自加的值,則(++i)的結(jié)果就為5,用前面的中間結(jié)果8和5相加,就得到了k=13的結(jié)果,而在表達(dá)式計(jì)算結(jié)束以后,進(jìn)行了最后一次自加操作,i的值變成6。

    在第四個(gè)表達(dá)式中,參照第二個(gè)表達(dá)式的計(jì)算過程,先進(jìn)行兩個(gè),得到兩個(gè)5相加,再進(jìn)行第三個(gè)(++i)操作,此時(shí)i的值變?yōu)?,參與本表達(dá)式運(yùn)算的值也為6,所以最后的計(jì)算結(jié)果為k=16,i=6。

    從以上四個(gè)表達(dá)式的計(jì)算過程可以發(fā)現(xiàn),在于DEV C++環(huán)境下,一個(gè)表達(dá)式中出現(xiàn)多個(gè)自加/自減運(yùn)算符的時(shí)候,同一個(gè)表達(dá)式,由于括號(hào)的位置不同,或者操作數(shù)的位置不同,會(huì)引起計(jì)算結(jié)果的變化。

    C語(yǔ)言允許用戶在一條語(yǔ)句使用含多個(gè)賦值和自增/自減運(yùn)算符,這很大程度上給設(shè)計(jì)者提供了自由度,但是會(huì)給程序的通用性和易讀性帶來(lái)影響。在本文中,以DEV C++作為運(yùn)行環(huán)境,編譯器是從左至右掃描表達(dá)式的,但是在其他編譯器中可能會(huì)出現(xiàn)從右至左掃描的情況,那么同一個(gè)程序的運(yùn)行結(jié)果就不同了。在這種情況下,我們應(yīng)該盡可能避免此類情況的出現(xiàn),在一條語(yǔ)句中至多使用一個(gè)自增/自減運(yùn)算符,并且使用括號(hào)將它們和其他運(yùn)算符分隔,以免使得表達(dá)式引起歧義或者由于編譯器不同而導(dǎo)致計(jì)算結(jié)果不同的情況。

    參考文獻(xiàn):

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

    [2] 蘇小紅.C語(yǔ)言大學(xué)實(shí)用教程[M].北京:電子工業(yè)出版社,2007.

    [3] 朱鳴華.C語(yǔ)言程序設(shè)計(jì)教程(第三版)[M].北京:機(jī)械工業(yè)出版社,2014.

    [4] 張長(zhǎng)海.程序設(shè)計(jì)基礎(chǔ)(第2版).北京:高等教育出版社,2013.

    洪洞县| 抚远县| 金寨县| 东明县| 孝义市| 九江县| 玉山县| 蒙阴县| 河曲县| 汝阳县| 南郑县| 开鲁县| 江达县| 石柱| 望江县| 合川市| 曲麻莱县| 三穗县| 沅陵县| 哈尔滨市| 永福县| 宜春市| 芷江| 廉江市| 上杭县| 扎囊县| 屯留县| 靖宇县| 修水县| 海阳市| 巫山县| 农安县| 湟源县| 多伦县| 拜城县| 山阴县| 咸丰县| 海城市| 濉溪县| 博罗县| 九龙县|