每日一问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;
}

执行结果如下:

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

然后我再从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语言都是不支持的。
原文链接: https://www.cnblogs.com/honernan/p/13804017.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/203887

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:40
下一篇 2023年2月12日 下午9:41

相关推荐