单目操作符与逗号表达式
目录
一、单目操作符
特点:
注意事项:
示例:
二、逗号表达式
1、基本概念
2、代码示例分析
示例 1:计算逗号表达式的结果
执行过程:
示例 2:逗号表达式在 if 语句中的应用
执行过程:
示例 3:逗号表达式优化循环代码
3、适用场景
4、注意事项
一、单目操作符
单目操作符(也称为一元操作符)是仅需要一个操作数的运算符。C语言中常见的单目操作符包括:
-
逻辑非:
!
-
自增/自减:
++
、--
-
取地址/解引用:
&
、*
-
算术运算:
+
(正号)、-
(负号) -
位运算:
~
(按位取反) -
类型相关:
sizeof
(求大小)、(类型)
(强制类型转换)
特点:
-
单操作数:仅作用于一个操作数。
-
优先级高:多数单目操作符的优先级高于双目操作符(如算术运算符)。
-
结合性:通常从右向左结合(如
*p++
等价于*(p++)
)。
注意事项:
-
&
和*
:-
&
用于获取变量的内存地址(如&a
)。 -
*
用于解引用指针(如*ptr
)。 -
这两个操作符将在指针章节详细讲解。
-
-
副作用:自增/自减操作符(
++
、--
)会直接修改操作数的值,需注意表达式的求值顺序。
示例:
int a = 10;
int *p = &a; // & 取地址
printf("%d", *p); // * 解引用int b = -a; // - 负号
int c = !b; // ! 逻辑非
后续学习中,指针相关的 &
和 *
会进一步展开说明。
二、逗号表达式
1、基本概念
逗号表达式是由逗号 ,
隔开的多个表达式组成的,形式如下:
exp1, exp2, exp3, ..., expN
执行规则:
-
从左到右依次计算每个表达式。
-
整个表达式的结果是最后一个表达式(
expN
)的值。
2、代码示例分析
示例 1:计算逗号表达式的结果
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1); // 逗号表达式
执行过程:
-
a > b
→1 > 2
(假,无副作用,不影响变量值) -
a = b + 10
→a = 2 + 10
→a = 12
-
a
→ 返回12
(无副作用) -
b = a + 1
→b = 12 + 1
→b = 13
(最后一步的值作为整个表达式的结果)
最终结果:c = 13
示例 2:逗号表达式在 if
语句中的应用
if (a = b + 1, c = a / 2, d > 0)
执行过程:
-
a = b + 1
→ 计算并赋值 -
c = a / 2
→ 计算并赋值 -
d > 0
→ 作为if
的判断条件
作用:在if
判断前,先执行多个操作,最后以d > 0
决定是否进入分支。
示例 3:逗号表达式优化循环代码
原代码:
a = get_val();
count_val(a);
while (a > 0) {// 业务处理a = get_val();count_val(a);
}
优化后(使用逗号表达式):
while (a = get_val(), count_val(a), a > 0) {// 业务处理
}
优势:
-
减少重复代码,使逻辑更紧凑。
-
在
while
条件部分完成变量的更新和判断,提高可读性。
3、适用场景
-
简化多步操作:如
while
、if
等需要先计算再判断的情况。 -
短小逻辑合并:在保证可读性的前提下,减少冗余代码。
-
宏定义中的多语句(需谨慎使用,避免副作用)。
4、注意事项
-
可读性:过度使用逗号表达式可能降低代码清晰度,应权衡使用。
-
求值顺序:确保依赖关系正确,避免未定义行为。
逗号表达式在合理使用时能优化代码结构,但需结合实际情况选择是否采用。