使用 "%" 操作会产生意想不到的结果
Operation with "%" give an unexpected result
我在 the Dining Philosophers Problem 工作。为了使用我发现的这个循环分发叉子:
int philosophersNumber=5;
for (int i = 0; i < philosophersNumber; i++) {
philosophers[i] = new Philosopher(
i,
forks[i],
forks[(i + 1) % philosophersNumber]
);
}
- i:哲学家的人数
- forks[i]: 右手叉叉
- forks[(i + 1) % philosophersNumber]: 左手的叉子。
如果我在循环中添加一些打印,输出如下所示:
----- PHILOSOHPER 0 ------
Right fork: 0
Left fork: 1
----- PHILOSOHPER 1 ------
Right fork: 1
Left fork: 2
----- PHILOSOHPER 2 ------
Right fork: 2
Left fork: 3
----- PHILOSOHPER 3 ------
Right fork: 3
Left fork: 4
----- PHILOSOHPER 4 ------
Right fork: 4
Left fork: 0
嗯,我的疑问很简单:为什么 (i+1) % 5 的结果总是和 i+1 一样,直到 i+1 是 5,结果是 0? 我想是跟变量的类型有关,但我真的不知道。
很简单,%是取模,就是整数除法的余数。 if for a%b, a < b -> a%b = a 因为一切都是剩下的。例如:
1%3 = 1;
2%3 = 2;
3%3 = 0;
4%3 = 1;
5%3 = 2 etc.
不是程序化的东西,它是数学。
我在 the Dining Philosophers Problem 工作。为了使用我发现的这个循环分发叉子:
int philosophersNumber=5;
for (int i = 0; i < philosophersNumber; i++) {
philosophers[i] = new Philosopher(
i,
forks[i],
forks[(i + 1) % philosophersNumber]
);
}
- i:哲学家的人数
- forks[i]: 右手叉叉
- forks[(i + 1) % philosophersNumber]: 左手的叉子。
如果我在循环中添加一些打印,输出如下所示:
----- PHILOSOHPER 0 ------
Right fork: 0
Left fork: 1
----- PHILOSOHPER 1 ------
Right fork: 1
Left fork: 2
----- PHILOSOHPER 2 ------
Right fork: 2
Left fork: 3
----- PHILOSOHPER 3 ------
Right fork: 3
Left fork: 4
----- PHILOSOHPER 4 ------
Right fork: 4
Left fork: 0
嗯,我的疑问很简单:为什么 (i+1) % 5 的结果总是和 i+1 一样,直到 i+1 是 5,结果是 0? 我想是跟变量的类型有关,但我真的不知道。
很简单,%是取模,就是整数除法的余数。 if for a%b, a < b -> a%b = a 因为一切都是剩下的。例如:
1%3 = 1;
2%3 = 2;
3%3 = 0;
4%3 = 1;
5%3 = 2 etc.
不是程序化的东西,它是数学。