无法理解 getop 函数中的最后两个 while 循环
Having trouble understanding the last two while loops in the getop function
所以我了解了 getop 函数是什么以及它是如何工作的,但我无法理解检查输入的整数和小数部分并将它们放入 s 数组的 while 循环。
所以我一直在尝试以标准方式编写这些相同的 while 循环(括号中的表达式然后括号中的语句)。
所以 while 循环不是:
while(isdigit(s[++i] = c = getch())){
;
}
为什么不能:
while(isdigit(c = getch())){
s[++i] = c;
}
完整的 getop 函数:
int getop(char s[]){
int i, c;
while((s[0] = c = getch()) == ' ' || c == '\t'){
; //set s[0] to the first non space/tab char
}
s[1] = '[=12=]'; //s[1] to [=12=]
if(isdigit(c) == 0 && c != '.' && c != '-'){
return c; //if not a digit or . then return(must be a +,-,/,*)
}
i = 0;
if(isdigit(c)){
while(isdigit(s[++i] = c = getch())){
; //integer part
}
}
if(c == '.'){
while(isdigit(s[++i] = c = getch())){
; //fraction part
}
}
s[i] = '[=12=]';
if(c != EOF){
ungetch(c);
}
return NUMBER;
}
但是输出不一样,最后一个输入在使用替代 while 循环时由于某种原因被剪掉了。所以输入 123 returns 12.
while(isdigit(c = getch())){
s[++i] = c;
}
原来总是自增i
赋值给s[++i]
。如果 isdigit()
检查失败,您的版本将跳过这两个步骤。要匹配原始行为,您需要在循环结束后执行一次额外的赋值和递增。
while(isdigit(c = getch())){
s[++i] = c;
}
s[++i] = c;
所以我了解了 getop 函数是什么以及它是如何工作的,但我无法理解检查输入的整数和小数部分并将它们放入 s 数组的 while 循环。
所以我一直在尝试以标准方式编写这些相同的 while 循环(括号中的表达式然后括号中的语句)。
所以 while 循环不是:
while(isdigit(s[++i] = c = getch())){
;
}
为什么不能:
while(isdigit(c = getch())){
s[++i] = c;
}
完整的 getop 函数:
int getop(char s[]){
int i, c;
while((s[0] = c = getch()) == ' ' || c == '\t'){
; //set s[0] to the first non space/tab char
}
s[1] = '[=12=]'; //s[1] to [=12=]
if(isdigit(c) == 0 && c != '.' && c != '-'){
return c; //if not a digit or . then return(must be a +,-,/,*)
}
i = 0;
if(isdigit(c)){
while(isdigit(s[++i] = c = getch())){
; //integer part
}
}
if(c == '.'){
while(isdigit(s[++i] = c = getch())){
; //fraction part
}
}
s[i] = '[=12=]';
if(c != EOF){
ungetch(c);
}
return NUMBER;
}
但是输出不一样,最后一个输入在使用替代 while 循环时由于某种原因被剪掉了。所以输入 123 returns 12.
while(isdigit(c = getch())){
s[++i] = c;
}
原来总是自增i
赋值给s[++i]
。如果 isdigit()
检查失败,您的版本将跳过这两个步骤。要匹配原始行为,您需要在循环结束后执行一次额外的赋值和递增。
while(isdigit(c = getch())){
s[++i] = c;
}
s[++i] = c;