C++提供了几个赋值运算符可以缩写赋值表达式。例如下列语句:
可以用加法赋值运算符(addition assignment operator)“+=”缩写如下:
+=运算符将运算符右边表达式的值与运算符左边表达式的值相加,并将结果存放在运算符左边表达式的值中。下列形式的语句:
variable = variable operator expression;
其中operator为二元运算符+、-、/或%之一(或今后要介绍的其他二元运算符),均可写成如下形式:
variable operator = exprission;
这样,赋值语句c+=3将3与c相加。图2.12显示了算术赋值运算符、使用这些算术赋值运算符的示例表达式和说明。
使用缩写赋值运算符可以使程序更员快地编写程序,也可以使编译器更快地编译程序。有些编译器在用缩写赋值远算符时能产生运行速度更快的代码。
本书介绍的许多性能提示只产生少量改进,读者可能不会大注意。但在多次重复的循环中,少量的改进可能积累成巨大的性能改进。
赋值运算符 示例表达式 说明 赋值 假设int c=3,d=5,e=4,f=6,g=12; += e+=7 c=c+7 10赋值给e -= d-=4 d=d-4 1赋值d *= e*=5 e=e*5 20赋值给e /= f/=3 f=f/3 2赋值给f %= g%=9 g=g%9 3赋值给g
C++还提供一元自增运算符(increment operator,++)和一元自减运算符(dcrement operator),见图2.13。如果变量c递增1,则可以用自增运算符++,而不用表达式c=c+1或c+=1。如果将自增和自减运算符放在变量前面,则称为前置自增或前置递减运算符(preincrement或predecrementope~torL如果将自增和自减运算符放在变量后面,则称为后置自增或后置自减运算撤postmcrement或postdcrement operator)。前置自增(前置自减)运算符使变量加1(减1),然后在表达式中用变量的新值。后置自增(后置自减)运算符在表达式中用变量的当前值,然后再将变量加1(减1)。
运算符 名称 示例表达式 说明 ++ 前置自增 ++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 <iostream.h> 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.11的三个赋值语句:
passes=passes+1; failures=failures+1 student=student十1;
可以改写成更简练的赋值运算符形式:
passes+=1; failures+=1; student+=1;
使用前置自增运算符,如下所示:
++passes; ++failures; ++student;
或使用后置自增运算符,如下所示:
passes++ failures++ student++
注意,单独一条语句中自增或自减变量时,前置自增与后置自增计算之间的的结果一样,前置自减与后置自减计算之间的结果也相同。只有变量出现在大表达式中时,才能体现前置自增与后置自增计算之间的差别(和前置自减与后置自减计算之间的差别)。
目前只用简单变量名作为自增和自减的操作数(稍后会介绍,这些运算符也可以用于左值)。
要用非简单变量名表达式(如++(x+1))作为自增和自减运算符的操作数是个语法错误。
图2.15显示了前面所介绍的运算符优先级和结合律,从上到下,优先级依次递减。第二栏介绍每一级运算符的结合律,注意条件运算符(:)、一元运算符自增(++)、自减(--)、正(+)、负(-)、强制类型转换以及赋值运算符(=、+=、-;、*=、/=和%=)的结合律为从右向左。图1.15中所有其他运算符的结合律为从左向右。第三栏是运算符的组名。
运算符 结合律 类型 ( ) 括号 ++ -- + - static_cast() 从左向右 一元 * / % 从右向左 乘 + - 从左向右 加 << >> 从左向右 插入/读取 < <= > >= 从左向右 关系 == != 从左向右 相等 ?: 从右向左 条件 = += -= *= /= %= 从右向左 赋值 , 从左向右 逗号
计数器控制循环要求:
l.控制变量(或循环计数器)的名称(name)。
2.控制变量的初始值(initial value)。
3.测试控制变量终值(final value)的条件(即是否继续循环)。
4.每次循环时控制变量修改的增量或减量(increment decrement)。
考虑图2.16所示的简单程序,打印1到10的数字。声明:
int counter = 1;
指定控制变量(counter)并声明为整数,在内存中为其保留空间并将初始值设置为1。需要初始化的声明实际上是可执行语句。在C++中,将需要分配内存的声明称为定义(definition)更准确。
// Fig. 2.16: fig02_16.cpp // Counter-controlled repetition #includeint main() { int counter = 1; // initialization while ( counter <= 10 ) { // repetition condition cout << counter << endl; ++counter; // increment } }
输出结果: 2 4 5 0 8 9 10
counter的声明和初始化也可以用下列语句完成:
int counter; counter=1;
声明不是可执行语句,但赋值是可执行语句。我们用两种方法将变量初始化。
下列语句:
++counter;
在每次循环时将循环计数器的值加1。while结构中的循环条件测试控制变量的值是否小于或等于10
(条件为true的终值)。注意,即使控制变量是10时,这个while结构体仍然执行。控制变量超过10
时(即counter变成11时),循环终止。
图2.16的程序也可以更加简化,将counter初始化为。并将while结构换成:
while (++counter <= lO) cout << counter << endl;
这段代码减少了语句,直接在while条件中先增加计数器的值再测试条件。这段代码还消除了while
结构体的花括号,因为这时while只包含一条语句。由于浮点值可能是近似值,用浮点变量控制计数循环可能导致不精确的计数器值,使测试的结果不准确。
用整数值杜制计数循环。
缩排每个控制结构体中的语句。
在每个控制结构前后加上空行,使其在程序中一目了然。
嵌套太多会使程序难以理解。一般来说,缩排不宜超过三层。