K&R 书本练习 4-2

K&R book exercise 4-2

我正在研究 K&R 书。我目前在第 4 章。我正在阅读第 71 页上的 atof() 函数。函数 atof(s) 将字符串转换为其等效的双精度浮点数。

atof()的代码如下:
//atof: 将字符串 s 转换为 double

double atof2(char s[])
{
   double val, power;
   int i, sign;

   for (i = 0; isspace(s[i]); ++i) //skip white space
       ;
   sign = (s[i] == '-') ? -1: 1;
   if (s[i] == '-' || s[i] == '-')
       ++i;

   for (val = 0.0; isdigit(s[i]); i++)
       val = 10.0 * val + (s[i] - '0');

   if (s[i] == '.')
       ++i;
   for (power = 1.0; isdigit(s[i]); i++) {
       val = 10.0 * val + (s[i] - '0');
       power *= 10.0;
   }

   return sign * val / power;

}

我的问题是关于变量:power。为什么我们需要它?

我确实理解变量的用法:"val",但我不确定变量:"power"。为什么我们要用幂来划分 val?

变量power用于数字除以幂,得到浮点数的结果。

让你的字符串为 -12.83 ,然后第一个 for 循环将检查 space 并递增 i 因为没有 space 所以,i=0

sign-1 作为 s[i]=s[0]='-'

在接下来的两个循环中,字符串的值被转换为整数并存储在 val 中(excluding . - 自己计算)。

现在在两个循环之后 val 将是 1283 。但是最后一个循环将迭代 2 次并且 power 将更改为 100.00 (第一次迭代中的 10*1.0 和第二次迭代中的 10*10.0 )。

现在获取浮点数 val 除以 power 并乘以 sign 的值。

所以,return 是 -1*1283/100,因此 -12.83 是你的浮点数。