%运算符
%
运算符通常被称为取模运算符,常用于计算两个正整数相除得到的余数。然而两除数中一旦出现负数,不同的编程语言就会得到不同的结果。
C语言
#include <stdio.h>
int main()
{
int examples[][2] = {
{5, 3}, {-5, 3}, {5, -3}, {-5, -3}
};
int size = sizeof(examples) / sizeof(examples[0]);
for(int i = 0; i < size; i++)
{
int a = examples[i][0];
int b = examples[i][1];
printf("%d %% %d = %d\n", a, b, a % b);
}
return 0;
}
使用的是Ubuntu24.04LTS自带默认的gcc编译。执行结果和gcc版本如下图:
C++
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<pair<int, int>> examples = {
{5, 3}, {5, -3}, {-5, 3}, {-5, -3}
};
for(const auto& i : examples)
{
int a = i.first;
int b = i.second;
cout << a << " % " << b << " = " << a % b << endl;
}
return 0;
}
执行结果和编译器g++版本如下图:
虽然Ubuntu24.04自带GCC,但是无法使用g++编译c++程序,需要手动安装,安装的指令如下:
sudo apt update
apt install g++
- 安装完成后可以使用
g++ --version
查看版本,如果有显示说明安装成功;
Python
examples = [(5, 3), (5, -3), (-5, 3), (-5, -3)]
for a, b in examples:
print(f"{a} % {b} = {a % b}")
运行结果和Python解释器版本(Ubuntu默认自带的Python):
Java
public class test {
public static void main(String[] args)
{
int examples[][] = {
{5, 3}, {-5, 3}, {5, -3}, {-5, -3}
};
for(int i[] : examples)
{
int a = i[0];
int b = i[1];
System.out.println(a + " % " + b + " = " + (a % b));
}
}
}
执行结果如下:
Java类名要与文件名一致(不包括.java的后缀)
结果分析
- 正数对正数取模:在所有语言中,结果相同。
- 负数对正数取模:
- C/C++ 和 Java:结果为负。
- Python:结果为正。
- 正数对负数取模:
- C/C++ 和 Java:结果为正。
- Python:结果为负。
- 负数对负数取模:
- C/C++ 和 Java:结果为负。
- Python:结果为负,但符号和大小不同。
这种差异可能会在不同的应用场景中产生不同的结果,理解各语言中 % 运算符的行为非常重要。