运算符和表达式是C语言编程的基础构建块,它们共同构成了C语言程序的核心逻辑和计算。理解和掌握运算符和表达式的相关知识,对于编写高效、易读的C语言代码至关重要。
一、运算符概述
运算符是C语言中用于执行各种操作的符号,它们可以对变量、常量、表达式等进行操作。运算符是C语言中不可或缺的一部分,它们赋予了程序执行各种计算、比较、逻辑判断、位操作等功能。
1. 运算符的分类
C语言中的运算符可以根据其功能和操作对象进行分类,主要包括以下几类:
- 算术运算符:用于执行基本的数学运算,如加法、减法、乘法、除法、取余等。
- 关系运算符:用于比较两个操作数,返回布尔值(0或1),表示比较结果是否成立。
- 逻辑运算符:用于执行逻辑操作,常用于条件判断和控制流程。
- 位运算符:用于对整数的二进制位进行操作,常用于高效的位操作和数据处理。
- 赋值运算符:用于给变量赋值或更新变量的值。
- 其他运算符:包括指针运算符、结构体成员运算符、条件运算符、逗号运算符等。
2. 运算符的优先级和结合性
运算符的优先级和结合性决定了表达式中运算的顺序。优先级高的运算符优先执行,而结合性决定了相同优先级的运算符的执行顺序。
- 优先级:优先级高的运算符优先执行。例如,乘除法优先级高于加减法,所以表达式 a + b * c会先执行b * c,然后再执行a + (b * c)。
- 结合性:结合性是指当多个相同优先级的运算符出现在表达式中时,它们的执行顺序。 
  - 左结合:从左到右执行。例如,表达式 a - b + c会先执行a - b,然后再执行(a - b) + c。
- 右结合:从右到左执行。例如,表达式 a = b = c会先执行b = c,然后再执行a = (b = c)。
 
