C語言學習欄目目錄
目錄
C語言有大約40個運算符,有些運算符比其他運算符常用得多。前面討 論的是最常用的,本節再介紹4個比較有用的運算符。
1、sizeof運算符和size_t類型
前面我們就見過sizeof運算符。回顧一下,sizeof運算符以字節爲單 位返回運算對象的大小(在C中,1字節定義爲char類型佔用的空間大小。過 去,1字節通常是8位,但是一些字符集可能使用更大的字節)。運算對象可 以是具體的數據對象(如,變量名)或類型。如果運算對象是類型(如, float),則必須用圓括號將其括起來。程序清單6.1演示了這兩種用法。
程序清單6.1 sizeof.c程序
#include <stdio.h>
/************************************************************************
功能:使用sizeof運算符
************************************************************************/
int main()
{
// 使用C99新增的%zd轉換說明 -- 如果編譯器不支持%zd,請將其改 成%u或%lu
int n = 0;
size_t intsize;
intsize = sizeof (int);
printf("n = %d, n 有 %zd 個 bytes; 整個 ints 有 %zd 個 bytes.\n", n,sizeof n,intsize);
//暫停控制檯
system("pause");
return 0;
}
C 語言規定,sizeof 返回 size_t 類型的值。這是一個無符號整數類型, 但它不是新類型。前面介紹過,size_t是語言定義的標準類型。
2、求模運算符:%
模運算符(modulus operator)用於整數運算。求模運算符給出其左側 整數除以右側整數的餘數(remainder)。例如,13 % 5(讀作“13求模5”)得3,因爲13比5的兩倍多3,即13除以5的餘數是3。求模運算符只能用於整 數,不能用於浮點數。
負數求模如何進行?C99規定“趨零截斷”之前,該問題的處理方法很 多。但自從有了這條規則之後,如果第1個運算對象是負數,那麼求模的結 果爲負數;如果第1個運算對象是正數,那麼求模的結果也是正數:
11 / 5得2,11 % 5得1
11 / -5得-2,11 % -2得1
-11 / -5得2,-11 % -5得-1
-11 / 5得-2,-11 % 5得-1
如果當前系統不支持C99標準,會顯示不同的結果。實際上,標準規定:無論何種情況,只要a和b都是整數值,便可通過a - (a/b)*b來計算a%b。例如,可以這樣計算-11%5:
3、遞增運算符:++
遞增運算符(increment operator)執行簡單的任務,將其運算對象遞增 1。該運算符以兩種方式出現。第1種方式,++出現在其作用的變量前面,這是前綴模式;第2種方式,++出現在其作用的變量後面,這是後綴模式。 兩種模式的區別在於遞增行爲發生的時間不同。我們先解釋它們的相似之 處,再分析它們不同之處。程序清單6.3中的程序示例演示了遞增運算符是 如何工作的。
程序清單6.3 add_one.c程序
#include <stdio.h>
/************************************************************************
功能:使用sizeof運算符
************************************************************************/
int main(void)
{
int ultra = 0,super = 0;
while(super < 5)
{
super++;
++ultra;
printf("super = %d, ultra = %d \n", super, ultra);
}
//暫停控制檯
system("pause");
return 0;
}
運行該程序後,其輸出如下:
super = 1, ultra = 1
super = 2, ultra = 2
super = 3, ultra = 3
super = 4, ultra = 4
super = 5, ultra = 5
請按任意鍵繼續. . .
該程序兩次同時計數到5。用下面兩條語句分別代替程序中的兩條遞增 語句,程序的輸出相同:
super = super + 1;
ultra = ultra + 1;
4 、遞減運算符:--
每種形式的遞增運算符都有一個遞減運算符(decrement operator)與之 對應,用--代替++即可:
--count; // 前綴形式的遞減運算符
count--; // 後綴形式的遞減運算符
使用同 ++ 表達式;
不建議++和--不要和其他運算符在同一個表達式使用,容易出錯。也不容易代碼閱讀和維護。
5、 優先級
遞增運算符和遞減運算符都有很高的結合優先級,只有圓括號的優先級 比它們高。因此,x*y++表示的是(x)*(y++),而不是(x+y)++。不過後者無效,因爲遞增和遞減運算符只能影響一個變量(或者,更普遍地說,只能影 響一個可修改的左值),而組合x*y本身不是可修改的左值。不要混淆這兩個運算符的優先級和它們的求值順序。假設有如下語句:
y = 2;
n = 3;
nextnum = (y + n++)*6;
nextnum的值是多少?把y和n的值帶入上面的第3條語句得:
nextnum = (2 + 3)*6 = 5*6 = 30
n的值只有在被使用之後纔會遞增爲4。根據優先級的規定,++只作用於n,不作用與y + n。除此之外,根據優先級可以判斷何時使用n的值對錶達 式求值,而遞增運算符的性質決定了何時遞增n的值。
如果n++是表達式的一部分,可將其視爲“先使用n,再遞增”;而++n則表示“先遞增n,再使用”。
源碼