C语言操作符

🌟 各位看官好,我是 maomi_9526!

🌍 种一棵树最好是十年前,其次是现在!

🚀 今天来学习C语言的相关知识。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

目录

[1. 操作符的分类](#1. 操作符的分类)

[2. 操作符的优先级和结合性](#2. 操作符的优先级和结合性)

优先级:

结合性:

操作符优先级示例:

[3. 左移操作符(<<)](#3. 左移操作符(<<))

[4. 按位与操作符(&)](#4. 按位与操作符(&))

[5. 按位异或操作符(^)](#5. 按位异或操作符(^))

[6. 使用按位异或交换两个变量的值](#6. 使用按位异或交换两个变量的值)

[7. 整型提升与算术转换](#7. 整型提升与算术转换)

整型提升示例

算术转换


1. 操作符的分类

我们首先将操作符分类,并通过表格详细说明每种类型的操作符。操作符在C语言中非常重要,它们帮助我们完成各种计算任务,包括数学计算、逻辑判断、位运算等。

类别 操作符 说明
算术操作符 +, -, *, /, % 用于执行常见的数学运算,如加法、减法、乘法、除法和取余。
移位操作符 <<, >> 用于将二进制位进行左移或右移。右移时有逻辑右移和算术右移的区别。
位操作符 &, ` , ^, ~`
赋值操作符 =, +=, -=, *=, /=, %=等 用于给变量赋值,支持复合赋值操作(如+=,-=等)。
单目操作符 !, ++, --, &, *, +, -, ~, sizeof, (type) 只有一个操作数。用于逻辑非、自增、自减、地址获取、类型转换等。
关系操作符 >, >=, <, <=, ==, != 用于比较两个值的大小或是否相等。
逻辑操作符 &&, `
条件操作符 ?: 三目运算符,用于简化条件判断的表达式。
逗号操作符 , 逗号分隔多个子表达式,按顺序执行每个表达式,并返回最后一个表达式的值。
下标访问 [] 用于访问数组元素。
函数调用 () 用于调用函数,并传递参数。
结构成员访问 ., -> 用于访问结构体的成员。

2. 操作符的优先级和结合性

优先级:

优先级决定了在同一个表达式中,多个运算符的执行顺序。例如,在表达式中同时出现+和*时,乘法(*)的优先级高于加法(+),因此*会先执行。

结合性:

结合性决定了同一优先级的运算符的执行顺序。大部分运算符是左结合 的(即从左到右执行),少数是右结合 的(如赋值操作符=)。对于右结合的运算符,操作数会从右向左进行运算。

操作符类型 结合性
左结合操作符 大多数运算符,如 +, -, *, &&, `
右结合操作符 =, ?:
操作符优先级示例:
复制代码
#include <stdio.h>

int main() {
    int a = 3;
    int b = 4;
    int c = 5;
    
    int result = a + b * c;  // 乘法优先级高于加法
    printf("result = %d\n", result);  // 输出: result = 23 (4 * 5 = 20, 3 + 20 = 23)
    return 0;
}

解释:

  • 在a + b * c中,乘法操作b * c的优先级高于加法操作a + b,因此先计算b * c = 20,然后再进行加法运算3 + 20 = 23。

3. 左移操作符(<<)

左移操作符将二进制数向左移动,右侧填充0。左移操作通常会导致数值乘以2的倍数(每左移一位,数值乘以2)。

复制代码
#include <stdio.h>

int main() {
    int num = 10;  // 二进制:1010
    int n = num << 1;  // 左移1位
    printf("n = %d\n", n);  // 输出: n = 20 (二进制:10100)
    printf("num = %d\n", num);  // 输出: num = 10
    return 0;
}

解释:

  • num的二进制表示是1010(即10)。当执行num << 1时,num的所有位向左移动一位,右侧补充0,变成10100(即20)。
  • 左移1位等于将原值乘以2,因此10 << 1的结果是20。

4. 按位与操作符(&)

按位与操作符&逐位比较两个整数的对应位,只有当两位都为1时,结果才为1,否则为0。

复制代码
#include <stdio.h>

int main() {
    int num1 = -3;  // 二进制:11111111111111111111111111111101(补码)
    int num2 = 5;   // 二进制:00000000000000000000000000000101
    printf("%d\n", num1 & num2);  // 输出:5
    return 0;
}

解释:

  • -3的二进制补码为11111111111111111111111111111101,5的二进制为00000000000000000000000000000101。
  • 按位与操作符会逐位比较这两个二进制数,当两个位都为1时,结果为1。因此,只有第三和第四位是1,结果为5。

5. 按位异或操作符(^)

按位异或操作符^逐位比较两个数的对应位,只有当两个位不相同时,结果才为1。

复制代码
#include <stdio.h>

int main() {
    int num1 = 6;  // 二进制:00000000000000000000000000000110
    int num2 = 5;  // 二进制:00000000000000000000000000000101
    printf("%d\n", num1 ^ num2);  // 输出:3 (二进制:00000000000000000000000000000011)
    return 0;
}

解释:

  • 6的二进制表示为00000000000000000000000000000110,5的二进制为00000000000000000000000000000101。
  • 按位异或操作符会逐位比较这两个数的二进制表示,当对应位不相同时,结果为1。因此,结果是3。

6. 使用按位异或交换两个变量的值

这种技巧常用于不使用临时变量交换两个数的值。

复制代码
#include <stdio.h>

int main() {
    int a = 10, b = 20;
    a = a ^ b;  // a = 10 ^ 20
    b = a ^ b;  // b = (10 ^ 20) ^ 20
    a = a ^ b;  // a = (10 ^ 20) ^ 10
    printf("a = %d, b = %d\n", a, b);  // 输出: a = 20, b = 10
    return 0;
}

解释:

  • 使用^(异或操作符),通过一系列的异或操作,我们可以交换两个数的值。第一步是a = a ^ b,接着通过再次异或将原本的a和b值互换。
  • 这个技巧避免了使用临时变量。

7. 整型提升与算术转换

C语言中的整型提升是指小类型(如char、short)会在进行算术运算时被自动转换为int类型。

整型提升示例
复制代码
#include <stdio.h>

int main() {
    char a = 5;
    short b = 10;
    int result = a + b;  // a 和 b 会提升为 int 类型进行加法
    printf("result = %d\n", result);  // 输出: result = 15
    return 0;
}

解释:

  • 在a + b中,a是char类型,b是short类型。它们都被自动提升为int类型,因此加法操作是在int类型下进行的。
算术转换

当表达式中的操作数类型不同,C语言会根据某些规则进行类型转换。

复制代码
#include <stdio.h>

int main() {
    float a = 3.14;
    int b = 2;
    float result = a + b;  // b 会被转换为 float 类型
    printf("result = %.2f\n", result);  // 输出: result = 5.14
    return 0;
}

解释:

  • 在a + b中,a是float类型,b是int类型。b会被自动转换为float类型,这样加法操作就会在float类型下进行。
相关推荐
学逆向的14 小时前
C 枚举变量
c语言·开发语言·网络安全
宝绿特塑业再生科技14 小时前
改性HDPE再生颗粒在户外家具挤出发泡板材中的色差控制与高品质价值重构
经验分享·科技·学习·生活·1024程序员节·户外家具
冷凝雨14 小时前
前导零、后导零、最高有效位、最低有效位计算(C)
c语言
鸥梨菌Honevid14 小时前
C 语言 restrict 关键字深度解析:从“独占访问”承诺到编译器激进优化
c语言
andrsted16 小时前
练题簿在线免费刷题:让整理过的资料,变成能反复练习的题库
学习·微信小程序·小程序·学习方法·刷题·1024程序员节
Alsn8617 小时前
Windows 安装 Ollama 及本地模型部署
学习·1024程序员节
欣欣之王来了18 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
水饺编程19 小时前
第2章:Linux 基础,切换用户
linux·c语言·汇编
知识分享小能手20 小时前
C学习教程,从入门到精通,C语言学生信息管理系统 — 知识点详解(18)
c语言·学习·1024程序员节
爱读书的小胖20 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节