我对for(;;)
构造感到困惑。我认为这是一种无限循环的速记形式,但我不能确定。
以下是代码:
for(;;)
{
//whatever statements
}
答案 0 :(得分:12)
你的猜测是正确的;这是一个无限循环。 * 这是一个常见的C语言,虽然许多人(包括我)认为以下内容不那么神秘:
while (1) { whatever statements; }
<小时/> *假设没有
break
/ return
/等,这是无限的。循环体内的语句。
答案 1 :(得分:2)
这是一个未终止的循环。它有时用while
:
while (1)
甚至更好:
while (true)
我希望在任何此类循环中看到break
或return
,无论是使用for
还是while
。必须有一些异常的控制流程,否则它将是一个无限循环。
答案 2 :(得分:2)
是的,这是for
C语法,包含初始化表达式,循环条件和增量表达式的空白字段。
for
语句也可以使用多个值,例如:
for (i=0, j=100, k=1000; j < 500 || i<50 || k==5000; i++, j+=2, k*=6) {};
在for
理解中可能还有一步之遥? =)
答案 3 :(得分:1)
是的,for循环中的表达式只是可选的。如果你省略它们,你将得到一个无限循环。离开的方法是休息或退出等。
答案 4 :(得分:0)
这句话基本上等于:
while(1) {}
没有开始,没有条件,也没有步骤声明。
答案 5 :(得分:0)
据我了解,for(;;)创建了一个故意的非退出循环。您的代码应根据一个或多个条件退出循环。它曾经作为一种更纯粹的方式提供给我做一个假的循环,这不被认为是好的语法。例如,根据退出条件,可以更轻松地分派给函数来处理结果,失败,警告或成功。
我的解释可能不是某人使用该构造的原因,但我会更详细地解释它对我意味着什么。这种结构可能是某人的纯粹C&#34;有一个循环的方法,你可以在其中连续执行多个步骤,其完成意味着你的应用程序执行了所有初始化步骤。
#define GEN_FAILURE -99
#define SUCCESS 0
/* perform_init_step1() and perform_init_step2() are dummy
place-holder functions that provide a complete example.
You could at least have one of them return non-zero
for testing. */
int perform_init_step1();
int perform_init_step2();
int perform_init_step1()
{
return 0;
}
int perform_init_step2()
{
return 0;
}
int ret_code = GEN_FAILURE;
for(;;)
{
if(SUCCESS != perform_init_step1())
{
ret_code = -1;
break;
}
if(SUCCESS != perform_init_step2())
{
ret_code = -2;
break;
}
break;
}
如果部分初始化失败,则循环将使用特定的错误代码进行终止。
我使用C做了很多固件工作,用汇编语言编写。优秀的汇编语言程序员教会我有一个入口点和单个出口。我把他们的建议铭记于心,因为他们的信条在调试时极大地帮助了我们。
就个人而言,我从不喜欢for(;;)构造,因为如果你忘记打破,你可以拥有一个无限循环;在最后。
我曾与之合作的人想出了do..until(FALSE),但这引起的适当C风格的数量是不可信的。
#define GEN_FAILURE -99
#define SUCCESS 0
/* perform_init_step1() and perform_init_step2() are dummy
place-holder functions that provide a complete example.
You could at least have one of them return non-zero
for testing. */
int perform_init_step1();
int perform_init_step2();
int perform_init_step1()
{
return 0;
}
int perform_init_step2()
{
return 0;
}
int ret_code = GEN_FAILURE;
do
{
if(SUCCESS != perform_init_step1())
{
ret_code = -1;
break;
}
if(SUCCESS != perform_init_step2())
{
ret_code = -2;
break;
}
}
until (FALSE);
无论如何都会运行一次。