C语言提供了丰富的运算符,这些运算符用于执行各种类型的操作,比如算术运算、比较运算、逻辑运算、位运算等。下面是一些基本的C语言运算符分类及其示例:
1. 算术运算符
- 加法 (+) :
a + b
表示a和b的和。 - 减法 (-) :
a - b
表示a和b的差。 - 乘法 (*) :
a * b
表示a和b的积。 - 除法 (/) :
a / b
表示a除以b的商(注意:结果会向0取整)。 - 取模 (%) :
a % b
表示a除以b的余数。 - 自增 (++) :
++a
或a++
,将a的值增加1。 - 自减 (--) :
--a
或a--
,将a的值减少1。
cpp
#include <stdio.h>
int main() {
int a = 5, b = 3;
int sum = a + b; // 加法
int difference = a - b; // 减法
int product = a * b; // 乘法
int quotient = a / b; // 除法
int remainder = a % b; // 取模
printf("和: %d\n", sum);
printf("差: %d\n", difference);
printf("积: %d\n", product);
printf("商: %d\n", quotient);
printf("余数: %d\n", remainder);
return 0;
}
2. 关系运算符
- 大于 (>) :
a > b
如果a大于b,结果为真(true)。 - 小于 (<) :
a < b
如果a小于b,结果为真(true)。 - 等于 (==) :
a == b
如果a等于b,结果为真(true)。 - 不等于 (!=) :
a != b
如果a不等于b,结果为真(true)。 - 大于等于 (>=) :
a >= b
如果a大于或等于b,结果为真(true)。 - 小于等于 (<=) :
a <= b
如果a小于或等于b,结果为真(true)。
cpp
#include <stdio.h>
int main() {
int a = 10, b = 20;
if (a > b) {
printf("a大于b\n");
} else if (a < b) {
printf("a小于b\n");
} else {
printf("a等于b\n");
}
// 其他关系运算符示例
printf("a不等于b: %d\n", a != b); // 输出 1(真)
printf("a大于等于b: %d\n", a >= b); // 输出 0(假)
return 0;
}
3. 逻辑运算符
- 逻辑与 (&&) :
a && b
如果a和b都为真(true),则结果为真(true)。 - 逻辑或 (||) :
a || b
如果a或b中有一个为真(true),则结果为真(true)。 - 逻辑非 (!) :
!a
如果a为假(false),则结果为真(true);反之亦然。
cpp
#include <stdio.h>
int main() {
int a = 1, b = 0;
if (a && b) {
printf("a和b都是真\n");
} else {
printf("a和b中至少有一个是假\n");
}
if (a || b) {
printf("a和b中至少有一个是真\n");
} else {
printf("a和b都是假的\n");
}
printf("a的否定: %d\n", !a); // 注意这里实际上会输出0(因为!a是假),但中文描述需要调整
// 更准确的中文描述可能是:"如果a为真,则输出假;如果a为假,则输出真。"
// 但由于printf直接输出的是整数值,所以这里还是保持了原始的数字输出。
return 0;
}
4. 位运算符
- 按位与 (&) :
a & b
对a和b的每一位执行与操作。 - 按位或 (|) :
a | b
对a和b的每一位执行或操作。 - 按位异或 (^) :
a ^ b
对a和b的每一位执行异或操作。 - 按位取反 (~) :
~a
对a的每一位执行取反操作。 - 左移 (<<) :
a << b
将a的二进制表示向左移动b位。 - 右移 (>>) :
a >> b
将a的二进制表示向右移动b位。
cpp
#include <stdio.h>
int main() {
unsigned int a = 5; // 二进制为 0101
unsigned int b = 3; // 二进制为 0011
printf("a & b: %u\n", a & b); // 0101 & 0011 = 0001
printf("a | b: %u\n", a | b); // 0101 | 0011 = 0111
printf("a ^ b: %u\n", a ^ b); // 0101 ^ 0011 = 0110
printf("~a: %u\n", ~a); // ~0101 = 1010...(注意这里会有补码扩展)
printf("a << 1: %u\n", a << 1); // 0101 << 1 = 1010
printf("a >> 1: %u\n", a >> 1); // 0101 >> 1 = 0010
return 0;
}
5. 赋值运算符
- 赋值 (=) :
a = b
将b的值赋给a。 - 复合赋值运算符 (如
+=
,-=
,*=
,/=
,%=
): 它们在赋值的同时执行指定的算术运算。
cpp
#include <stdio.h>
int main() {
int a = 5;
int b;
// 简单的赋值
b = a;
printf("b = a: b = %d\n", b);
// 加法赋值
a += 3; // 等同于 a = a + 3;
printf("a += 3: a = %d\n", a);
// 乘法赋值
a *= 2; // 等同于 a = a * 2;
printf("a *= 2: a = %d\n", a);
// 位运算赋值(以左移为例)
a <<= 1; // 等同于 a = a << 1;
printf("a <<= 1: a = %d\n", a);
return 0;
}
6. 条件运算符
- 条件 (?:) :
a ? b : c
如果a为真(true),则结果为b;否则为c。
cpp
#include <stdio.h>
int main() {
int a = 10, b = 20;
int max = (a > b) ? a : b; // 如果a大于b,则max=a,否则max=b
printf("较大的数是: %d\n", max);
return 0;
}
7. 逗号运算符
- 逗号 (,) :
a, b
依次计算a和b的值,并返回b的值。
cpp
#include <stdio.h>
int main() {
int a = (5, 10); // 逗号运算符,a的值为10
printf("a的值是: %d\n", a);
// 逗号运算符在for循环中的应用
for (int i = 0, j = 0; i < 5; i++, j += 2) {
// 循环体
}
// 注意:上面的for循环只是展示了逗号运算符的用法,并没有实际的打印或输出
return 0;
}
8. 指针运算符
- 取地址 (&) :
&a
获取变量a的地址。 - 间接引用 (*) 或 解引用 :
*p
获取指针p所指向地址的值。
cpp
#include <stdio.h>
int main() {
int var = 20;
int *ptr;
// 取地址运算符
ptr = &var;
printf("var的地址是: %p\n", (void*)ptr); // 注意使用%p来打印指针,并强制转换为void*以避免警告
// 解引用运算符
printf("var的值是: %d\n", *ptr);
return 0;
}
9. 长度运算符
- sizeof :
sizeof(a)
返回a所占用的字节数。
cpp
#include <stdio.h>
int main() {
int a = 10;
printf("int类型的大小是: %zu字节\n", sizeof(int)); // 注意使用%zu来匹配size_t类型
printf("变量a的大小是: %zu字节\n", sizeof(a));
return 0;
}
10.类型转换运算符
类型转换运算符用于将一种数据类型的值转换为另一种数据类型。
cpp
#include <stdio.h>
int main() {
float f = 3.14;
int i = (int)f; // 将float类型的f转换为int类型
printf("f转换为int后的值是: %d\n", i);
// 或者使用C99引入的复合字面量进行类型转换(虽然这不是运算符,但相关)
double d = (double){i}; // 实际上这里的转换是多余的,因为i已经是整数,但展示了类型转换的另一种形式
printf("i转换为double后的值是: %f\n", d);
return 0;
}
(重点)运算符优先级
另外,也可以括号()来改变优先级