澄清 C 中的数值异常:前导零的意义
在 C 编程领域,包含前导零的整数文字的行为有时可能会令人困惑。让我们深入研究这个奇怪的问题并阐明其底层机制。
C 标准将整数文字定义为不带小数点或指数的数字序列。在文字前面加上 0 表示八进制(以 8 为基数)数字,而没有前缀则表示十进制(以 10 为基数)数字。
但是,请考虑以下代码片段:
int i = 07; // i == 7 int i = 16; // i == 16 int i = 00016; // i == 14, why? int i = 05016; // i == 2574, wow )
在第一个示例中,i 设置为值 7,因为 07 被解释为八进制值 (8 * 0 7 = 7)。这与 C 将没有前缀的前导零解释为八进制数的约定一致。
但是,在后续示例中,前导零出现在十进制数字之前,这引发了问题。根据标准,这些文字不应被接受为八进制数。那么,这里发生了什么?
答案在于称为“八进制抑制”的编译器优化。当编译器遇到前导零后跟十进制数字时,它会抑制八进制解释并将文字视为十进制。这就解释了为什么 00016 被计算为 14,05016 被计算为 2574。
另一方面,08 会触发编译错误,因为它违反了八进制文字不能包含数字 8 或 9 的标准规则。编译器期望有效的八进制数,但它发现无效字符并引发错误。
以上是为什么 C 整数文字中的前导零有时会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!