6.1 特殊運算符

 

C語言學習欄目目錄

目錄

1、sizeof運算符和size_t類型

2、求模運算符:%

3、遞增運算符:++

4 、遞減運算符:--

5、 優先級


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: 

-11 - (-11/5) * 5 = -11 -(-2)*5 = -11 -(-10) = -1

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,再使用”。

 

源碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章