LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 788|回复: 5

这个书里的程序好象错了?

[复制链接]
发表于 2004-3-26 20:40:16 | 显示全部楼层 |阅读模式

  1. #include "unp.h"
  2. size_t          /* Read "n" bytes from a descriptor */
  3. readn(int fd,void *vptr,size_t n)
  4. {
  5.      ssize_t   nleft,nread;
  6.      char      *ptr;
  7.      ptr=vptr;
  8.      nleft=n;
  9.      while(nleft >0) {
  10.              if((nread=read(fd,ptr,nleft))<0) {
  11.                      if(errno==EINTR)
  12.                                nread=0 ;   /* and call read() again */
  13.                      else
  14.                                return(-1);
  15.              }else if(nread ==0 )
  16.                      break;             /*EOF*/
  17.             nleft -= nread;
  18.             ptr += nread ;
  19.      }
  20.      return(n-nleft);        /* return >= 0 */
  21. }

复制代码

这个程序的作用是从一个描述符读n个字符.....没有else ??:rolleyes:
发表于 2004-3-26 21:01:38 | 显示全部楼层
没看出来有什么问题,你认为有什么问题呢?
 楼主| 发表于 2004-3-26 21:06:35 | 显示全部楼层
  1. if((nread=read(fd,ptr,nleft))<0) {
  2.          if(errno==EINTR)
  3.                nread=0 ;   /* and call read() again */
  4.          else
  5.                return(-1);
  6.      }else if(nread ==0 )
  7.                break;             /*EOF*/
复制代码

没有else ??没遇过这种情况。。@@@@@
发表于 2004-3-26 21:22:49 | 显示全部楼层
这里考虑了两种情况<0和==0,那剩下的就是>0的喽,
>0的时候直接执行:
nleft -= nread;
ptr += nread ;
发表于 2004-3-27 11:03:38 | 显示全部楼层
else是可缺省部分

c语言中的if语句的BNF是
if (expression) if-statement [else else-statement] ;
 楼主| 发表于 2004-3-27 12:47:43 | 显示全部楼层
谢谢大家,看懂了。。默认的正确的动作就是else的情况,长见识了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表