2008-01-01

模數運算子:%

  模數運算子(modulus operator)主要用於整數的計算,「a%b」:a除以b後得到的餘數即是該運子求得的答案。有看過我之前寫的「整數型態的除法」的人可能就會問「用於浮點數計算的話會得到什麼?」這點可以不用擔心,因為模數運算子不提供浮點數運算,compiler會跳出來阻止你的!

  模數運算子看起來似乎只是很普通的數學運算子,實際上他的用處可不少呢!參考以下程式碼:

#include <stdio.h>

int main() {
int i = 0 ;
while(i++ < 5) {
if(i%2)
printf("%d => 奇數\n", i) ;
else

printf("%d => 偶數\n", i) ;
}
system("pause") ;
return 0 ;
}
印出結果不意外的是
1 => 奇數
2 => 偶數
3 => 奇數
4 => 偶數
5 => 奇數
  透過模數運算子很簡單的就能判斷奇偶數,當然這只是很簡單的應用範例,在思考下面的程式範例:
#include <stdio.h>

int main() {
int i = 0 ;
while(i++ < 12) {
printf("%2d ", i) ;
if(i%4==0)
printf("\n 印了四次!!\n") ;
}
system("pause") ;
return 0 ;
}
得到結果如下:
1 2 3 4
印了四次!!
5 6 7 8
印了四次!!
9 10 11 12
印了四次!!
  此範例示範了模數運算子在週期性上的應用,常見應用如印月曆。除了上面兩個簡單的應用範例外,當然還有數不盡的範例可以說,若只是講解應用範例的話那就太沒意思了!真正的重點在下面這段程式碼:
#include <stdio.h>

int main() {
printf("%d\n", 5%2) ;
printf("%d\n", -5%2) ;
printf("%d\n", 5%-2) ;
printf("%d\n", -5%-2) ;
system("pause") ;
return 0 ;
}
  思考一下究竟會得到什麼結果?!

  這在C99標準制定之前可是沒有標準答案,但既然現在C99已是公認的標準,因此就遵循C99的規則來思考吧:前面的運算元如果是負的,得到的結果就是負的;如果前面的運算元是正數,則結果就是正數,簡單來說就是看左邊的運算子正負號即可。因此結果如下:
1
-1
1
-1

沒有留言: