Недавно я работал с входом cin и обнаружил, что strtol нужен основание: long int strtol (const char* str, char** endptr, int base);
, но это не так: double strtod (const char* str, char** endptr);
, Очевидно, что двойные числа могут быть представлены в других базах, так почему эта дихотомия?
strtol
обычно используется с base
установлен в 0
или же 10
, base==0
заставляет его обрабатывать строку как целочисленную константу C. Он использует ведущий 0
для восьмеричного или ведущего 0x
или же 0X
для шестнадцатеричной; в противном случае он считается десятичным. С base==10
, он не распознает ничего, кроме десятичной (что более удобно для пользователя; большинство пользователей не ожидает ввода 010
быть интерпретированным как 8
).
Числа с плавающей точкой могут быть представлены не в десятичной форме, а в C ++, но поддерживает только десятичную. (C добавил поддержку шестнадцатеричной плавающей запятой в стандарте ISO C 1999 года, но C ++ не принял эту функцию.)
strtod
мог имели возможность интерпретировать, например, 1.4
в качестве константы base-8, равной 1.5
десятичная дробь — но просто не достаточно спроса, чтобы оправдать это.
Целочисленный ввод может быть с пользой записан в основаниях 2, 8, 10 и 16, и strtol
разрешает другие базы только потому, что это легко сделать. Входные данные с плавающей точкой редко являются чем-то иным, кроме десятичного (и синтаксис шестнадцатеричной константы с плавающей точкой C является однозначным, поэтому нет необходимости указывать его)
Причина этого в том, что в C ++ нет способа выразить значение с плавающей запятой в другой базе, отличной от базы 10. Из [lex.fcon] 2.13.4 (1)
Плавающий литерал состоит из целочисленной части, десятичной точки, дробной части, e или E, необязательного целого показателя со знаком и необязательного суффикса типа. Целые и дробные части состоят из последовательности десятичные (основание десять) цифр. […]
акцент мой
Если числа с плавающей точкой могут быть выражены только в базе 10, то нет необходимости указывать базу. целочисленные типы, с другой стороны, могут быть выражены в разных strtol
имеет дело с этим.