我很难理解作者为何选择
(len = getline(line, MAXLINE))>0
以下是示例K& R 1-19的代码。
#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */
int getline(char line[], int maxline);
void copy(char to[], char from[]);
/* print longest input line */
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* getline: read a line into s, return length */
int getline(char s[], int lim)
{
int c, i;
for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
/* copy: copy 'from' into 'c'; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
我对代码的理解如下:
我的问题:删除&gt;
的0while ((len = getline(line, MAXLINE)) > 0)
似乎不会影响代码的结果。它仍然正常运作。 为什么删除&gt; 0不会影响代码的结果?如果不影响代码的结果,为什么作者将&gt; 0放入?
答案 0 :(得分:3)
为什么删除&gt; 0不会影响代码的结果?
这是因为getline()
函数返回正整数或0
,如果是EOF
的情况。所以声明:
while ((len = getline(line, MAXLINE)) > 0)
相当于:
while ((len = getline(line, MAXLINE)))
实际检查while
中的条件并将其评估为true
或false
。在while
循环中,如果您有 除0
之外的任何整数值作为条件,则 是评估为true
。只有0
被评估为false
。
因此,如果用户立即输入EOF
,则读取的字符数将为0
,而while
循环条件将评估为false
。如果您删除>0
,则与您不同时相同。添加它的目的是为了澄清原因。
请参阅this link了解此类条件的工作原理。
答案 1 :(得分:0)
如果len
不为零,则条件为真。
否则它将退出循环。
答案 2 :(得分:0)
因为getline
的这个特定实现在文件末尾返回0并且在任何其他情况下返回大于0的值(严格地)。
在布尔上下文中(在测试或循环条件中),任何int值都为true,除了0。
所以两者:
while ((len = getline(line, MAXLINE)) > 0)
和
while ((len = getline(line, MAXLINE)) /* same as while ((len = getline(line, MAXLINE) != 0)
将循环直到文件结束。