C语言操作符详解

C语言操作符详解

    • [1. 算术操作符](#1. 算术操作符)
    • [2. 关系操作符](#2. 关系操作符)
    • [3. 逻辑操作符](#3. 逻辑操作符)
    • [4. 位操作符](#4. 位操作符)
    • [5. 赋值操作符](#5. 赋值操作符)
    • [6. 递增递减操作符](#6. 递增递减操作符)
    • [7. 条件操作符](#7. 条件操作符)
    • [8. 逗号操作符](#8. 逗号操作符)
    • [9. 指针操作符](#9. 指针操作符)
    • [10. 结构体/联合体操作符](#10. 结构体/联合体操作符)
    • [11. 特殊操作符](#11. 特殊操作符)
    • [12. 类型转换操作符](#12. 类型转换操作符)
    • 操作符优先级总表(从高到低)

1. 算术操作符

操作符 名称 说明 示例
+ 加法 两个操作数相加 a + b
- 减法 两个操作数相减 a - b
* 乘法 两个操作数相乘 a * b
/ 除法 两个操作数相除 a / b
% 取模 返回除法的余数 a % b

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 10, b = 3;
    float x = 10.0, y = 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("x / y = %.2f\n", x / y); // 浮点数除法:3.33
    printf("a %% b = %d\n", a % b); // 取模:1
    
    return 0;
}

2. 关系操作符

操作符 名称 说明 示例
== 等于 检查两个操作数是否相等 a == b
!= 不等于 检查两个操作数是否不相等 a != b
> 大于 检查左操作数是否大于右操作数 a > b
< 小于 检查左操作数是否小于右操作数 a < b
>= 大于等于 检查左操作数是否大于或等于右操作数 a >= b
<= 小于等于 检查左操作数是否小于或等于右操作数 a <= b

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 10, b = 20;
    
    printf("a == b: %d\n", a == b); // 等于:0(false)
    printf("a != b: %d\n", a != b); // 不等于:1(true)
    printf("a > b: %d\n", a > b);   // 大于:0
    printf("a < b: %d\n", a < b);   // 小于:1
    printf("a >= b: %d\n", a >= b); // 大于等于:0
    printf("a <= b: %d\n", a <= b); // 小于等于:1
    
    return 0;
}

3. 逻辑操作符

操作符 名称 说明 示例
&& 逻辑与 两个条件都为真时结果为真 a && b
` ` 逻辑或
! 逻辑非 反转操作数的逻辑状态 !a

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 1, b = 0, c = 1;
    
    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 = 0, y = 0;
    if (x != 0 && y++ != 0) {
        // 由于x!=0为false,y++不会执行
    }
    printf("y = %d\n", y); // 输出:0
    
    return 0;
}

4. 位操作符

操作符 名称 说明 示例
& 按位与 对两个操作数的每一位执行与操作 a & b
` ` 按位或 对两个操作数的每一位执行或操作
^ 按位异或 对两个操作数的每一位执行异或操作 a ^ b
~ 按位取反 对操作数的每一位执行取反操作 ~a
<< 左移 将位向左移动指定次数 a << n
>> 右移 将位向右移动指定次数 a >> n

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    unsigned int a = 5;    // 二进制:0101
    unsigned int b = 3;    // 二进制:0011
    
    printf("a & b = %u\n", a & b);  // 按位与:0001 = 1
    printf("a | b = %u\n", a | b);  // 按位或:0111 = 7
    printf("a ^ b = %u\n", a ^ b);  // 按位异或:0110 = 6
    printf("~a = %u\n", ~a);        // 按位取反:...11111010
    printf("a << 1 = %u\n", a << 1); // 左移1位:1010 = 10
    printf("a >> 1 = %u\n", a >> 1); // 右移1位:0010 = 2
    
    return 0;
}

5. 赋值操作符

操作符 名称 说明 示例
= 赋值 将右操作数的值赋给左操作数 a = b
+= 加后赋值 左操作数加右操作数后赋给左操作数 a += b
-= 减后赋值 左操作数减右操作数后赋给左操作数 a -= b
*= 乘后赋值 左操作数乘右操作数后赋给左操作数 a *= b
/= 除后赋值 左操作数除右操作数后赋给左操作数 a /= b
%= 取模后赋值 左操作数取模右操作数后赋给左操作数 a %= b
&= 按位与后赋值 按位与操作后赋值 a &= b
` =` 按位或后赋值 按位或操作后赋值
^= 按位异或后赋值 按位异或操作后赋值 a ^= b
<<= 左移后赋值 左移操作后赋值 a <<= n
>>= 右移后赋值 右移操作后赋值 a >>= n

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 10;
    
    // 简单赋值
    a = 20;
    printf("a = %d\n", a);
    
    // 复合赋值
    a += 5;  // 等价于 a = a + 5
    printf("a += 5: %d\n", a);
    
    a -= 3;  // 等价于 a = a - 3
    printf("a -= 3: %d\n", a);
    
    a *= 2;  // 等价于 a = a * 2
    printf("a *= 2: %d\n", a);
    
    a /= 4;  // 等价于 a = a / 4
    printf("a /= 4: %d\n", a);
    
    a %= 3;  // 等价于 a = a % 3
    printf("a %%= 3: %d\n", a);
    
    // 位运算复合赋值
    unsigned int b = 5;
    b &= 3;  // b = b & 3
    b |= 8;  // b = b | 8
    b ^= 4;  // b = b ^ 4
    
    return 0;
}

6. 递增递减操作符

操作符 名称 说明 示例
++ 递增 操作数的值增加1 a++++a
-- 递减 操作数的值减少1 a----a

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 5;
    
    // 后置递增
    printf("a++: %d\n", a++); // 先使用a的值5,然后a变为6
    printf("a: %d\n", a);     // 输出:6
    
    // 前置递增
    printf("++a: %d\n", ++a); // 先递增a为7,然后使用
    printf("a: %d\n", a);     // 输出:7
    
    // 后置递减
    printf("a--: %d\n", a--); // 先使用a的值7,然后a变为6
    printf("a: %d\n", a);     // 输出:6
    
    // 前置递减
    printf("--a: %d\n", --a); // 先递减a为5,然后使用
    printf("a: %d\n", a);     // 输出:5
    
    return 0;
}

7. 条件操作符

操作符 名称 说明 示例
? : 条件操作符 根据条件选择两个表达式之一 a > b ? a : b

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 10, b = 20;
    
    // 条件 ? 表达式1 : 表达式2
    int max = (a > b) ? a : b;
    printf("较大的数是: %d\n", max);
    
    // 嵌套条件操作符
    int score = 85;
    char grade = (score >= 90) ? 'A' : 
                 (score >= 80) ? 'B' : 
                 (score >= 70) ? 'C' : 'D';
    printf("成绩等级: %c\n", grade);
    
    return 0;
}

8. 逗号操作符

操作符 名称 说明 示例
, 逗号 按顺序执行多个表达式,返回最后一个表达式的值 a = (b++, c++)

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a, b, c;
    
    // 逗号操作符按顺序求值,返回最后一个表达式的值
    c = (a = 5, b = 10, a + b);
    printf("a = %d, b = %d, c = %d\n", a, b, c); // 输出:a=5, b=10, c=15
    
    // 在for循环中的常见用法
    for (int i = 0, j = 10; i < j; i++, j--) {
        printf("i = %d, j = %d\n", i, j);
    }
    
    return 0;
}

9. 指针操作符

操作符 名称 说明 示例
& 取地址 返回变量的内存地址 &a
* 解引用 返回指针指向地址的值 *ptr
-> 箭头 通过指针访问结构体成员 ptr->member
c 复制代码
#include <stdio.h>

int main() {
    int var = 100;
    int *ptr = &var;
    
    // 取地址操作符 &
    printf("变量var的地址: %p\n", &var);
    printf("指针ptr的值: %p\n", ptr);
    
    // 解引用操作符 *
    printf("var的值: %d\n", var);
    printf("*ptr的值: %d\n", *ptr);
    
    // 通过指针修改变量值
    *ptr = 200;
    printf("修改后var的值: %d\n", var);
    
    return 0;
}

10. 结构体/联合体操作符

操作符 名称 说明 示例
. 成员访问 访问结构体或联合体的成员 s.member
-> 箭头 通过指针访问结构体或联合体成员 ptr->member

示例代码:

c 复制代码
#include <stdio.h>

struct Student {
    char name[20];
    int age;
    float score;
};

int main() {
    struct Student s1 = {"张三", 20, 85.5};
    struct Student *ptr = &s1;
    
    // 成员操作符 .
    printf("姓名: %s\n", s1.name);
    printf("年龄: %d\n", s1.age);
    printf("分数: %.1f\n", s1.score);
    
    // 箭头操作符 ->
    printf("指针访问 - 姓名: %s\n", ptr->name);
    printf("指针访问 - 年龄: %d\n", ptr->age);
    
    return 0;
}

11. 特殊操作符

操作符 名称 说明 示例
sizeof 大小 返回数据类型或变量的大小(字节) sizeof(int)
(type) 强制类型转换 将值转换为指定类型 (float)a
[] 下标 访问数组元素 arr[i]

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a;
    double b;
    char c;
    int arr[10];
    
    printf("sizeof(int): %zu bytes\n", sizeof(int));
    printf("sizeof(a): %zu bytes\n", sizeof(a));
    printf("sizeof(double): %zu bytes\n", sizeof(double));
    printf("sizeof(char): %zu bytes\n", sizeof(char));
    printf("sizeof(arr): %zu bytes\n", sizeof(arr));
    printf("数组元素个数: %zu\n", sizeof(arr) / sizeof(arr[0]));
    
    return 0;
}

12. 类型转换操作符

c 复制代码
#include <stdio.h>

int main() {
    int a = 10, b = 3;
    float result;
    
    // 隐式类型转换
    result = a / b;  // 整数除法
    printf("整数除法: %.2f\n", result); // 输出:3.00
    
    // 显式类型转换(强制类型转换)
    result = (float)a / b;  // 浮点数除法
    printf("浮点数除法: %.2f\n", result); // 输出:3.33
    
    // 其他类型转换
    double d = 3.14159;
    int integer_part = (int)d;
    printf("整数部分: %d\n", integer_part); // 输出:3
    
    return 0;
}

操作符优先级总表(从高到低)

优先级 操作符 描述 结合性
1 () [] -> . ++ -- 函数调用、数组下标、结构成员、后置递增递减 从左到右
2 ! ~ ++ -- + - * & (type) sizeof 逻辑非、按位取反、前置递增递减、正负号、指针、类型转换 从右到左
3 * / % 乘法、除法、取模 从左到右
4 + - 加法、减法 从左到右
5 << >> 位左移、位右移 从左到右
6 < <= > >= 关系操作符 从左到右
7 == != 相等性操作符 从左到右
8 & 按位与 从左到右
9 ^ 按位异或 从左到右
10 ` ` 按位或
11 && 逻辑与 从左到右
12 ` `
13 ? : 条件操作符 从右到左
14 = += -= *= /= %= &= ^= ` = <<= >>=` 赋值操作符
15 , 逗号操作符 从左到右

示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int a = 5, b = 3, c = 2;
    int result;
    
    // 操作符优先级示例
    result = a + b * c;      // 先乘后加:5 + 6 = 11
    printf("a + b * c = %d\n", result);
    
    result = (a + b) * c;    // 先加后乘:8 * 2 = 16
    printf("(a + b) * c = %d\n", result);
    
    result = a++ * b + c;    // 5*3 + 2 = 17,然后a变为6
    printf("a++ * b + c = %d, a = %d\n", result, a);
    
    return 0;
}
相关推荐
l0sgAi2 小时前
SpringAI 整合MCP实现联网搜索 (基于tavily)
java·后端
John_Rey2 小时前
API 设计哲学:构建健壮、易用且符合惯用语的 Rust 库
网络·算法·rust
愿没error的x2 小时前
动态规划、贪心算法与分治算法:深入解析与比较
算法·贪心算法·动态规划
❀͜͡傀儡师2 小时前
使用DelayQueue 分布式延时队列,干掉定时任务!
java·分布式·delayqueue·spingboot
失散132 小时前
分布式专题——55 ElasticSearch性能调优最佳实践
java·分布式·elasticsearch·架构
NONE-C2 小时前
动手学强化学习 第6章 Dyna-Q 算法
算法
jonyleek2 小时前
【JVS更新日志】低代码、APS排产、物联网、企业计划11.12更新说明!
java·物联网·低代码·前端框架·团队开发
惊讶的猫2 小时前
面向无监督行人重识别的摄像头偏差消除学习
人工智能·算法·机器学习
深度学习机器2 小时前
RAG Chunking 2.0:提升文档分块效果的一些经验
人工智能·算法·llm