自增大总结:i=(i++)+(++i)另i=?

源代码:

#include <stdio.h>

int main()
{
  int i = 1, j = 1, k;

  i = (i++) + (++i);
  printf("i=%d /n", i);

  k = (j++) + (++j);
  printf("j=%d, k=%d/n", j, k);
}

执行结果:

i=5
j=3, k=4


关键的汇编码片段:

 movl $0x1,0xfffffff0(%ebp)
 movl $0x1,0xfffffff4(%ebp)
 addl $0x1,0xfffffff0(%ebp)
 mov 0xfffffff0(%ebp),%eax
 add %eax,0xfffffff0(%ebp)
 addl $0x1,0xfffffff0(%ebp)
 mov 0xfffffff0(%ebp),%eax
 mov %eax,0x4(%esp)
 movl $0x8048500,(%esp)
 call 80482f8 <printf@plt>
 addl $0x1,0xfffffff4(%ebp)
 mov 0xfffffff4(%ebp),%eax
 add 0xfffffff4(%ebp),%eax
 mov %eax,0xfffffff8(%ebp)
 addl $0x1,0xfffffff4(%ebp)
 mov 0xfffffff8(%ebp),%eax
 mov %eax,0x8(%esp)
 mov 0xfffffff4(%ebp),%eax
 mov %eax,0x4(%esp)
 movl $0x8048507,(%esp)
 call 80482f8 <printf@plt>

发现,先执行++i,最后执行i++。

i = (i++) + (i++),i是不是等于2(0+0,接着i两次自加)
j = (i++) + (i++),j是不是等于0 (i没自加前把值赋给了j)

### 回答1: 这是因为while语句后面的分号导致循环体为空,所以i的值无法更新,始终满足i<=10的条件,导致陷入死循环。应该将分号去掉,改为如下形式: i = 1; while (i <= 10) { i++; } ### 回答2: 这段while语句将会造成死循环,因为条件判断中的变量i是一直小于等于10的,不会出现i大于10的情况,因此条件判断始终为真。而循环内部没有对变量i做任何修改,导致循环一直无法跳出,一直重复执行,直到程序强制终止。 为了避免这种情况发生,应该在循环内部对计数器变量i做出修改,使其增大或者减小,从而在一定条件下跳出循环。比如可以在循环体中使用i++或者i--等操作,控制循环次数达到预期的目的。 除此之外,可以结合条件判断语句使用,当满足一定条件时跳出循环。而条件判断语句中的条件应该是会发生变化,否则也会出现死循环的情况。 总之,避免死循环的方法是在循环体中对计数器变量进行修改,并且结合条件判断语句来控制循环次数。如果程序仍然陷入死循环,可以考虑增加输出语句或者调试工具,帮助定位问题。 ### 回答3: 首先,我们来看一下这段代码的语法结构: i = 1; // 定义变量i的初始值为1 while (i <= 10) ; // 当i小于等于10时执行下面的语句 i ; // 循环体,每次循环i都不变,不会出现i自增等操作 在这段代码中,我们可以发现while语句后面的分号“;”使得while语句成为空语句,即没有任何实际的执行内容。由于while语句的判断条件永远为真(即i<=10总是成立),因此程序会一直执行while语句,导致程序陷入死循环,并且i变量的值不会发生变化,随着每次循环的进行,计算机的硬件资源也会被消耗殆尽,导致程序无法正常执行下去。 这种情况称为“死循环”,是程序设计中常见的一种错误。为了避免死循环的发生,我们需要在while语句中添加合适的循环体,这样才能让程序按预期运行。 例如,我们可以将while语句的循环体修改为i++,这样每次循环i都会自增1,直到i的值大于10时才会跳出循环,代码如下: i = 1; while (i <= 10) { i++; // 每次循环i自增1 } // 此时i的值为11,循环结束 这样就可以避免陷入死循环的问题,让程序按照预期执行。在编写程序时,我们需要仔细检查每一行代码的语法结构和逻辑,避免出现死循环等错误,确保程序的正确性和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值