深入理解C/C++中的自增运算符:i++与++i

目录

后缀自增运算符 i++

前缀自增运算符 ++i

左值和右值

循环中的使用

未定义行为

总结

贴一段栈和队列中用到的代码,体会!


在C和C++编程语言中,自增运算符是常用的操作之一,它用来将变量的值增加一。自增运算符有两种形式:后缀形式i++和前缀形式++i。虽然它们看起来非常相似,但它们在执行时的行为却有所不同。

后缀自增运算符 i++

后缀自增运算符是最常见的形式。它的操作分为两步:

  1. 保持变量i的当前值不变,并将其作为表达式的结果。
  2. 然后,将变量i的值增加1。

示例:

int i = 0;
int a = i++; // a 被赋值为 0,但 i 随后变为 1

在这个例子中,a首先被赋值为i的当前值(0),然后i的值增加1。

前缀自增运算符 ++i

前缀自增运算符的操作也是分为两步,但顺序与后缀形式相反:

  1. 首先将变量i的值增加1。
  2. 然后,使用变量i增加后的值作为表达式的结果。

示例:

int i = 0;
int a = ++i; // i 首先变为 1,然后 a 被赋值为 1

在这个例子中,i的值首先增加1,变为1,然后a被赋值为这个新值。

左值和右值

++i是一个左值,因为它引用了一个存储位置,你可以将其赋值给其他变量或在表达式中多次使用。而i++在自增操作完成之前不是一个左值,因为它的值在自增之前是未确定的。

循环中的使用

在循环中,通常i++++i可以互换使用,因为编译器会优化这些操作。但是,它们的使用可能会影响程序的可读性和逻辑。

示例:

for (int i = 0; i < 5; ++i) {
    // 循环体
}

在这个循环中,每次迭代都会先将i的值增加1,然后再进行循环条件的判断。

未定义行为

当多个自增操作应用于同一个变量且顺序不明确时,程序的行为是未定义的。这意味着不同的编译器可能会产生不同的结果。

示例(不推荐):

int i = 1;
int j = (++i) + (++i) + (++i);
printf("%d", j); // 结果可能因编译器而异
总结
  • 使用i++时,表达式首先取i的当前值,然后i增加1。
  • 使用++i时,i首先增加1,然后表达式取i的新值。
  • ++i是左值,可以出现在赋值语句的左侧;i++在自增完成前不是左值。
  • 在编写程序时,应避免编写依赖于未定义行为的代码。
贴一段栈和队列中用到的代码,体会!
//写法一
void pushstack(int tempdata, Mystack* tempstack)
{
    if(tempstack->top < tempstack->size)
    {
        tempstack->top+=1;
        tempstack->arr[tempstack->top]=tempdata;
        printf("tempstack->arr:%d\n",tempstack->arr[tempstack->top]);
    }
    else
    {
        printf("stack overflow\n");
    }
}

//写法二
void pushstack(int tempdata, Mystack* tempstack)
{
    if(tempstack->top < tempstack->size)
    {
        tempstack->arr[++tempstack->top]=tempdata; //这里的从-1开始,因此需要考虑加的顺序
        printf("tempstack->arr:%d\n",tempstack->arr[tempstack->top]);
    }
    else
    {
        printf("stack overflow\n");
    }
}

由于使用-1作为栈的初始top,因此在压栈时,top需要自增,存放的数组序号也许从0开始。

  1. 方法一:先放top加至0,然后给arr[0]赋值;
  2. 方法二:数值加加后,给top赋值,++后为0,top=0,arr[0];
  3. 使用top++:先给top赋值,top=-1,然后执行++,arr[0],此时top值不满足要求,不代表栈顶
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值