一、赋值操作符
= += -= *= /= %= &= ^= ……
赋值操作符用于给变量赋值:
代码演示:
#include <stdio.h>
int main() {
int a = 10;
a += 5; // 等价于 a = a + 5
printf("a += 5: %d\n", a); // 15
a -= 3; // 等价于 a = a - 3
printf("a -= 3: %d\n", a); // 12
a *= 2; // 等价于 a = a * 2
printf("a *= 2: %d\n", a); // 24
a /= 4; // 等价于 a = a / 4
printf("a /= 4: %d\n", a); // 6
a %= 4; // 等价于 a = a % 4
printf("a %%= 4: %d\n", a); // 2
return 0;
}
二、特殊操作符
1、条件操作符(三元操作符)
该操作符是C语言中唯一一个需要三个操作数的操作符,因此也称三元操作符。它提供了一种简洁的方式来根据条件执行两种不同的操作或返回不同的值。
它的语法结构可以看作是一个微型的 if-else
语句,但因为它是一个操作符,所以它可以产生一个值,并直接用在表达式里。
语法形式
condition ? expression_if_true : expression_if_false;
-
condition
:首先计算这个条件表达式。如果结果为真(非零),则执行expression_if_true
;如果为假(零),则执行expression_if_false
。 -
?
: 将条件和两个可能的结果分隔开。 -
expression_if_true
: 如果条件为真,则执行这个表达式。 -
:
: 分隔两个结果表达式。 -
expression_if_false
: 如果条件为假,则执行这个表达式。
如何工作:一个简单的比喻
你可以把它想象成一个决策点:
如果 天气好,那么 我去公园,否则 我待在家里。
在代码中,这个“决策点”被压缩成了一行。
代码示例
示例1:求最大值
#include <stdio.h>
int main() {
int a = 10, b = 20;
// 使用 if-else 语句
int max;
if (a > b) {
max = a;
} else {
max = b;
}
printf("最大值是: %d\n", max); // 输出 20
// 使用三元操作符 (功能完全相同,但更简洁)
int max2 = (a > b) ? a : b;
printf("最大值是: %d\n", max2); // 输出 20
return 0;
}
示例2:判断奇偶性
#include <stdio.h>
int main() {
int number = 7;
// 条件 ? 真 : 假
printf("%d 是%s\n", number, (number % 2 == 0) ? "偶数" : "奇数");
// 输出:7 是奇数
// 解释:
// 条件: (number % 2 == 0) -> 7除以2余1,不等于0,条件为假(False)
// 因此选择冒号后面的表达式 -> "奇数"
// 整个三元操作符最终的值就是字符串"奇数"
return 0;
}
示例3:简单的赋值控制
#include <stdio.h>
int main() {
int score = 85;
char grade;
// 根据分数分配等级
grade = (score >= 90) ? 'A' : ((score >= 60) ? 'B' : 'C'); // 嵌套三元操作符
printf("分数 %d 的等级是: %c\n", score, grade); // 输出:分数 85 的等级是: B
return 0;
}
注意:虽然可以嵌套使用,但过度嵌套会降低代码可读性。
三元操作符是C语言中一个非常强大的工具,它本质上是一个简洁的条件表达式。它的核心作用是根据条件二选一,并返回一个值。熟练掌握它可以让你的代码更精炼、更专业。
2、sizeof 操作符
作用:
在编译期间获取变量或数据类型在内存中的大小。
它是操作符,不是函数!
这是最需要理解的一点。虽然 sizeof
后面常常跟着括号,让它看起来像一个函数(如 sizeof(int)
),但括号只有在操作数是数据类型时才是必须的。当操作数是变量名或表达式时,括号可以省略。
代码演示:
#include <stdio.h>
int main() {
printf("int大小: %zu 字节\n", sizeof(int));
printf("double大小: %zu 字节\n", sizeof(double));
int arr[10];
printf("数组大小: %zu 字节\n", sizeof(arr)); // 40字节(假设int为4字节)
return 0;
}
3、逗号操作符
作用:
按从左往右的顺序依次执行各个操作数,最后的结果为最右侧的操作数
代码演示:
#include <stdio.h>
int main() {
int a, b;
// 逗号操作符从左到右求值,返回最右边的值
int result = (a = 5, b = 10, a + b);
printf("结果: %d\n", result); // 15
return 0;
}
三、操作符的优先级和结合性
优先级:
优先级指的是,如果一个代码含有多个运算符,哪个运算符先执行。各种运算符的优先级是不一样的。
26+7*10
上面示例中,表达式 26+7*10里面既有加法运算符(+)又有乘法运算符(*)。由于乘法运算符的优先级高于加法运算符,所以会先计算7*10,而不是先计算26+7.
结合性
如果两个运算符优先级相同,那么优先级就没办法确定那个先计算了,这个时候就要看结合性,则根据运算符是左结合,还是右结合,决定运算顺序。

四、常见的陷阱
1、自增自减操作符的前后缀区别
#include <stdio.h>
int main() {
int a = 5, b;
b = a++; // 先赋值,后自增
printf("a = %d, b = %d\n", a, b); // a = 6, b = 5
a = 5;
b = ++a; // 先自增,后赋值
printf("a = %d, b = %d\n", a, b); // a = 6, b = 6
return 0;
}
2. 避免除零错误
#include <stdio.h>
int main() {
int a = 10, b = 0;
// 错误的做法:会导致运行时错误
// int result = a / b;
// 正确的做法:先检查除数
if (b != 0) {
int result = a / b;
printf("结果: %d\n", result);
} else {
printf("错误: 除数不能为零\n");
}
return 0;
}
3、注意整数溢出
#include <stdio.h>
#include <limits.h>
int main() {
int max_int = INT_MAX;
printf("MAX_INT: %d\n", max_int);
printf("溢出: %d\n", max_int + 1); // 未定义行为
return 0;
}
希望本文能帮助你更好地理解和运用C语言操作符!