2.12 自增和自减运算符
C++还提供一元自增运算符(increment operator,++)和一元自减运算符(dcrement operator),见图2.13。如果变量c递增1,则可以用自增运算符++,而不用表达式c=c+1或c+=1。如果将自增和自减运算符放在变量前面,则称为前置自增或前置递减运算符(preincrement或predecrementope~torL如果将自增和自减运算符放在变量后面,则称为后置自增或后置自减运算撤postmcrement或postdcrement operator)。前置自增(前置自减)运算符使变量加1(减1),然后在表达式中用变量的新值。后置自增(后置自减)运算符在表达式中用变量的当前值,然后再将变量加1(减1)。
图 2.13 自增和自减运算符
运算符 | 名称 | 示例表达式 | 说明 |
++ | 前置自增 | ++a | 将a加1,然后在a出现的表达式中使用新值 |
++ | 后置自增 | a++ | 在a出现的表达式中使用当前值,然后将a加1 |
-- | 前置自减 | --b | 将b减1,然后在b出现的表达式中使用新值 |
-- | 后置自减 | b-- | 在b出现的表达式中使用当前值,然后将b减1 |
图2.14的程序演示了++运算符的前置自增与后置自增计算之间的差别,后置自增变量c使其在输出语句中使用之后再递增,而前置自增变量c使其在输出语句中使用之前递增。
// Fig, 2.14:fig02 14.cpp // Preincrementing and postincrementing #include int main(){ int c; C = 5; cout << C << endl; // print 5 cout << C++ << endl; // print 5 then postincrement cout << c << endl << endl; // print c = 5; cou << c << endl; // print 5 cout << ++c << endl; // preincrement then print 6 cout << c << endl; return O; // successful terminatiOn }
输出结果:
5 5 6 5 6 6
程序显示使用++运算符前后的c值,自减运算符的用法类似。
编程技巧2.14
一元运算符及其操作数之间不能插入空格。
图2.11的三个赋值语句:
passes=passes+1; failures=failures+1; student=student+1;
可以改写成更简练的赋值运算符形式:
passes+=1; failures+=1; student+=1;
使用前置自增运算符,如下所示:
++passes; ++failures; ++student;
或使用后置自增运算符,如下所示:
passes++ failures++ student++
注意,单独一条语句中自增或自减变量时,前置自增与后置自增计算之间的的结果一样,前置自减与后置自减计算之间的结果也相同。只有变量出现在大表达式中时,才能体现前置自增与后置自增计算之间的差别(和前置自减与后置自减计算之间的差别)。
目前只用简单变量名作为自增和自减的操作数(稍后会介绍,这些运算符也可以用于左值)。
觉编程错误2.11
要用非简单变量名表达式(如++(x+1))作为自增和自减运算符的操作数是个语法错误。
图2.15显示了前面所介绍的运算符优先级和结合律,从上到下,优先级依次递减。第二栏介绍每一级运算符的结合律,注意条件运算符(?:)、一元运算符自增(++)、自减(--)、正(+)、负(-)、强制类型转换以及赋值运算符(=、+=、-;、*=、/=和%=)的结合律为从右向左。图1.15中所有其他运算符的结合律为从左向右。第三栏是运算符的组名。
图 2.15 前面所介绍的运算符优先级和结合律
运算符 | 结合律 | 类型 |
() | 括号 | |
++ -- + - static_cast<type>() | 从左向右 | 一元 |
* / % | 从右向左 | 乘 |
+ - | 从左向右 | 加 |
<< >> | 从左向右 | 插入/读取 |
< <= > >= | 从左向右 | 关系 |
== != | 从左向右 | 相等 |
?: | 从右向左 | 条件 |
= += -= *= /= %= | 从右向左 | 赋值 |
, | 从左向右 | 逗号 |