- 左结合:从左到右执行。例如,表达式 
二、基本运算符详解
1. 算术运算符
算术运算符用于执行基本的数学运算,如加法、减法、乘法、除法等。
| 运算符 | 操作 | 示例 | 结果 | 
|---|---|---|---|
| + | 加法 | 5 + 3 | 8 | 
| - | 减法 | 5 - 3 | 2 | 
| * | 乘法 | 5 * 3 | 15 | 
| / | 除法 | 5 / 3 | 1 | 
| % | 取余 | 5 % 3 | 2 | 
示例代码:
#include <stdio.h>
int main() {
    int a = 5, b = 3;
    printf("a + b = %d\n", a + b); // 加法
    printf("a - b = %d\n", a - b); // 减法
    printf("a * b = %d\n", a * b); // 乘法
    printf("a / b = %d\n", a / b); // 除法
    printf("a %% b = %d\n", a % b); // 取余
    return 0;
}
2. 关系运算符
关系运算符用于比较两个操作数,返回布尔值(0或1),表示比较结果是否成立。
| 运算符 | 操作 | 示例 | 结果 | 
|---|---|---|---|
| == | 等于 | 5 == 3 | 0 | 
| != | 不等于 | 5 != 3 | 1 | 
| > | 大于 | 5 > 3 | 1 | 
| < | 小于 | 5 < 3 | 0 | 
| >= | 大于等于 | 5 >= 3 | 1 | 
| <= | 小于等于 | 5 <= 3 | 0 | 
示例代码:
#include <stdio.h>
int main() {
    int a = 5, b = 3;
    printf("a == b: %d\n", a == b); // 等于
    printf("a != b: %d\n", a != b); // 不等于
    printf("a > b: %d\n", a > b);   // 大于
    printf("a < b: %d\n", a < b);   // 小于
    printf("a >= b: %d\n", a >= b); // 大于等于
    printf("a <= b: %d\n", a <= b); // 小于等于
    return 0;
}
3. 逻辑运算符
逻辑运算符用于执行逻辑操作,常用于条件判断和控制流程。
| 运算符 | 操作 | 示例 | 结果 | 
|---|---|---|---|
| && | 逻辑与 | 1 && 0 | 0 | 
| 逻辑或 | |||
| ! | 逻辑非 | !1 | 0 | 
示例代码:
#include <stdio.h>
int main() {
    int a = 1, b = 0;
    printf("a && b: %d\n", a && b); // 逻辑与
    printf("a || b: %d\n", a || b); // 逻辑或
    printf("!a: %d\n", !a);         // 逻辑非
    return 0;
}
4. 位运算符
位运算符用于对整数的二进制位进行操作,常用于高效的位操作和数据处理。
| 运算符 | 操作 | 示例 | 结果 | 
|---|---|---|---|
| & | 按位与 | 5 & 3 | 1 | 
| 按位或 | 5 | ||
| ^ | 按位异或 | 5 ^ 3 | 6 | 
| ~ | 按位取反 | ~5 | -6 | 
| << | 左移 | 5 << 1 | 10 | 
| >> | 右移 | 5 >> 1 | 2 | 
示例代码:
#include <stdio.h>
int main() {
    int a = 5, b = 3;
    printf("a & b: %d\n", a & b); // 按位与
    printf("a | b: %d\n", a | b); // 按位或
    printf("a ^ b: %d\n", a ^ b); // 按位异或
    printf("~a: %d\n", ~a);       // 按位取反
    printf("a << 1: %d\n", a << 1); // 左移
    printf("a >> 1: %d\n", a >> 1); // 右移
    return 0;
}
5. 赋值运算符
赋值运算符用于给变量赋值或更新变量的值。
| 运算符 | 操作 | 示例 | 结果 | 
|---|---|---|---|
| = | 简单赋值 | b = a | b的值为a的值 | 
| += | 加且赋值 | b += a | b的值为b+a的值 | 
| -= | 减且赋值 | b -= a | b的值为b-a的值 | 
| *= | 乘且赋值 | b *= a | b的值为b*a的值 | 
| /= | 除且赋值 | b /= a | b的值为b/a的值 | 
| %= | 取余且赋值 | b %= a | b的值为b%a的值 | 
示例代码:
#include <stdio.h>
int main() {
    int a = 5, b;
    b = a; // 简单赋值
    printf("b = a: %d\n", b);
    b += a; // 加且赋值
    printf("b += a: %d\n", b);
    b -= a; // 减且赋值
    printf("b -= a: %d\n", b);
    b *= a; // 乘且赋值
    printf("b *= a: %d\n", b);
    b /= a; // 除且赋值
    printf("b /= a: %d\n", b);
    b %= a; // 取余且赋值
    printf("b %%= a: %d\n", b);
    return 0;
}
三、表达式的优先级与结合性
运算符的优先级和结合性决定了表达式中运算的顺序。优先级高的运算符优先执行,而结合性决定了相同优先级的运算符的执行顺序。
1. 运算符优先级表
| 优先级 | 运算符 | 结合性 | 
|---|---|---|
| 1 | ()[]->. | 左结合 | 
| 2 | !~++--+-*&(类型)sizeof | 右结合 | 
| 3 | */% | 左结合 | 
| 4 | +- | 左结合 | 
| 5 | <<>> | 左结合 | 
| 6 | <<=>>= | 左结合 | 
| 7 | ==!= | 左结合 | 
| 8 | & | 左结合 | 
| 9 | ^ | 左结合 | 
| 10 | ` | ` | 
| 11 | && | 左结合 | 
| 12 | ` | |
| 13 | ?: | 右结合 | 
| 14 | =+=-=*=/=%=&=^=` | =<<=>>=` | 
| 15 | , | 左结合 | 
2. 结合性
结合性是指当多个相同优先级的运算符出现在表达式中时,它们的执行顺序。
- 左结合:从左到右执行。
- 右结合:从右到左执行。
四、复杂表达式的构建与简化
由于运算符的优先级和结合性,某些复杂表达式可能并不直观。为了提高代码的可读性和可维护性,建议使用括号来明确表达式的计算顺序。
示例代码:
#include <stdio.h>
int main() {
    int a = 10, b = 5, c;
    float result;
    // 算术运算
    c = a + b * 2; // 结果为 20,因为乘法优先级高于加法
    printf("a + b * 2 = %d\n", c);
    // 使用括号明确顺序
    c = (a + b) * 2; // 结果为 30,因为括号优先
    printf("(a + b) * 2 = %d\n", c);
    // 关系运算和逻辑运算
    if (a > b && b != 0) {
        result = (float)a / b; // 强制类型转换
        printf("a / b = %.2f\n", result);
    }
    // 位运算
    c = a & b; // 结果为 0,因为 10 & 5 = 0
    printf("a & b = %d\n", c);
    return 0;
}
五、表达式的优化技巧
在编写C语言代码时,优化表达式可以提高代码的执行效率和可读性。以下是几种常见的优化技巧:
- 减少冗余计算:将重复计算的部分提取出来。
   // 优化前
   result = a * b + a * c + a * d;
   // 优化后
   temp = a;
   result = temp * b + temp * c + temp * d;
- 使用位运算代替算术运算:位运算通常比算术运算更高效。
   // 优化前
   result = a * 4;
   // 优化后
   result = a << 2; // 左移2位,相当于乘4
- 使用条件运算符代替简单的if-else结构:
   // 优化前
   if (a > b) {
       result = a;
   } else {
       result = b;
   }
   // 优化后
   result = (a > b) ? a : b;
六、总结
运算符和表达式是C语言编程的基石,通过理解和掌握各种运算符及其优先级和结合性,我们可以编写出更高效、更易读的代码。运算符的适当使用和表达式的优化,对于实现复杂逻辑和提高程序性能至关重要。




















