C语言中的运算是通过运算符连接操作数来实现特定计算或逻辑判断的操作,按照功能可以分为多个不同的类别,不同类别的运算适用场景和规则存在明显差异。

C语言运算的主要分类
1. 算术运算
算术运算是最基础的运算类型,主要用于处理数值的计算操作,包含以下常见运算符:
- +:加法运算符,用于计算两个操作数的和
- -:减法运算符,用于计算两个操作数的差
- *:乘法运算符,用于计算两个操作数的乘积
- /:除法运算符,用于计算两个操作数的商,整数相除结果会截断小数部分
- %:取模运算符,用于计算两个整数相除的余数,仅支持整数操作数
- ++:自增运算符,使操作数的值加1,分为前置和后置两种形式
- --:自减运算符,使操作数的值减1,同样分为前置和后置两种形式
以下是算术运算的代码示例:
#include <stdio.h>
int main() {
int a = 10, b = 3;
// 基本算术运算
printf("a + b = %dn", a + b); // 输出13
printf("a - b = %dn", a - b); // 输出7
printf("a * b = %dn", a * b); // 输出30
printf("a / b = %dn", a / b); // 输出3,整数相除截断小数
printf("a %% b = %dn", a % b); // 输出1,取模运算
// 自增自减运算
int c = 5;
printf("后置自增:c++ = %d, 之后c = %dn", c++, c); // 输出5,6
int d = 5;
printf("前置自增:++d = %d, 之后d = %dn", ++d, d); // 输出6,6
return 0;
}
2. 关系运算
关系运算用于比较两个操作数的大小或相等关系,运算结果只有真(1)和假(0)两种情况,包含以下运算符:
- >:大于运算符,判断左操作数是否大于右操作数
- <:小于运算符,判断左操作数是否小于右操作数
- >=:大于等于运算符,判断左操作数是否大于等于右操作数
- <=:小于等于运算符,判断左操作数是否小于等于右操作数
- ==:等于运算符,判断两个操作数是否相等
- !=:不等于运算符,判断两个操作数是否不相等
关系运算的代码示例:
#include <stdio.h>
int main() {
int x = 8, y = 10;
printf("x > y 结果:%dn", x > y); // 输出0,假
printf("x < y 结果:%dn", x < y); // 输出1,真
printf("x == y 结果:%dn", x == y); // 输出0,假
printf("x != y 结果:%dn", x != y); // 输出1,真
return 0;
}
3. 逻辑运算
逻辑运算用于组合多个关系判断,实现复杂的逻辑条件判断,包含以下运算符:
- &&:逻辑与运算符,左右两个条件都为真时结果才为真
- ||:逻辑或运算符,左右两个条件有一个为真时结果就为真
- !:逻辑非运算符,对条件结果取反,真变假,假变真
逻辑运算存在短路特性,逻辑与运算中如果左操作数为假,就不会执行右操作数的判断;逻辑或运算中如果左操作数为真,就不会执行右操作数的判断。
逻辑运算的代码示例:
#include <stdio.h>
int main() {
int score = 85;
// 判断分数是否在60到100之间
if (score >= 60 && score <= 100) {
printf("成绩合格n");
}
// 判断分数是否小于60或大于100
if (score < 60 || score > 100) {
printf("成绩不合格或输入错误n");
}
// 逻辑非运算
int flag = 0;
printf("flag的非运算结果:%dn", !flag); // 输出1
return 0;
}
4. 位运算
位运算是直接对整数的二进制位进行操作的运算,仅适用于整数类型的操作数,包含以下运算符:
- &:按位与运算符,两个二进制位都为1时结果位才为1
- |:按位或运算符,两个二进制位有一个为1时结果位就为1
- ^:按位异或运算符,两个二进制位不同时结果位为1,相同时为0
- ~:按位取反运算符,将操作数的每个二进制位0变1,1变0
- <<:左移运算符,将操作数的二进制位向左移动指定位数,右边补0
- >>:右移运算符,将操作数的二进制位向右移动指定位数,左边补符号位
位运算的代码示例:
#include <stdio.h>
int main() {
int m = 6; // 二进制110
int n = 3; // 二进制011
printf("m & n = %dn", m & n); // 按位与,结果2(二进制010)
printf("m | n = %dn", m | n); // 按位或,结果7(二进制111)
printf("m ^ n = %dn", m ^ n); // 按位异或,结果5(二进制101)
printf("~m = %dn", ~m); // 按位取反,结果-7(补码表示)
printf("m << 1 = %dn", m << 1); // 左移1位,结果12(二进制1100)
printf("m >> 1 = %dn", m >> 1); // 右移1位,结果3(二进制011)
return 0;
}
5. 赋值运算
赋值运算用于给变量赋值,除了基本的赋值运算符=之外,还有复合赋值运算符,将算术运算或位运算和赋值操作结合,包含+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=等。
赋值运算的代码示例:
#include <stdio.h>
int main() {
int num = 10;
num += 5; // 等价于num = num + 5,结果15
printf("num += 5 后:%dn", num);
num *= 2; // 等价于num = num * 2,结果30
printf("num *= 2 后:%dn", num);
num >>= 1; // 等价于num = num >> 1,结果15
printf("num >>= 1 后:%dn", num);
return 0;
}
6. 其他特殊运算
C语言还有一些特殊用途的运算:
- sizeof:求字节数运算符,用于计算变量或数据类型占用的内存字节数
- ?::条件运算符,是C语言中唯一的三目运算符,语法为
条件 ? 表达式1 : 表达式2,条件为真返回表达式1的值,否则返回表达式2的值 - ,:逗号运算符,用于将多个表达式连接成一个表达式,整个逗号表达式的值是最后一个表达式的值
- &和*:取地址运算符和指针解引用运算符,用于指针相关操作
特殊运算的代码示例:
#include <stdio.h>
int main() {
int val = 20;
// sizeof运算
printf("int类型占用字节数:%dn", sizeof(int));
printf("val变量占用字节数:%dn", sizeof(val));
// 条件运算
int max = (val > 10) ? val : 10;
printf("max的值:%dn", max);
// 逗号运算
int res = (val += 5, val * 2);
printf("逗号运算结果:%dn", res); // 输出50
// 取地址和解引用运算
int *p = &val;
printf("val的地址:%p, 值:%dn", p, *p);
return 0;
}
运算优先级和结合性
C语言中不同运算符的运算优先级不同,优先级高的运算符先执行,优先级相同的时候按照结合性决定执行顺序。比如算术运算符的优先级高于关系运算符,关系运算符的优先级高于逻辑运算符。如果不确定优先级,可以使用圆括号()来提升某个运算的执行优先级,圆括号内的运算会先执行。
以下是优先级相关的示例:
#include <stdio.h>
int main() {
int result1 = 3 + 4 * 5; // 先算乘法,结果23
int result2 = (3 + 4) * 5; // 先算括号内的加法,结果35
printf("result1 = %d, result2 = %dn", result1, result2);
return 0;
}