【问题标题】:for(i=i-1;i>=0;i++) How does this line works?for(i=i-1;i>=0;i++) 这条线是如何工作的?
【发布时间】:2020-07-05 19:29:42
【问题描述】:

我阅读了将十进制转换为二进制的代码。其中,在反向计算二进制数并将其存储在数组中之后,有一个 for 循环来反向打印数组。 就像,

for(i=i-1;i>=0;i++)
printf("%d",b[i]);

谁能解释一下初始化部分是如何工作的?

【问题讨论】:

  • 如果循环开始前i-4,初始化部分将i设置为-5;如果i2 或更大,则进入(几乎)无限循环(UB)
  • i 的分配比以前少一个。但是,增量部分没有意义。它应该是i--,否则循环要么运行要么不运行,因为有符号整数永远不会从非负溢出到负(假设 C 中的有符号溢出是未定义的)。

标签: c syntax


【解决方案1】:

在您的情况下,我们当然应该使用 i-- 而不是 i++

只需考虑以下for 循环的结构:

for (init ;condition; step) 

init 状态在开始时将只考虑一次,每次condition 检查,如果满足,它将进入块,最后step 将执行。然后我们可以重写给定的循环如下:

i = i-1;
while ( i >= 0 ) {
   printf("%d",b[i]);
   i--;
}

那么在您的情况下,如果我们有 i 等于 b 数组的长度,那么您的代码将以相反的顺序打印 b 中的所有元素。

【讨论】:

  • 那么我怎么知道第一行中 i 的值是多少呢?因为它不能为0,对吧?
  • 好吧,如果它是 0,它就不会进入 for。所以,它是安全的,但不起作用。在这部分之前你已经初始化了i。最好只写 for ( int i = size_of(b) - 1; i >= 0; i-- )
猜你喜欢
  • 2014-09-17
  • 2017-01-12
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多