使用“%”进行操作会产生意想不到的结果[重复]

Posted

技术标签:

【中文标题】使用“%”进行操作会产生意想不到的结果[重复]【英文标题】:Operation with "%" give an unexpected result [duplicate] 【发布时间】:2018-04-04 14:24:23 【问题描述】:

我在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) %phthalsNumber]:左手的叉子。

如果我在循环中添加一些打印,输出如下所示:

----- 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? 我假设与变量的类型有关,但我真的不知道。

【问题讨论】:

你知道模数是做什么的吗? 【参考方案1】:

简单的事情,% 是模数,这意味着整数除法的其余部分。如果对于 a%b,a a%b = a 因为剩下的就是一切。例如:

1%3 = 1;
2%3 = 2;
3%3 = 0;
4%3 = 1;
5%3 = 2 etc.

不是程序化的东西,它的数学。

【讨论】:

以上是关于使用“%”进行操作会产生意想不到的结果[重复]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 使用 LEFT JOIN 会产生意想不到的结果

使用 Javascript 设置元素的宽度会产生意想不到的结果

在 while 循环中使用 -- 运算符会产生意想不到的结果

用 np.savez 存储字典会产生意想不到的结果?

模拟单元测试的 Vuex getter 会产生意想不到的结果

用perl替换正则表达式EOL会产生意想不到的结果