增值和减值操作符

在多数指令式编程语言中,增值和减值操作符指的是一类单目操作符,这些操作符相应地增加或减少其操作数的值。以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版·新版). 机械工业出版社 (中文).