一.表达式
1.表达式的分类
- 算术表达式: 包含算术运算符的表达式,用于执行数学计算,如加法、减法、乘法、除法等。
int result = 3 + 4 * 5; // result 的值为 23
- 关系表达式:包含关系运算符的表达式,用于比较两个值,结果为真(1)或假(0)。
int isGreater = 5 > 3; // isGreater 的值为 1,因为 5 大于 3
- 逻辑表达式:包含逻辑运算符的表达式,用于执行逻辑运算,结果为真或假。
int result = (5 > 3) && (2 < 4); // result 的值为 1,因为两个条件都为真
- 赋值表达式:包含赋值运算符的表达式,用于给变量赋值。
int a = 5; // a 被赋值为 5
- 条件表达式:也称为三元运算符表达式,形式为
条件 ? 表达式1 : 表达式2
,根据条件为真或假来计算并返回表达式1或表达式2的值。int max = (a > b) ? a : b; // 如果 a 大于 b,则 max 的值为 a,否则为 b
- 逗号表达式:用逗号运算符将多个表达式连接起来,按顺序计算每个表达式,整个逗号表达式的值为最后一个表达式的值。
int a = (b = 3, b + 2); // 先执行 b = 3,然后计算 b + 2,最后 a 的值为 5
2.表达式的特点
- 求值顺序:复杂表达式中包含多个运算符时,运算符的优先级和结合性决定了表达式的求值顺序。
- 副作用:赋值表达式和递增、递减运算符会改变变量的值,这种改变是表达式的副作用。
- 类型转换:当表达式中包含不同类型的数据时,较低类型的数据会自动提升为较高类型,这称为隐式类型转换。
理解和正确使用表达式是编程中的基础技能,有助于编写出清晰、高效的代码。
二.运算符
1.运算符的分类
由上面表达式其实我们不难看出运算符其实也有很多分类
-
算术运算符:用于执行基本的算术运算,如加法(+)、减法(-)、乘法(*)、除法(/)和取余(%)。
-
关系运算符:用于比较两个值之间的关系,返回真(1)或假(0)。包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)等。
-
逻辑运算符:用于执行逻辑运算,如逻辑与(&&)、逻辑或(||)、逻辑非(!)等。
-
位运算符:用于对二进制位进行操作。包括按位与(&)、按位或(|)、按位取反(~)、按位异或(^)、左移(<<)和右移(>>)等。
-
赋值运算符:用于给变量赋值。最常见的是等号(=),还有复合赋值运算符,如加等(+=)、减等(-=)等。
-
条件运算符:也称为三元运算符,形式为
condition ? expr1 : expr2
,根据条件的真假选择返回expr1或expr2。 -
逗号运算符:用于在表达式中分隔多个表达式,从左到右依次求值,返回最右边的表达式的值。
-
sizeof运算符:用于获取数据类型或变量所占的字节数。
2.运算符的优先性
- 括号
()
:括号中的表达式具有最高的优先级,可以用来改变默认的运算顺序。 - 一元加
+
和一元减-
:用于表示正负号,具有高优先级。 - 递增
++
和递减--
:具有高优先级,分别用于增加或减少变量的值。 - 强制类型转换
(type)
:用于将表达式转换为指定的数据类型。 - 乘法
*
、除法/
和取余%
:乘法、除法和取余运算具有相同的优先级,高于加法和减法。 - 加法
+
和减法-
:加法和减法具有相同的优先级,低于乘法、除法和取余。 - 左移
<<
和右移>>
:位移运算具有相同的优先级,低于加法和减法。 - 关系运算符:包括小于
<
、大于>
、小于等于<=
、大于等于>=
。它们的优先级相同,低于位移运算。 - 相等性运算符:等于
==
和不等于!=
,优先级相同,低于关系运算符。 - 按位与
&
:位与运算的优先级低于相等性运算符。 - 按位异或
^
:位异或运算的优先级低于按位与。 - 按位或
|
:位或运算的优先级低于按位异或。 - 逻辑与
&&
:逻辑与运算的优先级低于位或。 - 逻辑或
||
:逻辑或运算的优先级低于逻辑与。 - 条件运算符
? :
:条件运算符的优先级最低,用于简单的条件判断。
例
#include <stdio.h>
int main() {
int a = 10, b = 5, c = 7;
int result;
// 算术运算符:执行基本的算术运算
result = a + b - c * 2 / 4 % 2;
// 关系运算符:比较两个值之间的关系
if (a > b && b <= c) {
printf("a大于b且b小于等于c\n");
}
// 逻辑运算符:执行逻辑运算
if (a > b && !(c < b)) {
printf("a大于b且c不小于b\n");
}
// 位运算符:对二进制位进行操作
result = a & b | c ^ 2;
printf("按位与结果:%d\n", a & b);
printf("按位或结果:%d\n", a | b);
printf("按位异或结果:%d\n", c ^ 2);
// 赋值运算符:给变量赋值
result += 5;
printf("赋值运算结果:%d\n", result);
// 逗号运算符:在表达式中分隔多个表达式
int i;
for (i = 0, result = 0; i < 5; i++, result += i) {
printf("i=%d, result=%d\n", i, result);
}
// sizeof运算符:获取数据类型或变量所占的字节数
printf("int类型占用字节数:%zu\n", sizeof(int));
return 0;
}