摘 要: Ca語言的一個主要特點是運算符豐富、范圍廣。靈活地使用各種運算符可以實現在其它高級語言中難以實現的運算。本文主要對C語言中自增、自減兩個運算符的使用作詳細說明。
關鍵詞: C語言 自增、自減運算符 功能 運算規則
C語言中的運算符非常豐富,把除了控制語句和輸入輸出以外的幾乎所有的基本操作都作為運算符處理,靈活使用各種運算符可以實現在其他高級語言中難以實現的運算。在這些運算符中,最難理解、最易出錯也最為靈活的便是自增、自減運算符。下面我詳細歸納了使用自增、自減運算符時的注意事項,并結合運算符的優先級和其本身的特點,對Turbo C環境下的自增、自減運算符的功能與運算規則加以分析。
1.自增、自減運算符的作用及形式
C語言中的自增運算符“++”和自減運算符“--”的作用是使運算對象的值增1或減1,如i++,相當于i=i+1;i--,相當于i=i-1。因此,自增、自減運算本身也是一種賦值運算,其運算對象只要是標準類型的變量,不論是字符型、整型、實型或是枚舉型都可作為運算對象,而由于常量和表達式不占存儲單元,因此不能使用常量或表達式作運算對象,如1++、(a+b)--等都是非法的。
自增、自減運算符有兩種使用形式:前置式(++i,--i)和后置式(i++,i--)。前置式中先使i加減1,再使用i,后置式中先使用i,再使i加減1。
2.自增、自減運算符的應用
很多C語言教材和參考書都說明自增、自減運算符具有“從右向左”的結合性,并且由于操作數只有一個,屬于單目操作,因此優先級也高于其它雙目運算符和三目運算符的優先級。但在實際的編程中我們發現,自增、自減運算符的運算規則在不同的表達式中也不盡相同。下面我們就從自增、自減運算符的以下幾點應用來進行分析。
2.1自增、自減運算符在賦值表達式中的應用。
例1:main()
{int i=1,j=2,k;
k=i+++j;
printf(\"k=%d,i=%d,j=%d\\",k,i,j);
}
這里的i+++j是理解成i+(++j),還是理解成(i++)+j呢?Turbo C編譯處理將自左向右解釋為(i++)+j,而不是i+(++j),因此程序運行結果為:k=3,i=2,j=2。
2.2自增、自減運算符在條件表達式中的應用。
例:main()
{int i=1,j=3,k;
k=i>j?++i:++j;
printf(\"k=%d,i=%d,j=%d\\",k,i,j);
}
由于程序中的“i>j?++i:++j”是一個條件表達式,雖然自增運算符的優先級比條件運算符的優先級高,但在程序運行時,先對i是否大于j進行判斷,由于(i>j)為假,因此只需計算++j,j自增后為4,而對于++i并不計算,i仍為1,程序的運行結果為:k=4,i=1,j=4。
2.3自增、自減運算符在邏輯表達式中的應用。
例:main()
{int i=0,j=1,k=2,x;
x=++i||++j++k;
printf(\"x=%d,i=%d,j=%d,k=%d\\",x,i,j,k);
}
程序中的賦值語句“x=++i||++j++k;”在執行時,雖然里邊包含三個自增運算:++i、++j和++k,而自增運算符的優先級又高于邏輯運算符的優先級,但在Turbo C中實際只執行了++i,對++j和++k并沒有執行。這是因為在C語言中針對||運算符和運算符在使用的時候有一個規定:在一個復雜的邏輯表達式中,若前面子表達式的值能夠決定整個表達式的值,則后面的子表達式不需計算。在表達式x=++i||++j++k中,++i的值為1,它與后面的子表達式++j++k進行||運算,它能夠決定整個表達式的值,后面的++j和++k無需執行,因此程序的運行結果為:x=1,i=1,j=1,k=2。
2.4自增、自減運算符和其它單目運算符的應用。
例:main()
{int i=1,j;
j=-i++;
printf(\"%d,%d\\",i,j);
}
程序中對于同一個運算對象i而言,-和++都是單目運算符,優先級相同,那么到底是先運算-i呢,還是先運算i++。由于單目運算符具有從右向左的結合性,所以i先于右邊的運算符++結合,即先計算i++,在計算-i,表達式等價于-(i++)。程序運行結果為:2,-1。
2.5自增、自減運算符在函數中的應用。
例:main()
{int i=3;
printf(\"%d,%d\\",i,i++);
}
在調用函數時,對實參的求值順序,C標準并無統一規定。在有的系統中,從左至右求值,程序運行結果為:3,3。但在多數系統(如:Turbo C)中對函數參數的求值順序是從右向左,上面printf函數中藥輸出兩個表達式的值(i和i++),先求出第二個表達式i++的值3(i未自增時的值),然后在求解第一個表達式的值,由于在求解第二個表達式后,i自增1,i變為4,所以printf函數中的第一個參數i的值為4,程序運行結果為:4,3。
為了避免出現類似錯誤,程序最好改寫成:
main()
{int i=3,j;
j=i++;
printf(\"%d,%d\\",i,j);
}
綜上所述,在使用自增、自減運算符時,若在表達式或語句中只包含一種操作時(自增或自減),則前置式和后置式的作用都是一樣的,都是使變量加1或減1。若自增、自減運算符和其它運算符聯合使用時,就需根據從不同運算符優先級和結合性兩點上綜合考慮變量的變化方式。若在函數調用中使用自增、自減運算符時,我們要考慮不同的系統中處理方法不盡相同,所以對于初學者而言,若是不能熟練的掌握自增、自減運算符的使用,就需避免寫出別人看不懂,也不知道系統會怎樣執行的程序,盡量在比較單一的表達式中實現程序。總之,掌握好C語言的運算符、表達式對編寫簡潔明快、清晰易懂的程序非常重要。
參考文獻:
[1]譚浩強.C程序設計(第三版)[M].北京:清華大學出版社,2005.
[2]楊路明.C語言程序設計[M].北京:北京郵電大學出版社,2003.
[3]黃維通,馬力妮.C語言程序設計[M].北京:清華大學出版社,2003.
[4]宗大華,蔣瑋.C語言程序設計[M].人民郵電出版社,2003.
[5]秦玉平,戴心來.C語言中的自增自減運算[J].渤海大學學報,2004,(4):368.