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

Why does strol need a radix when strtod does not?

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

strtol 通常与 base 设置为 010 一起使用。 base==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 之外的其他基数表示浮点值。来自 [lex.fcon] 2.13.4(1)

A floating literal consists of an integer part, a decimal point, a fraction part, an e or E, an optionally signed integer exponent, and an optional type suffix. The integer and fraction parts both consist of a sequence of decimal (base ten) digits. [...]

强调我的

如果浮点数只能以 10 为底数表示,则没有理由必须指定底数。另一方面,整数类型可以用不同的贝斯来表达,以 strtol 处理。