模运算符在处理前导零时会产生不同的结果

9
为什么会出现以下情况:
int test() {
    return 00101 % 10;
}

返回5,当:

int test() {
    return 101 % 10;
}

返回 1?我无法想到解释。

3个回答

23

0开头的整数字面量,例如

00101

实际上是一个八进制常量。


2
这是最令人困惑的约定,它完全与人类看待数字的方式相矛盾。 - Mark Ransom
非常感谢!有没有办法解决这个问题?我正在接收值,但我不知道会有多少前导零。 - Kosmas Katsoulotos
2
@KosmasKatsoulotos 您是如何接收这些值的?除了处理文字常量之外,您很少会遇到这个问题。 - Yu Hao
2
如果您使用fscanf或其他函数,格式字符串中的%d将忽略/删除/解释前导零(十进制),而%o则表示八进制。 - OJFord

5

00101 是八进制的数值,它在十进制下是 65,因此返回值为5


0

1
你说“十六进制”,但是实际上是“八进制”,而且在你之前的所有答案都是正确的。 - AndyG
2
十六进制意味着它应该以0x开头。 - Rustam
@AndyG 现在已经改正了,而且我本来就打算纠正它。 - Taimour
@Rustam 是的,你说得对,十六进制以0x开头。 - Taimour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接