为什么 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
设置为 0
或 10
一起使用。 base==0
导致它将字符串视为 C 整数常量。它使用前导 0
表示八进制,或前导 0x
或 0X
表示十六进制;否则,它被假定为十进制。对于 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
处理。
我最近一直在使用 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
设置为 0
或 10
一起使用。 base==0
导致它将字符串视为 C 整数常量。它使用前导 0
表示八进制,或前导 0x
或 0X
表示十六进制;否则,它被假定为十进制。对于 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
处理。