C++基础---自增自减运算符

1. 自增自减运算符

1.1 自增自减运算符的定义

  • 自增运算符:++
  • 自减运算符:- -
  • 自增自减运算符:都是单目运算符, 只能应用于变量,而不能用于常量或表达式。结合性与简单赋值运算符相同,但优先级高于任何双目运算符

1.2 自增自减运算符均有两种使用形式

  • 前缀形式:即它们在操作数前,如:++x,- -x
  • 后缀形式:即它们在操作数后,如:x++,x- -
  • 前缀与后缀的表达式独立使用时:结果是没有区别

    ++a; //等价于a+=1; 或 a=a+1;
    a++; //等价于a+=1; 或 a=a+1;
    --a; //等价于a-=1; 或 a=a-1;
    a--; //等价于a-=1; 或 a=a-1;

    注:作为单一语句,前置与后置自增自减运算符的操作作用是相同的。

  • 前缀与后缀在表达式中被引用时: 结果是不同的
    (1)前置:前置运算符表示在赋值之前先进行自增或自减运算
    例子:先使值加1或减1,然后再取值

    int a = 1;
    cout<<++a; =>2(a的值输出为2)
    或:
    int a = 1;
    cout<<--a; =>0(a的值输出为0)

    (2)后置:后置运算符表示在赋值之后再进行自增或自减运算
    例子:先取值,然后再使值加1或减1

    int a = 1;
    cout<<a++; =>1(a的值输出为1)
    cout<<a ;  =>2(a的值输出为2)
    或:
    int a = 1;
    cout<<a--; =>1(a的值输出为1)
    cout<<a ;  =>0(a的值输出为0)

    注:作为表达式的结果,前置返回的是左值,后置返回的不是左值。

1.3 自增自减运算操作

  • 前增量、后增量操作正确性判别

    const int e = 8;
    e++; //错:e是常量,值不能修改
    8++; //错:8不是左值
    int  a = 3;
    int b = ++a;//对:a的值为4,b的值为4,相当于(a=3;) ++a;(a=4;) b=a;
    int c = a+1;//对:a的值为4,c的值为5,a的值没发生自增或自减
    int d = a++;//对:d的值为4,a的值为5,相当于b=a; a++;
    a++ -= 2;//错:a++不是左值
    ++a += 5;//对:++a是左值,a的值为11,相当于(a=5;) ++a;(a=6;) a+=5
    ++(++a);//对:++a为左值,可执行++(++a)操作
    ++a++;//错:按优先级即++(a++),而a++非左值,不能做前置增量操作

1.4 自增自减操作符识别

  • ++与- -是连体操作符: 如果分开写,则成两个独立的+或-了,所以中间不能有空格。如果有多于两个的+或-连写,则编译器按”贪吃法则“理解。所谓贪吃,是指只要能理解能成为操作符,就尽量多读入字符。

    int a=1, b=5, c;
    c=a + b;//对:c=6
    c=a ++ b;//错:a++和b是两个表达式,缺互相运算的操作符
    c=a +++ b;//对:a++ + b c=6
    c=a ++++ b;//错:a++++b是两个表达式,缺互相运算的操作符
    c=a +++++ b;//错:a++ ++ +b,a++非左值,不能再进行++操作
    c=a +++ b++;//对:a++ + b++,c=6
    c=++a + b;//对:++a + b c=7
    c=++a ++ b;//错:++a非左值,不能再进行++操作
    c=++a +++ b;//错:++a非左值,不能再进行++操作

1.5 使用自增自减操作符的注意事项

  • 表达式的值和变量值的区别:
    以自增运算符为例,当自增运算符++作用于一个变量时,

    例如:当 i = 3 时,
    
    cout<<++i<<endl;
    这个算术表达式的输出值为4,同时变量i的值也由原来的3改变为4。
    
    cout<<i++<<endl;
    这个算术表达式的输出值为3,但变量i的值由原来的3改变为4

    注:一般情况下,计算表达式后不改变变量的值,而自增自减运算符和运算符组成的表达式计算后,则改变变量的值,这称为运算符的副作用,这种运算符在计算表达式时,一定要注意区分表达式的值和变量的值。

  • 前缀运算和后缀运算的区别:前缀运算是“先变后用”,而后缀运算是“先用后变”。
  • 运算符的运算对象:自增自减运算符能作用于变量 , 而不能作用于常量或表达式。
    注:因为自增自减运算符具有对运算量重新赋值的功能 , 而常量、表达式无存储单元可言。
  • 运算符的结合方向:自增自减运算符的结合方向都是从右向左。

注:当自增自减运算符所在的表达式或语句中只含一种操作时(即单一表达式),则其前缀和后缀功能对程序的作用时一样的;而当含有两个或两个以上操作时,在考虑各个运算符的优先级别和结合性的基础上,则其前缀和后缀的功能对程序的作用时不一样的。
(1)为了提高程序的效率,需要用技巧把程序写得尽可能简洁一些,但这样有可能降低和谐的可能性和可理解性。
(2)可读性差的程序容易隐藏错误且难于纠正 ,不易维护,降低了程序的可靠性。
(3)人们在程序设计时遵守的基本规范是:可靠性第一,效率第二。为了保证可靠性,程序必须清晰易读,而表达式的清晰易读是十分重要的,因此,在程序设计中要慎重。

参考文献:
[1]《C++全方位学习》范磊——第五章
[2]《C++程序设计教程(第二版)》钱能——第四章
[3] 百度搜索关键字:C++运算符、增量操作、自增自减操作符、前置与后置自增自减操作符

你可能感兴趣的:(C++运算符,自增自减运算符,自增自减的注意事项,前置与后置++)