无法理解 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;