Skip to content

运算符

运算符是C语言中用于执行各种操作的符号,它们可以对变量和常量进行运算。C语言提供了丰富的运算符,用于处理不同类型的操作。在本章节中,我们将学习C语言中的各种运算符及其使用方法。

1. 运算符的分类

C语言中的运算符可以分为以下几类:

  1. 算术运算符:用于进行数学运算
  2. 关系运算符:用于比较两个值
  3. 逻辑运算符:用于进行逻辑运算
  4. 位运算符:用于进行位级运算
  5. 赋值运算符:用于给变量赋值
  6. 增量和减量运算符:用于增加或减少变量的值
  7. 条件运算符:用于条件判断
  8. 逗号运算符:用于分隔表达式
  9. 指针运算符:用于指针操作
  10. ** sizeof运算符**:用于计算数据类型或变量的大小

2. 算术运算符

算术运算符用于执行基本的数学运算,如加法、减法、乘法、除法等。

2.1 基本算术运算符

运算符描述示例结果
+加法a + ba和b的和
-减法a - ba和b的差
*乘法a * ba和b的积
/除法a / ba除以b的商
%取模(余数)a % ba除以b的余数

2.2 注意事项

  1. 除法运算符:当两个操作数都是整数时,执行整数除法,结果会截断小数部分
  2. 取模运算符:操作数必须是整数,结果的符号与被除数相同

2.3 示例

c
#include <stdio.h>

int main() {
    int a = 10, b = 3;
    float c = 10.0, d = 3.0;
    
    printf("a + b = %d\n", a + b);  // 13
    printf("a - b = %d\n", a - b);  // 7
    printf("a * b = %d\n", a * b);  // 30
    printf("a / b = %d\n", a / b);  // 3(整数除法)
    printf("a %% b = %d\n", a % b);  // 1(取模)
    
    printf("c / d = %.2f\n", c / d);  // 3.33(浮点除法)
    
    return 0;
}

3. 关系运算符

关系运算符用于比较两个值,返回布尔值(真或假)。在C语言中,真用1表示,假用0表示。

3.1 关系运算符列表

运算符描述示例结果(如果a=5, b=3)
==等于a == b0(假)
!=不等于a != b1(真)
>大于a > b1(真)
<小于a < b0(假)
>=大于等于a >= b1(真)
<=小于等于a <= b0(假)

3.2 示例

c
#include <stdio.h>

int main() {
    int a = 5, b = 3;
    
    printf("a == b: %d\n", a == b);  // 0
    printf("a != b: %d\n", a != b);  // 1
    printf("a > b: %d\n", a > b);    // 1
    printf("a < b: %d\n", a < b);    // 0
    printf("a >= b: %d\n", a >= b);  // 1
    printf("a <= b: %d\n", a <= b);  // 0
    
    return 0;
}

4. 逻辑运算符

逻辑运算符用于组合多个条件,返回布尔值(真或假)。

4.1 逻辑运算符列表

运算符描述示例结果(如果a=1, b=0)
&&逻辑与a && b0(假)
``逻辑或
!逻辑非!a0(假)

4.2 短路求值

C语言中的逻辑运算符支持短路求值

  • &&:如果第一个操作数为假,则不会计算第二个操作数
  • ||:如果第一个操作数为真,则不会计算第二个操作数

4.3 示例

c
#include <stdio.h>

int main() {
    int a = 1, b = 0;
    
    printf("a && b: %d\n", a && b);  // 0
    printf("a || b: %d\n", a || b);  // 1
    printf("!a: %d\n", !a);          // 0
    printf("!b: %d\n", !b);          // 1
    
    // 短路求值示例
    int x = 5, y = 10;
    printf("(x > 10) && (y++ > 5): %d\n", (x > 10) && (y++ > 5));  // 0,y++不会执行
    printf("y = %d\n", y);  // 10
    
    printf("(x < 10) || (y++ > 5): %d\n", (x < 10) || (y++ > 5));  // 1,y++不会执行
    printf("y = %d\n", y);  // 10
    
    return 0;
}

5. 位运算符

位运算符用于对二进制位进行操作,直接操作内存中的位。

5.1 位运算符列表

