C语言 K&R书上一道题
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/05 19:42:54
C语言 K&R书上一道题
int getop(char s[])
{
int c,i;
while ((s[0] = c = getch()) == ' ' || c == '\t') ;
s[1] = '\0';
i = 0;
if (islower(c)){
while (islower(s[++i] = c = getch()))
;
s[i] = '\0';
if (c = EOF)
ungetch(c); /* went one char too far */
if (strlen(s) > 1)
return NAME; /* >1 char;it is a NAME */
else
return c; /* it may be a command */
}
if isdigit(c) && c = '.' && c = '-')
return c; /* not a number */
if (c == '-')
if (isdigit(c = getch()) || c == '.')
s[++i] = c; /* negative number */
else{
if (c = EOF)
ungetch(c);
return '-';
}
if (isdigit(c))
while (isdigit(s[++i] = c = getch()))
;
if (c = '.')
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c = EOF)
ungetch(c);
return NUMBER;
}
中为什么要:return c; /* it may be a command */ 此时c不是哪个被压进缓冲区的字符么
int getop(char s[])
{
int c,i;
while ((s[0] = c = getch()) == ' ' || c == '\t') ;
s[1] = '\0';
i = 0;
if (islower(c)){
while (islower(s[++i] = c = getch()))
;
s[i] = '\0';
if (c = EOF)
ungetch(c); /* went one char too far */
if (strlen(s) > 1)
return NAME; /* >1 char;it is a NAME */
else
return c; /* it may be a command */
}
if isdigit(c) && c = '.' && c = '-')
return c; /* not a number */
if (c == '-')
if (isdigit(c = getch()) || c == '.')
s[++i] = c; /* negative number */
else{
if (c = EOF)
ungetch(c);
return '-';
}
if (isdigit(c))
while (isdigit(s[++i] = c = getch()))
;
if (c = '.')
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c = EOF)
ungetch(c);
return NUMBER;
}
中为什么要:return c; /* it may be a command */ 此时c不是哪个被压进缓冲区的字符么
if (strlen(s) > 1) return NAME; else return c;
这个语句表明,s 长度大于1,返回 名字 NAME,长度等于 1,是命令,返回 c.
这时的c是一个字符,当然可以用一个字符表示某某命令.例如假定 a 是 add,e 是 erase,...
再问: 但是while (islower(s[++i] = c = getch())); 该语句执行最后一步的时候c就肯定不是个小写字母了啊 而且此时为什么不return s[0], 难道是s[0]==c么?
再答: 注意 里面是 s[++i]。循环1次,i 自增1,循环多少次,i 自增到多少。 s[0] 不等于最后输入的字母。最后输入的字母在c中。 程序里 有 s[i] = '\0'; 所以 s[i]里--最后输入的字母 被抹去,s[i] 变字符串结束符了。 所以 不return s[0],也不 return s[i].
再问: 最后输入的字符在c中?islower(s[++i] =c =getch())种使循环退出得条件不是s[++i] = c != 小写字母么,而且如果返回的是最后输入的字符,那么一开始第8行if (islower(c))中的c这个字符不就忽略的嘛
这个语句表明,s 长度大于1,返回 名字 NAME,长度等于 1,是命令,返回 c.
这时的c是一个字符,当然可以用一个字符表示某某命令.例如假定 a 是 add,e 是 erase,...
再问: 但是while (islower(s[++i] = c = getch())); 该语句执行最后一步的时候c就肯定不是个小写字母了啊 而且此时为什么不return s[0], 难道是s[0]==c么?
再答: 注意 里面是 s[++i]。循环1次,i 自增1,循环多少次,i 自增到多少。 s[0] 不等于最后输入的字母。最后输入的字母在c中。 程序里 有 s[i] = '\0'; 所以 s[i]里--最后输入的字母 被抹去,s[i] 变字符串结束符了。 所以 不return s[0],也不 return s[i].
再问: 最后输入的字符在c中?islower(s[++i] =c =getch())种使循环退出得条件不是s[++i] = c != 小写字母么,而且如果返回的是最后输入的字符,那么一开始第8行if (islower(c))中的c这个字符不就忽略的嘛