增值和減值操作符

在多數指令式編程語言中,增值和減值操作符指的是一類單目操作符,這些操作符相應地增加或減少其操作數的值。以C語言為例,「++」「--」操作符分別為增值操作符和減值操作符。

對操作數的限制(C語言)

增值和減值操作符的操作數可以為整型字符或者指針等,準確地說,這些操作符只要求其操作數必須為一個左值,也就是要求操作數必須為一個可以用在賦值符號「=」左邊的表達式。

用法(C語言)

  • 前綴形式的++和--操作符。前綴形式的++和--操作符出現在操作數的前面,應用了這種形式後,操作數本身會相應的增加或減少。同時,表達式的值為操作數增加或減少後的值。用法如下所示:
  int i = 1;      //运行完这条语句,i被赋值为1
  int j = ++i;    //运行完这条语句,i的值增了1变为2,而j的值为“++i”这个表达式的值为2
  --j;            //运行完这条语句,j的值减了1变为1,表达式“--j”的值为1但被抛弃
  • 後綴形式的++和--操作符。後綴形式的++和--操作符出現在操作數的後面,應用了這種形式後,操作數本身會相應的增加或減少。同時,表達式的值為操作數增加或減少前的值。用法如下所示:
  int i = 5;      //运行完这条语句,i被赋值为5
  int j = i++;    //运行完这条语句,i的值增了1变为6,而j的值为“i++”这个表达式的值为5
  j--;            //运行完这条语句,j的值减了1变为4,表达式“j--”的值为5但被抛弃

原理(C語言)

對一個操作數應用增值或減值操作符,抽象來說將會創建一份操作數的拷貝,而創建拷貝的時間則根據操作符是前綴形式還是後綴形式來決定。所以使用這種操作符的表達式,實際用到的正是這份拷貝而不是操作數本身。所以編譯器並不允許如i++ = 2;這樣的語句出現。

一些實際應用(C語言)

  • 在計數功能上,使用增值和減值操作符可以讓表達式比普通的賦值語句看起來更加簡潔。
  for( int i=0; i<5; i++ ){ 一些代码; }    //应用于循环的计数
  • 增值和減值操作符可以用在指針的移動上以提高程序效率。
  //dst和src为大小相同的整型数组,以下程序实现了把src数组内容复制到dst数组的功能
  //用增值减值操作符读取数据比用数组下标读取数据效率要高得多
  register int *p1, *p2;
  for( p1=src,p2=dst; p1<&src[SIZE]; )
  {
      *p2++ = *p1++;
  }

作為C++運算符

C++語言支持運算符重載。因此需要區分重載的是前增/減運算符還是後增/減運算符。

重載前置的++、-- 運算符時,函數無形參:

TestClass& operator++();
TestClass& operator--();

重載後置的++、--運算符時,函數中需要一個int形參(即啞元,an additional dummy int argument):

TestClass& operator++(int);
TestClass& operator--(int);

參考書目

  • [美]Brian W.Kernighan,Dennis M.Ritchie. C程序设计语言(第2版·新版). 機械工業出版社 (中文).