为什么strol需要基数而strtod不需要

Why does strol need a radix when strtod does not?

本文关键字:strtod 不需要 strol 为什么      更新时间:2023-10-16

我最近一直在使用cin输入,我发现strtol需要一个基数:long int strtol (const char* str, char** endptr, int base);,但strtod不需要:double strtod (const char* str, char** endptr);。显然,双位数可以用其他进制表示,那么为什么要用这种二分法呢?

通常使用strtol, base设置为010base==0使它将字符串视为C整型常量。它使用前导0表示八进制,或前导0x0X表示十六进制;否则,就假定它是小数。使用base==10,它不识别十进制以外的任何内容(这更加用户友好;大多数情况下,010的输入不会被解释为8)。

浮点数可以用十进制以外的进制表示,但c++只支持十进制。(C在1999年ISO C标准中增加了对十六进制浮点数的支持,但c++尚未采用此功能。)

strtod 可以有一个选项来解释,例如,1.4作为一个进制8的常量,等于1.5的十进制——但是没有足够的需求来证明它。

整数输入可以有效地以2、8、10和16为进制,strtol允许使用其他进制,因为这样做很容易。浮点输入很少不是十进制的(C十六进制浮点常量的语法是明确的,所以没有必要指定它)。

这样做的原因是在c++中没有办法以除10进制以外的其他进制表示浮点值。从[莱克斯。fcon] 2.13.4 (1)

浮点字面值由整数部分、小数点、分数部分、e或e、可选的带符号整数指数和可选的类型后缀组成。整数部分和分数部分都由十进制(以10为基数)数字组成的序列。[…]

<>共舞,强调我的

如果浮点数只能以10为基数表示,则没有必要指定基数。另一方面,整数类型可以用不同的基底表示,strtol处理了这个问题。