为什么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);
。显然,双位数可以用其他进制表示,那么为什么要用这种二分法呢?
通常使用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进制以外的其他进制表示浮点值。从[莱克斯。fcon] 2.13.4 (1)
浮点字面值由整数部分、小数点、分数部分、e或e、可选的带符号整数指数和可选的类型后缀组成。整数部分和分数部分都由十进制(以10为基数)数字组成的序列。[…]
<>共舞,强调我的
如果浮点数只能以10为基数表示,则没有必要指定基数。另一方面,整数类型可以用不同的基底表示,strtol
处理了这个问题。
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 为什么strol需要基数而strtod不需要