首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在身体上没有指示

在身体上没有指示
EN

Stack Overflow用户
提问于 2014-03-31 21:25:20
回答 3查看 1.3K关注 0票数 0

我在学习C,我对时间有疑问。在一次练习中,我:

代码语言:javascript
运行
复制
while(1){
   while((sockacc = accept(ds_sock,&client,&length)) == -1);

   --other instructions--
}

有人能告诉我第二次的作用是什么吗?我知道接听电话是用来做什么的。我不明白,如果身体里没有任何东西,为什么要用一段时间。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-31 21:30:32

您可以将整个代码重写为:

代码语言:javascript
运行
复制
while(1){
    do {
        sockacc = accept(ds_sock,&client,&length);
    } 
    while(sockacc == -1);

   --other instructions--
}

while语句中的部分只是在每个循环迭代中执行,并且它本身决定循环是否终止。

票数 4
EN

Stack Overflow用户

发布于 2014-03-31 23:31:48

退后一步。记住…的意义

代码语言:javascript
运行
复制
while(c) s;

只是一种简短的写作方式:

代码语言:javascript
运行
复制
CONTINUE: 
if (c) 
  goto BODY;  
else 
  goto BREAK;
BODY: 
s;
goto CONTINUE;
BREAK: ;

当然,break;continue;goto BREAK;goto CONTINUE;。循环并不神奇;它们只是编写一堆goto语句的一种简短而愉快的方式。

所以你的节目:

代码语言:javascript
运行
复制
while(1){
  while((sockacc = accept(ds_sock,&client,&length)) == -1);
  --other instructions--
}

是一种更好的写作方式:

代码语言:javascript
运行
复制
OUTER_CONTINUE: 
if (1) 
  goto OUTER_BODY;  
else 
  goto OUTER_BREAK;
OUTER_BODY: 
{
  INNER_CONTINUE: 
  if ((sockacc = accept(ds_sock,&client,&length)) == -1) 
    goto INNER_BODY;  
  else 
    goto INNER_BREAK;
  INNER_BODY: 
  ;
  goto INNER_CONTINUE;
  INNER_BREAK: ;
  --other instructions--
}
goto OUTER_CONTINUE;
OUTER_BREAK: ;
票数 5
EN

Stack Overflow用户

发布于 2014-03-31 21:40:31

accept()能够返回失败(-1)的原因之一是EINTR (中断的系统调用)。此代码中的内环如果返回错误EINTR或任何其他错误,就会重试accept(),因为它不测试内环体中errno的值。如果错误是EBADF (错误的文件描述符,指示套接字文件描述符不是套接字文件描述符,或者以某种方式被销毁),这可能是性能问题。通常,您会在循环的正文中看到一个测试,以确保错误是代码所期望的有限集合之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22772479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档