#include <stdio.h>
int main()
{
int i=0;
while(i++,i<=8);
printf("%d\n",i);
return 0;
}
为什么在每个测试用例的比较后完成i
的增量?
答案 0 :(得分:8)
i = 8
最后一次成功i++
。
在上一次迭代中,i <= 8
被执行,然后i = 9
失败,因为,
。
请注意,i++
是sequence point,因此i <= 8
绝对保证在i <= 8
之前执行。 Not so for similar constructs.
答案 1 :(得分:2)
不是。你的循环条件是i
,当i
达到9时,它首先是非真的(你每次将/** Evergreen browsers require these. **/
// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove.
import 'core-js/es7/reflect';
递增1,所以它恰好是9)。这就是它打印9的原因。
答案 2 :(得分:2)
要访问print()
语句,while
循环必须结束。终止条件,控制表达式应该评估为假(或者换句话说,直到控制表达式比较等于0),即,仅当i <= 8
时它才会为假。评估为假。如果i
的值为9
,则会发生这种情况。
下一行打印i
的值。所以,你看到9
。
答案 3 :(得分:1)
在每个测试用例中进行比较后,未完成i
的增量。首先执行i++
,之后进行比较。
这是因为当在C中使用逗号分隔表达式时,表达式从左到右进行计算,最后一个表达式的值变为以逗号分隔的总表达式的值。
所以
的价值i++,i<=8
实际上是i<=8
的值,只有在i++
执行后才能进行比较。
所以这里的while
循环
int i=0;
while(i++,i<=8);
相当于
for(i=0; i<=8; i++);
因此,仅当i
大于8
时,控件才会退出循环。由于i
在每次迭代时增加1
,这意味着当i
变为9
时,循环结束。
答案 4 :(得分:0)
您开始使用m_pCurrentUser
并使用i = 0
循环,您将其值增加到while ( i++, i<=8 )
,并且当它再次增加8
时,则循环条件变为i = 9
并使用false
打破循环。这就是为什么现在,当你打印i = 9
的价值时,它给了你9个。