目录
在C和C++编程语言中,自增运算符是常用的操作之一,它用来将变量的值增加一。自增运算符有两种形式:后缀形式i++
和前缀形式++i
。虽然它们看起来非常相似,但它们在执行时的行为却有所不同。
后缀自增运算符 i++
后缀自增运算符是最常见的形式。它的操作分为两步:
- 保持变量
i
的当前值不变,并将其作为表达式的结果。 - 然后,将变量
i
的值增加1。
示例:
int i = 0;
int a = i++; // a 被赋值为 0,但 i 随后变为 1
在这个例子中,a
首先被赋值为i
的当前值(0),然后i
的值增加1。
前缀自增运算符 ++i
前缀自增运算符的操作也是分为两步,但顺序与后缀形式相反:
- 首先将变量
i
的值增加1。 - 然后,使用变量
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开始。
如
- 方法一:先放top加至0,然后给arr[0]赋值;
- 方法二:数值加加后,给top赋值,++后为0,top=0,arr[0];
- 使用top++:先给top赋值,top=-1,然后执行++,arr[0],此时top值不满足要求,不代表栈顶