运算符描述示例(二进制)结果(二进制)
&按位与1010 & 11001000
``按位或`1010
^按位异或1010 ^ 11000110
~按位取反~10100101(假设4位)
<<左移1010 << 110100
>>右移1010 >> 10101

5.2 示例

c
#include <stdio.h>

int main() {
    int a = 10;  // 二进制:1010
    int b = 12;  // 二进制:1100
    
    printf("a & b = %d\n", a & b);  // 8(二进制:1000)
    printf("a | b = %d\n", a | b);  // 14(二进制:1110)
    printf("a ^ b = %d\n", a ^ b);  // 6(二进制:0110)
    printf("~a = %d\n", ~a);        // -11(按位取反)
    printf("a << 1 = %d\n", a << 1);  // 20(二进制:10100)
    printf("a >> 1 = %d\n", a >> 1);  // 5(二进制:0101)
    
    return 0;
}

6. 赋值运算符

赋值运算符用于给变量赋值,可以与其他运算符组合使用。

6.1 赋值运算符列表

运算符描述示例等价于
=简单赋值a = ba = b
+=加后赋值a += ba = a + b
-=减后赋值a -= ba = a - b
*=乘后赋值a *= ba = a * b
/=除后赋值a /= ba = a / b
%=取模后赋值a %= ba = a % b
&=按位与后赋值a &= ba = a & b
`=`按位或后赋值`a
^=按位异或后赋值a ^= ba = a ^ b
<<=左移后赋值a <<= ba = a << b
>>=右移后赋值a >>= ba = a >> b

6.2 示例

c
#include <stdio.h>

int main() {
    int a = 10;
    
    printf("初始值 a = %d\n", a);
    
    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 %= 3;  // a = a % 3
    printf("a %%= 3: %d\n", a);  // 0
    
    return 0;
}

7. 增量和减量运算符

增量和减量运算符用于增加或减少变量的值,分为前缀和后缀两种形式。

7.1 增量和减量运算符列表

运算符描述示例结果
++a前缀增量a=5; b=++a;a=6, b=6
a++后缀增量a=5; b=a++;a=6, b=5
--a前缀减量a=5; b=--a;a=4, b=4
a--后缀减量a=5; b=a--;a=4, b=5

7.2 区别

  • 前缀形式:先修改变量的值,再使用修改后的值
  • 后缀形式:先使用变量的当前值,再修改变量的值

7.3 示例

c
#include <stdio.h>

int main() {
    int a = 5, b;
    
    // 前缀增量
    b = ++a;
    printf("前缀增量: a=%d, b=%d\n", a, b);  // a=6, b=6
    
    // 重置a
    a = 5;
    
    // 后缀增量
    b = a++;
    printf("后缀增量: a=%d, b=%d\n", a, b);  // a=6, b=5
    
    // 重置a
    a = 5;
    
    // 前缀减量
    b = --a;
    printf("前缀减量: a=%d, b=%d\n", a, b);  // a=4, b=4
    
    // 重置a
    a = 5;
    
    // 后缀减量
    b = a--;
    printf("后缀减量: a=%d, b=%d\n", a, b);  // a=4, b=5
    
    return 0;
}

8. 条件运算符

条件运算符(三元运算符)是C语言中唯一的三元运算符,用于简洁地表达条件判断

8.1 语法

c
条件 ? 表达式1 : 表达式2

8.2 说明

  • 如果条件为真,执行表达式1并返回其结果
  • 如果条件为假,执行表达式2并返回其结果

8.3 示例

c
#include <stdio.h>

int main() {
    int a = 10, b = 20;
    int max;
    
    // 使用条件运算符找出最大值
    max = (a > b) ? a : b;
    printf("最大值: %d\n", max);  // 20
    
    // 使用条件运算符判断奇偶性
    int num = 7;
    printf("%d%s\n", num, (num % 2 == 0) ? "偶数" : "奇数");  // 奇数
    
    return 0;
}

9. 逗号运算符

逗号运算符用于分隔多个表达式,从左到右依次执行,返回最后一个表达式的结果。

9.1 语法

c
表达式1, 表达式2, 表达式3, ..., 表达式n

9.2 示例

c
#include <stdio.h>

int main() {
    int a, b, c;
    
    // 使用逗号运算符
    a = 10, b = 20, c = a + b;
    printf("a=%d, b=%d, c=%d\n", a, b, c);  // 10, 20, 30
    
    // 在for循环中使用逗号运算符
    for (int i = 0, j = 10; i < 5; i++, j--) {
        printf("i=%d, j=%d\n", i, j);
    }
    
    return 0;
}

10. 指针运算符

指针运算符用于处理指针,包括取地址运算符和间接寻址运算符。

10.1 指针运算符列表

运算符描述示例
&取地址运算符&a 获取变量a的地址
*间接寻址运算符*p 获取指针p指向的值

10.2 示例

c
#include <stdio.h>

