C while循环条件
我正在为我的CS课程阅读计算机系统,我遇到了一个让我困惑的while循环条件,下面是代码:C while循环条件,c,while-loop,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] = ’ ’; /* Replac
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&&
是多余的
*buf
对于'\0'
为false,对于其他所有内容为true
*buf='
对'
是真的,而对其他一切都是假的,包括'\0'
以下功能与相同,而(buf='
如果引号'
更改为
// v-v--- not standard quote marks.
while (*buf && (*buf == ’ ’))
有了一个好的编译器,这两种方法都不如发出相同代码的优化编译器快
对我来说,这只是一个迂腐的代码,确保循环不使用空字符
该代码的缺点包括:
buf[strlen(buf)-1]=''如果buf[0]==0,则code>是UB
buf[strlen(buf)-1]='';/*将尾随的“\n”替换为空格*/
可能会删除非“\n”
解决上述两个问题的更好选择:buf[strcspn(buf,“\n”)]='\0'代码>
与“忽略空格”不同,忽略空格更像是C
“构建argv列表”通常需要一个最终的argv[argc]==NULL
当然,这些都是主要问题的侧面问题,如果没有更大的背景,可能/可能不适用
第二个操作数是检查空格,但我认为
第二个操作数本身就足以实现此目的
循环
这就足够了。循环将因另一种方法而中断:(*buf&&(*buf='')
:当*buf=''
第一个条件也是真的,所以它是多余的。如果buf==NULL会发生什么?我试着运行一个buf==NULL的简化版本的代码,但得到了一个seg错误,因为据我猜测,循环条件试图遵从NULL指针。在循环条件中有指针是一种糟糕的编程实践吗?是否应该使用带有标志条件的循环?buf
在此之后不能为NULL
:buf=delim+1代码>
// v-v--- not standard quote marks.
while (*buf && (*buf == ’ ’))
while (*buf && (*buf == ’ ’)) /* Ignore leading spaces */
buf++;