检查 count-- 在 for 循环中会取消循环吗?
Does checking count-- in a for loop cancels the loop?
对不起,我是 C 语言的新手。
谁能帮我理解 "for" 循环中发生的事情:
当我 运行 这段代码时,我什么也没得到,它甚至没有进入循环:
for( count=0 ;count--;count--)
{
printf("\n%5d", count);
}
当我 运行 这段代码时,我得到了循环的无限入口:
for( count=1 ;count--;count--)
{
printf("\n%5d", count);
}
当我 运行 这段代码时,我得到了 1 个循环入口:
for( count=2 ;count--;count--)
{
printf("\n%5d", count);
}
以此类推,对于每个计数=奇数,我得到无限个入口,对于每个计数=偶数,我得到一个有限的入口入口数量
谁能解释一下为什么会这样?
我认为您首先需要确切地知道 count--
是什么。这意味着首先 count
将作为条件的一部分进行评估,然后递减。这意味着 count--
在这种情况下是 0
,使 for 循环条件的计算结果为 0
。评估条件后,count
为 -1
,但这无关紧要,因为在条件检查期间计数为 0
,因此循环永远不会运行。
for(count = 0;count--;count--)
{
printf("\n%5d", count);
}
下一个循环从1
开始计数,这意味着count--
将被计算为1
,这使得for循环的条件检查等于1
.求值后count变为0
。这意味着 for 循环将进入并打印出消息。当代码块结束时,语句 count--
被执行,将 count
设置为 -1
。然后我们再次检查。我们看到 count--
的计算结果为 -1
所以我们将再次循环。求值后,count
会被设置为-2
,再次进入for循环。 这个函数永远运行,因为当我们进行 for 循环检查时,count 总是奇数,因此 count 永远不会 0
并且我们永远不会中断循环。
for(count = 1;count--;count--)
{
printf("\n%5d", count);
}
您现在应该能够弄清楚为什么最后一个只运行一次:
for( count=2 ;count--;count--)
{
printf("\n%5d", count);
}
显然在第一次评估后,count
会递减。然后一旦代码块被执行,它就会再次递减。因此,当我们到达 for 循环中的条件检查时,count
是 0
并且我们中断。
for(left;middle;right)
中间的表达式是条件 - 一个可根据上下文转换为 bool 的表达式。这个表达式在每次迭代之前被评估,如果它产生假(或者在 int 的情况下为 0),则退出循环。
foo--
是一个 post 运算符,这意味着值是 foo
先求值然后递减。
将这两个放在一起,
Case1:在进入循环之前,计算count--。计数当前值为0。因此不执行循环。
Case2:count--求值为1,进入循环一次。 count-- 在循环结束时执行。 count-- 现在在循环开始时计算为 -1,因此再次执行循环,依此类推 - 无限期
Case3:count--为2,循环结束count--为0,循环1次后退出。
对不起,我是 C 语言的新手。 谁能帮我理解 "for" 循环中发生的事情:
当我 运行 这段代码时,我什么也没得到,它甚至没有进入循环:
for( count=0 ;count--;count--)
{
printf("\n%5d", count);
}
当我 运行 这段代码时,我得到了循环的无限入口:
for( count=1 ;count--;count--)
{
printf("\n%5d", count);
}
当我 运行 这段代码时,我得到了 1 个循环入口:
for( count=2 ;count--;count--)
{
printf("\n%5d", count);
}
以此类推,对于每个计数=奇数,我得到无限个入口,对于每个计数=偶数,我得到一个有限的入口入口数量
谁能解释一下为什么会这样?
我认为您首先需要确切地知道 count--
是什么。这意味着首先 count
将作为条件的一部分进行评估,然后递减。这意味着 count--
在这种情况下是 0
,使 for 循环条件的计算结果为 0
。评估条件后,count
为 -1
,但这无关紧要,因为在条件检查期间计数为 0
,因此循环永远不会运行。
for(count = 0;count--;count--)
{
printf("\n%5d", count);
}
下一个循环从1
开始计数,这意味着count--
将被计算为1
,这使得for循环的条件检查等于1
.求值后count变为0
。这意味着 for 循环将进入并打印出消息。当代码块结束时,语句 count--
被执行,将 count
设置为 -1
。然后我们再次检查。我们看到 count--
的计算结果为 -1
所以我们将再次循环。求值后,count
会被设置为-2
,再次进入for循环。 这个函数永远运行,因为当我们进行 for 循环检查时,count 总是奇数,因此 count 永远不会 0
并且我们永远不会中断循环。
for(count = 1;count--;count--)
{
printf("\n%5d", count);
}
您现在应该能够弄清楚为什么最后一个只运行一次:
for( count=2 ;count--;count--)
{
printf("\n%5d", count);
}
显然在第一次评估后,count
会递减。然后一旦代码块被执行,它就会再次递减。因此,当我们到达 for 循环中的条件检查时,count
是 0
并且我们中断。
for(left;middle;right)
中间的表达式是条件 - 一个可根据上下文转换为 bool 的表达式。这个表达式在每次迭代之前被评估,如果它产生假(或者在 int 的情况下为 0),则退出循环。foo--
是一个 post 运算符,这意味着值是foo
先求值然后递减。
将这两个放在一起,
Case1:在进入循环之前,计算count--。计数当前值为0。因此不执行循环。
Case2:count--求值为1,进入循环一次。 count-- 在循环结束时执行。 count-- 现在在循环开始时计算为 -1,因此再次执行循环,依此类推 - 无限期
Case3:count--为2,循环结束count--为0,循环1次后退出。