K&R书练习4-2
Posted
技术标签:
【中文标题】K&R书练习4-2【英文标题】:K&R book exercise 4-2 【发布时间】:2015-10-21 11:01:24 【问题描述】:我正在学习 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;
我的问题是关于变量:权力。为什么我们需要它?
我确实了解变量:“val”的使用,但我不确定变量:“power”。为什么我们将 val 除以幂?
【问题讨论】:
【参考方案1】:变量power
用于将数字除以幂,得到浮点数的结果。
让您的字符串为 -12.83
,然后第一个 for
循环将检查空格并增加 i
,因为没有空格所以 ,i=0
。
sign
将是 -1
为 s[i]=s[0]='-'
。
在接下来的两个循环中,字符串的值被转换为整数并存储在val
(不包括.
- 自己弄清楚)。
现在在两个循环之后 val
将是 1283
。但最后一个循环将迭代2
次,power
将更改为100.00
(第一次迭代中为10*1.0
,第二次迭代中为10*10.0
)。
现在得到浮点值 val
除以 power
并乘以 sign
。
所以,它将返回 -1*1283/100
,因此 -12.83
是您的浮点数。
【讨论】:
好的。但是为什么他们使用两个循环: 1) for (val = 0.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - '0'); 2) for (power = 1.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - '0');功率 *= 10.0;我们不能简单地将两个 for 循环合并到一个循环中,如下所示: for (val = 0.0, power = 1.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - ' 0');功率 *= 10.0; 我希望我把我的问题说清楚了吗? @HusseinBarada 第一个将字符串转换为数字,直到遇到'.'
。它在遇到任何非数字时结束。第二个循环是将'.'
之后的字符转换为数字。
@HusseinBarada -12.83
第一个循环将前两个字符(after '-'
in string)转换为整数并存储在 val
中,第二个循环将执行此操作'.'
之后的字符
@HusseinBarada 这个if (s[i] == '.')++i;
是获取'.'
的索引,然后增加i
并在第二个循环中使用它。这个if
是在遇到'.'
时采取行动。
好的,知道了。整个功能对我来说更有意义。感谢您的帮助@ameyCU以上是关于K&R书练习4-2的主要内容,如果未能解决你的问题,请参考以下文章