C while循环条件

时间:2018-03-11 21:47:30

标签: c while-loop

我正在为我的CS课阅读计算机系统而且我遇到了令我困惑的while循环条件,这是代码:

int parseline(char *buf, char **argv)
{
    char *delim; /* Points to first space delimiter */
    int argc; /* Number of args */
    int bg; /* Background job? */

    buf[strlen(buf)-1] = ’ ’; /* Replace trailing ’\n’ with space */
    while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
        buf++;

     /* Build the argv list */
     argc = 0;
     while ((delim = strchr(buf, ’ ’))) {
         argv[argc++] = buf;
         *delim = ’\0’;
          buf = delim + 1;
          while (*buf && (*buf == ’ ’)) /* Ignore spaces */
              buf++;
     }

while (*buf && (*buf == ’ ’)) /* Ignore spaces */ 

while循环有两个逻辑&&的操作数,但我不明白第一个操作数(*buf)的目的是什么。第二个操作数是检查空格,但我认为第二个操作数本身就足以满足此循环的目的。

3 个答案:

答案 0 :(得分:3)

是的,*buf &&是多余的。

对于*buf

'\0'为false,对其他所有内容均为true。

*buf == ' '适用于' ',其他所有内容均为false,包括 '\0'

答案 1 :(得分:1)

如果引号while (buf == ' ')更改为,则以下功能与'相同。

//                      v-v--- not standard quote marks.
while (*buf && (*buf == ’ ’))  

使用良好的编译器,作为具有相同代码的优化编译器,两者都不会更快。

对我而言,这只是一种迂腐的代码,确保循环不会被空字符所采用。

代码的不好之处包括:

buf[strlen(buf)-1] = ’ ’;如果是buf[0] == 0,则为UB。

buf[strlen(buf)-1] = ’ ’; /* Replace trailing ’\n’ with space */可能会失去非'\n'

解决前两个问题的更好选择:buf[strcspn(buf, "\n")] = '\0';

而忽略<#34;忽略空格&#34;,忽略 white-spaces 更像C-like。

&#34;构建argv列表&#34;通常需要最终argv[argc] == NULL

当然,这些是主要问题的侧面问题,没有更大的背景可能/可能不适用。

答案 2 :(得分:1)

  

第二个操作数正在检查空白区域,但我会这么认为   第二个操作数本身就足以满足于此目的   循环。

  while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
        buf++;

这就足够了。循环将中断*buf == '\0'