int main() {
    int a = 10;
    int *p;  // 声明指针变量
    
    p = &a;  // 将a的地址赋给p
    printf("a的值: %d\n", a);  // 10
    printf("a的地址: %p\n", &a);  // a的内存地址
    printf("p的值: %p\n", p);  // a的内存地址
    printf("*p的值: %d\n", *p);  // 10(通过指针访问a的值)
    
    *p = 20;  // 通过指针修改a的值
    printf("修改后a的值: %d\n", a);  // 20
    
    return 0;
}

11. sizeof运算符

sizeof运算符用于计算数据类型或变量占用的字节数

11.1 语法

c
sizeof(数据类型)
sizeof(变量名)
sizeof 变量名

11.2 示例

c
#include <stdio.h>

int main() {
    printf("int的大小: %zu字节\n", sizeof(int));
    printf("float的大小: %zu字节\n", sizeof(float));
    printf("double的大小: %zu字节\n", sizeof(double));
    printf("char的大小: %zu字节\n", sizeof(char));
    
    int a;
    printf("变量a的大小: %zu字节\n", sizeof(a));
    
    int arr[10];
    printf("数组arr的大小: %zu字节\n", sizeof(arr));
    printf("数组元素个数: %zu\n", sizeof(arr) / sizeof(arr[0]));
    
    return 0;
}

12. 运算符的优先级

运算符的优先级决定了表达式中操作的执行顺序。优先级高的运算符先执行,优先级低的运算符后执行。

12.1 优先级从高到低

  1. 括号()
  2. 一元运算符++, --, !, ~, +, -, *, &
  3. 算术运算符*, /, % 高于 +, -
  4. 位移运算符<<, >>
  5. 关系运算符>, <, >=, <= 高于 ==, !=
  6. 位运算符& 高于 ^ 高于 |
  7. 逻辑运算符&& 高于 ||
  8. 条件运算符?:
  9. 赋值运算符=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
  10. 逗号运算符,

12.2 注意事项

当表达式中包含多个运算符时,建议使用括号明确指定运算顺序,提高代码可读性。

12.3 示例

c
#include <stdio.h>

int main() {
    int a = 5, b = 3, c = 2;
    int result;
    
    // 优先级示例
    result = a + b * c;  // 先乘后加,结果为11
    printf("a + b * c = %d\n", result);
    
    result = (a + b) * c;  // 先加后乘,结果为16
    printf("(a + b) * c = %d\n", result);
    
    result = a > b && b < c;  // 先比较,后逻辑与,结果为0
    printf("a > b && b < c = %d\n", result);
    
    return 0;
}

13. 示例:综合运用

让我们看一个综合运用各种运算符的例子:

c
#include <stdio.h>

int main() {
    int a = 10, b = 5, c = 3;
    
    // 算术运算符
    printf("a + b = %d\n", a + b);  // 15
    printf("a - b = %d\n", a - b);  // 5
    printf("a * b = %d\n", a * b);  // 50
    printf("a / b = %d\n", a / b);  // 2
    printf("a %% c = %d\n", a % c);  // 1
    
    // 关系运算符
    printf("a > b: %d\n", a > b);  // 1
    printf("a == b: %d\n", a == b);  // 0
    
    // 逻辑运算符
    printf("(a > b) && (b > c): %d\n", (a > b) && (b > c));  // 1
    printf("(a < b) || (b > c): %d\n", (a < b) || (b > c));  // 1
    
    // 赋值运算符
    a += b;  // a = a + b = 15
    printf("a += b: %d\n", a);  // 15
    
    // 增量运算符
    b++;  // b = 6
    printf("b++: %d\n", b);  // 6
    
    // 条件运算符
    int max = (a > b) ? a : b;
    printf("最大值: %d\n", max);  // 15
    
    // sizeof运算符
    printf("int的大小: %zu字节\n", sizeof(int));  // 4
    
    return 0;
}

小结

C语言提供了丰富的运算符,用于执行各种操作:

  1. 算术运算符:用于基本数学运算
  2. 关系运算符:用于比较值
  3. 逻辑运算符:用于组合条件
  4. 位运算符:用于位级操作
  5. 赋值运算符:用于给变量赋值
  6. 增量和减量运算符:用于修改变量值
  7. 条件运算符:用于简洁的条件判断
  8. 逗号运算符:用于分隔表达式
  9. 指针运算符:用于处理指针
  10. sizeof运算符:用于计算大小

了解运算符的功能、优先级和使用方法,对于编写正确、高效的C程序非常重要。在实际编程中,应根据具体需求选择合适的运算符,并注意运算符的优先级和结合性。