为何同是(0+-1)%3,C++代码输出-1和0两种结果?
为何C++中两处看似相同的取模运算结果不同?
问题出在操作数的类型差异上,两处运算的本质并不完全一致:
1. 直接计算(0 + -1) % 3的行为
这里所有操作数都是int类型(有符号整数)。在C++的规则中,当进行有符号整数的取模运算时,结果的符号与被除数保持一致。-1作为被除数,3是除数,因此-1 % 3的结果为-1。
2. getIndex方法中运算的行为
nums.size()返回的是size_t类型(无符号整数类型,通常对应系统的原生无符号整型)。在表达式(index + nums[index]) % nums.size()中:
index + nums[index]的结果是int类型的-1- 由于取模运算的两个操作数类型不一致,C++会将有符号的
int值隐式转换为无符号的size_t类型。此时-1转换为size_t后会变成该类型的最大值(比如32位系统下是4294967295) - 用这个极大的无符号数对
3取模,4294967295 % 3 = 0,最终得到结果0
如果想要让getIndex中的运算结果和直接计算一致,可以将nums.size()强制转换为int类型:
int res = (index + nums[index]) % static_cast<int>(nums.size());
内容的提问来源于stack exchange,提问作者aurora
相关产品推荐
相关产品推荐

