每日一问4: ++i和i++的区别

C++中区别

  i++和++i很明显的区别就是:++i是先对i进行加一操作然后再返回i的值,而i++是先返回i的值再对i进行加一操作。

int main()
{
    int i = 1, j = 1;
    cout << "i++:" << i++ << endl;
    cout << "++j:" << ++j << endl;
    return 0;
}

  执行结果如下:

  然后我再从C++的角度将一下这两者的区别,首先我们来看看这两者的底层实现:

//++i
Typename operator ++()
{
    (*this) = (*this) + 1;
    return *this;
}
//i++
Typename operator ++(int)
{
    A t = *this;
    ++(*this);
    return t;
}

  这里需要注意的是,int 在 括号内是为了向编译器说明这是一个后缀形式,而不是表示整数。此外我们也可以看到,i++返回的是一个临时变量,即右值(左右值的概念可以看这里)C++中的左值,右值,左值引用,右值引用。所以不能对其进行普通引用,示例代码如下:

int fun(int& i)
{
    cout << i << endl;
}

int main()
{
    int i = 1, j = 1;
    fun(i++);    //正确
    fun(++i);     //错误,非常量引用的初始值必须为左值
    return 0;
}

  此外,在for循环中,使用i++和++i虽然效果是一样的,但是两者的效率是有区别的。从前面的底层实现我们可以看到,i++需要生成一个临时变量,而++i不需要,所以在大多数情况下,for循环中推荐使用++i。

  i--和--i可以类比i++和++i来学习,这两者没有什么区别。

 C中区别

  C语言中,i++和++i都是复制一份变量值得拷贝,这些操作符的结果不是被修改的变量,而是变量值的拷贝。这一点和C++中区别很大,以下面的代码为例:

#include<stdio.h>
int main(){
    int a = 1;
    ++a = 10;
    return 0;                  
}

在C语言中,上述的代码是不合法的,因为++a返回的是a的拷贝,是一个临时变量,不能对其赋值,但在C++中,这一句代码就是合法的。对于a++ = 4这类型表达式,C++和C语言都是不支持的。

posted @ 2020-10-12 17:22  浩楠honer  阅读(1174)  评论(0编辑  收藏  举报