在C语言中,要求其运算对象(操作数)必须是整型的运算符主要有以下几类:

(图片来源网络,侵删)
位运算符
这是最典型的一类,位运算符直接对整数的二进制位进行操作,因此它们天生就要求操作数是整数类型。
| 运算符 | 名称 | 要求 | 示例 (假设 a=5, b=1) |
|---|---|---|---|
& |
按位与 | 两个操作数都必须是整数 | a & b 结果为 1 |
| 按位或 | 两个操作数都必须是整数 | a | b 结果为 5 |
|
^ |
按位异或 | 两个操作数都必须是整数 | a ^ b 结果为 4 |
| 按位取反 | 单个操作数必须是整数 | ~a 结果为 -6 |
|
<< |
左移 | 两个操作数都必须是整数 | a << 1 结果为 10 |
>> |
右移 | 两个操作数都必须是整数 | a >> 1 结果为 2 |
错误示例:
float f = 3.14; int i = 5; // 错误:不能对浮点数进行按位与操作 int result = f & i; // 编译器会报错 // 错误:不能对浮点数进行左移操作 int result2 = i << f; // 编译器会报错
模运算符 ()
模运算符用于计算两个数相除的余数,这个概念在数学上通常只对整数定义。
- 运算符:
- 要求: 两个操作数都必须是整数类型(包括
char,short,int,long等)。 - 示例:
int a = 10; int b = 3; int result = a % b; // 结果为 1 (因为 10 / 3 = 3 ... 1)
错误示例:

(图片来源网络,侵删)
double x = 10.5; double y = 3.0; // 错误:不能对浮点数进行模运算 double result = x % y; // 编译器会报错
逗号运算符 (在特定上下文中)
逗号运算符 通常用于将多个表达式连接在一起,并返回最后一个表达式的值,它本身对操作数类型要求不严格,在for循环的第三个表达式(增量表达式)中,如果它被用作复合赋值(如 i++, j++),则它要求其操作数必须是可修改的左值,通常我们使用整型变量。
虽然这不是一个硬性规定,但最常见的用法就是用于整型计数器。
for (int i = 0, j = 10; i < j; i++, j--) {
// ...
}
这里的 i++ 和 j-- 要求 i 和 j 是整型。
sizeof 运算符 (作用于类型名时)
sizeof 返回一个类型或变量在内存中所占的字节数,它的返回值类型是 size_t,这是一个无符号整型。

(图片来源网络,侵删)
- 当作用于类型名时,它必须用括号括起来,此时它的“运算对象”是一个类型,这个类型必须是完整类型,通常我们关心的是整型的大小。
size_t size_of_int = sizeof(int); // 正确,返回 int 类型的大小 size_t size_of_float = sizeof(float); // 正确,返回 float 类型的大小
虽然它不“必须是”整型,但计算整型的大小是其最常见的用途之一。
总结与对比
为了更清晰地理解,我们来看一个表格,对比一下哪些运算符允许浮点数操作数:
| 运算符 | 是否要求整型操作数 | 是否允许浮点数操作数 |
|---|---|---|
| 否 | 是 (14 + 2) |
|
| 否 | 是 (0 - 1) |
|
| 否 | 是 (5 * 2) |
|
| 否 | 是 (注意: 5/2是2, 0/2.0是5) |
|
| 是 | 否 | |
& |
是 | 否 |
| 是 | 否 | |
^ |
是 | 否 |
| 是 | 否 | |
<< |
是 | 否 |
>> |
是 | 否 |
| 是 (作用于变量) | 否 | |
| 是 (作用于变量) | 否 |
C语言中严格要求运算对象必须是整型的运算符主要是:
- 位运算符:
&, ,^, ,<<,>> - 模运算符:
这些运算符的设计初衷就是直接操作整数在内存中的二进制表示,因此它们与浮点数类型不兼容。
