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的二进制补码为111111111111111111111111111111015的二进制为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的二进制表示为000000000000000000000000000001105的二进制为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,接着通过再次异或将原本的ab值互换。
  • 这个技巧避免了使用临时变量。

7. 整型提升与算术转换

C语言中的整型提升是指小类型(如charshort)会在进行算术运算时被自动转换为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中,achar类型,bshort类型。它们都被自动提升为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中,afloat类型,bint类型。b会被自动转换为float类型,这样加法操作就会在float类型下进行。
相关推荐
Amor风信子6 分钟前
【简单学习】Prompt Engineering 提示词工程
学习·chatgpt·prompt
Peter_Deng.1 小时前
单片机 - 位运算详解(`&`、`|`、`~`、`^`、`>>`、`<<`)
c语言·单片机·嵌入式硬件
布伦鸽1 小时前
C# Modbus TCP/IP学习记录
开发语言·学习·c#
Jack电子实验室2 小时前
STM32实现智能温控系统(暖手宝):PID 算法 + DS18B20+OLED 显示,[学习 PID 优质项目]
stm32·学习·算法
程序员Linc2 小时前
《数字图像处理》第三章 3.8 基于模糊技术的图像强度变换与空间滤波学习笔记
笔记·学习·数字图像处理·模糊技术·强度变换·空间滤波
张张张3122 小时前
3.25学习总结 抽象类和抽象方法+接口+内部类+API
java·学习
阿巴~阿巴~2 小时前
2024年3月全国计算机等级考试真题(二级C语言)
c语言
viperrrrrrrrrr73 小时前
大数据学习(88)-zookeeper实现的高可用(HA)
大数据·学习·zookeeper
王RuaRua3 小时前
[数据结构]1.时间复杂度和空间复杂度
c语言·数据结构·算法
亭午3 小时前
pyspark学习rdd处理数据方法——学习记录
学习