C语言_操作符

目录

算术操作符

移位操作符

位操作符

赋值操作符

单目操作符 

关系操作符

逻辑操作符 

条件操作符

逗号表达式

下标引用,函数调用,结构成员 

表达式求值

隐式类型转换

算术转换

操作符的属性 

练习题

代码仓库


算术操作符

加(+),减(-),乘(*),除(/),取模(%)

  • 除法:
  1. 整数除法(除号两端都是整数就执行整数除法)
  2. 浮点数除法(除号两端只要有一个是小数就执行浮点数除法)
  3. 除数不能为0
  • 取模:
  1. 得到整除后的余数
  2. 两个操作数必须都是整数

移位操作符

左移操作符(<<),右移操作符(>>)

  1. 移位移动的是补码的二进制序列
  2. 移位操作符的操作数只能是整数
  3. 整数的二进制有三种表示形式,原码,反码,补码
    根据正负直接写出的二进制序列就是原码
    正整数的原反补一样,负整数原反补需要计算
    二进制最高位是符号位,符号位1表示负数0表示正数一个整型是4个字节=32个bit位
    int a = 15;
    00000000 00000000 00000000 00001111  //原码
    00000000 00000000 00000000 00001111  //反码
    00000000 00000000 00000000 00001111  //补码最高位是符号位,1表示负数0表示正数
    int b = -15;
    10000000 00000000 00000000 00001111  //原码
    反码:符号位不变其他按位取反
    11111111 11111111 11111111 11110000  //反码
    补码:反码+1
    11111111 11111111 11111111 11110001  //补码整数在内存中存储的是补码
    计算的时候也是使用补码计算
  4. 右移分为算术右移,逻辑右移
    算术右移:右边丢弃,左边补原来的符号位
    逻辑右移:右边丢弃,左边直接补0
    C语言没有明确规定用哪个,一般编译器采用算术右移
  5. 左移:左边丢弃,右边补0
  6. 移动负数位是标准未定义行为

位操作符

按位与(&),按位或(|),按位异或(^)

  1. 操作二进制位
    int a = 3;
    int b = -5;
    a的补码:00000000 00000000 00000000 00000011
    b的补码:11111111 11111111 11111111 11111011按二进制位与(&):对应二进制位有0为0,两个同时1才为1
    a & b: 00000000 00000000 000000000 00000011 按二进制位或(|):对应二进制位有1为1,两个同时0才为0
    a | b:11111111 11111111 11111111 11111011按二进制位异或(^):对应二进制位相同为0,相异为1
    a ^ b:11111111 11111111 11111111 11111000计算结果是补码,输出需要转为原码
    原码 = 补码-1然后符号位不变取反

    面试题:不能创建临时变量(第三个变量),实现两个整数的交换。

    //方法1
    int a = 3;
    int b = 5;
    a = a + b;
    b = a - b;
    a = a - b;
    //缺陷:假如a或b特别大,那么a+b就可能超出整型范围发生截断//方法2
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;//异或特点:
    //a ^ a = 0
    //a ^ 0 = a
    //a ^ b = b ^ a 异或支持交换律

赋值操作符

  1. 赋值(=)
    int x = 1;
    int y = 2;
    int z = 3;
    //也可以连续赋值
    x = y = z = 4;
  2.  复合赋值符,+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=

单目操作符

  1. 逻辑反操作(!)
  2. 负值(-)
  3. 正值(+)
  4. 取地址(&),解引用操作符(*)应用于指针
    int a = 10;
    int* pa = &a; //取出a的地址,pa是指针变量
    *pa = 20; //通过pa中存放的地址,找到指向的空间(内容)
  5.  sizeof 不是函数,是操作符,计算的是类型创建变量的大小,单位是字节
    int a = 10;
    printf("%d\n", sizeof(a)); //4
    printf("%d\n", sizeof a); //4  可以不带括号
    int arr[10];
    printf("%d\n", sizeof(arr)); //40
  6. ~ :对一个数的二进制位按位取反
  7. 后置++(后置-- 同理)
    int a = 1;
    int b = a++; //b = a, a = a + 1 先使用,后++

    前置++(前置-- 同理)

    int a = 1;
    int b = ++a; //a = a + 1,b = a 先++,后使用
  8. 强制类型转换:(类型) 
    int a = (int)3.14;

关系操作符

  1. >, >=, <, <=, !=, ==

逻辑操作符

  1. 逻辑与(&&),逻辑或(||)
  2. && 左边为假右边就不计算了
  3. || 左边为真右边就不计算了
  4. &&,||,!,如果计算结果为真,使用1表示

条件操作符

  1. e1 ? e2 : e3
    int a = 0;
    int b = 0;if(a>5)
    {b = 3;
    }
    else
    {b = -3;
    }//转成条件操作符
    b = (a>5) ? 3 : -3;

逗号表达式

  1. 从左向右计算,整个表达式的结果是最后一个表达式的结果
    int a = 1;
    int b = 2;
    int c = (a>b, a=b+10, a, b=a+1); //13 //例子2
    a = get();
    count(a);
    while(a>0)
    {a = get();count(a);
    }
    //改成逗号表达式
    while(a=get(), count(a), a>0) {}

下标引用,函数调用,结构成员 

  1. 下标引用操作符 [ ]
    int arr[10];
    arr[3] = 4; //arr和3是操作数
  2.  函数调用操作符()
    int len = strlen("abc"); //操作数是函数名和参数
  3. 访问结构成员,结构体.成员名,结构体指针->成员名 

表达式求值

  1. 表达式在计算的过程中有哪些类型转换?有些表达式的操作数在求值的过程中可能需要转换为其他类型,类型转换有整型提升,算术转换
  2. 表达式的求值顺序是怎么样的?表达式求值的顺序一部分是由操作符的优先级和结合性决定

隐式类型转换

  1. C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符(char)和短整型(short)操作数在使用之前被转换为普通整型,这种转换称为整型提升
  2. 整型提升的意义:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
  3. 如何进行整体提升呢?
    char c1 = 5;
    //00000000 00000000 00000000 00000101 这是5的整型
    //00000101 存入char发生截断char c2 = 127;
    //00000000 00000000 00000000 01111111
    //01111111//整形提升是按照变量的数据类型的符号位来提升的,前面补符号位
    char c3 = c1 + c2
    //00000101 c1
    //00000000 00000000 00000000 00000101 c1整型提升 
    //01111111 c2
    //00000000 00000000 00000000 01111111 c2整型提升
    //整型提升后相加
    //00000000 00000000 00000000 10000100
    //10000100 c3发生截断printf("%d\n", c3); //%d:10进制的形式打印有符号的整数,遇到char需要整型提升
    //1111111 11111111 11111111 10000100 c3整型提升,前面符号位补齐,这里是补码,转成原码然后打印

算术转换

  1. 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。
    //下面的层次体系称为寻常算术转换。
    //从上往下依次排列,下面类型遇到上面类型则需要转为上面类型long doubledoublefloatunsigned long intlong intunsigned intint

操作符的属性 

  1. 复杂表达式的求值有三个影响的因素,操作符的优先级,操作符的结合性,是否控制求值顺序。
  2. 相邻操作符优先级高的先算,低的后算
  3. 相邻操作符优先级相同的情况下,看结合性

C语言中的运算符优先级可以分为多个级别,从高到低依次为:

  1. 括号类操作符(如 ()[]->.)。
  2. 单目运算符(如 !\~++---)。
  3. 算术运算符(如 +-*/%)。
  4. 关系运算符(如 <>==!=&lt;=&gt;=)。
  5. 逻辑运算符(如 &&||!)。
  6. 条件运算符(如 ? :)。
  7. 赋值运算符(如 =+=-=*=/=%=%=)。
  8. 逗号运算符(,)。

左结合性(Left-to-right)

大多数二元操作符都是左结合的,这意味着它们从左到右结合。常见的左结合操作符包括:

算术操作符+,  -,  *,  /,  %

关系操作符<,  <=,  >,  >=

相等操作符==,  !=

位操作符&,  |,  ^,  <<,  >>

逻辑操作符&&,  ||

逗号操作符,

a - b + c // 先计算 a - b,然后再计算结果 + c
 

右结合性(Right-to-left)

一些操作符是右结合的,这意味着它们从右到左结合。常见的右结合操作符包括:

赋值操作符=,  +=,  -=,  *=,  /=,  %=

三元操作符? :

一元操作符!,  ~,  ++,  --,  +(正号),  -(负号),  *(指针解引用),  &(取地址),  sizeof

类型转换操作符(type)

a = b = c // 先计算 b = c,然后再计算 a = (b = c)

总结:我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的 


练习题

答:A

答:a=9, b=23, c=8   (b=++c, c++, ++a, a++)整体是一个逗号表达式

写一个函数,返回参数二进制中1的个数

//思路:先取出第一位比较,然后右移一位
int get_one(int _num)
{int count = 0;for (int i = 0; i < 32; i++) if ((_num>>i) & 1) count++;return count;
}int main()
{int num;scanf("%d", &num);printf("%d\n", get_one(num));return 0;
}
//方法2
//n = n & (n-1) 这个表达式会让n的二进制最右边的1消失
int get_one(int _num)
{int count = 0;for (; _num != 0; _num = _num & (_num - 1), count++);return count;
}int main()
{int num;scanf("%d", &num);printf("%d\n", get_one(num));return 0;
}

获取一个整数二进制序列中所有偶数位和奇数位并分别打印

//思路:假设第一位是奇数位,第一位右移0位和1相与打印,第三位右移2位...,第5位右移4位...,第31位右移30位...
//偶数位:第2位右移1位...,第4位右移3位...,第32位右移31位...
int main()
{int n;scanf("%d", &n);for (int i = 30; i >= 0; i -= 2) printf("%d ", (n >> i) & 1);printf("\n");for (int i = 31; i > 0; i -= 2) printf("%d ", (n >> i) & 1);return 0;
}

输出两个int整数m和n的二进制序列中有多少个位不同

//思路:先异或,再算有几个1
int main()
{int m, n, count = 0;scanf("%d %d", &m, &n);int ret = m ^ n;while (ret = ret & (ret - 1)) count++;count++;printf("%d\n", count);return 0;
}

 

答:D,这个代码有问题,因为不能确定唯一的计算路径,不同的编译环境有不同的结果

 
下面代码的结果是?

答:>

解析:第一个点,全局变量和静态变量如果不初始化默认是0,

第二个点,sizeof的返回值类型是size_t也就是unsigned int,而 i 的类型是int,i 和 sizeof 比较 i 的类型会被算术转换为 unsigned int,此时 i 是 -1,所以 i 变成一个很大的正整数。

 

答:D

 

有序序列合并_牛客题霸_牛客网

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

//思路:用i, j分别遍历两个数组,将i, j对应的元素进行比较,小的输出然后往后遍历
int main() {//输入第一行int n, m;scanf("%d %d", &n, &m);//输入第二行,变长数组int n_arr[1000];for (int i = 0; i < n; i++) scanf("%d ", &n_arr[i]);//输入第三行int m_arr[1000];for (int i = 0; i < m; i++) scanf("%d ", &m_arr[i]);//合并int i = 0, j = 0;while (i < n && j < m){//谁小谁输出if (n_arr[i] < m_arr[j]) printf("%d ", n_arr[i++]);else printf("%d ", m_arr[j++]);}//走到这里是有一个数组输出完了,直接输出另一个数组剩下的数if (i == n) while (j < m) printf("%d ", m_arr[j++]);else while (i < n) printf("%d ", n_arr[i++]);return 0;
}

有序序列判断_牛客题霸_牛客网

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。


代码仓库

Operator/Operator/main.c · 林宇恒/code_c - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署过docker后,防火墙firewall与iptables的基本指令

一、iptables【无需stop docker服务】 如果服务器中部署了docker&#xff0c;优先选用iptables 1. 记录关闭docker中运行的mongoDB的27017端口&#xff1a; 由于docker与iptables存在配置规则&#xff0c;因此要修改docker相关端口的可访问性时需要使用下面的语句&#xff1a…

自定义通信协议实例

自定义通信协议是指通信双方为了实现特定功能或满足特定需求&#xff0c;在通信过程中自行约定的一种通信规则。这种协议通常包括数据的格式、传输方式、校验方法等内容&#xff0c;以确保通信双方能够正确地理解和交换信息。以下是关于自定义通信协议的一些详细解释和示例&…

git上传时出现了main master的问题解决

git 上传时 出现了main master 这个问题通常出现在Git版本控制系统中&#xff0c;当你尝试上传代码到远程仓库时&#xff0c;可能会看到一个提示&#xff0c;关于"main"和"master"的。 解释&#xff1a; Git 2020年发布了新的默认分支名称"main&qu…

智能插座搭配BIOS唤醒功能实现远程定时开关机

智能插座 智能插座凭借其强大的联网能力&#xff0c;不仅能够实现远程操控开关电源&#xff0c;部分高端型号更是集成了电量统计与自动化操作功能&#xff0c;为用户带来了前所未有的便捷体验。以下是我对几款体验过的智能插座的简要评价&#xff0c;因版本差异可能有所不同。…

工业交换机端口统计功能

工业交换机端口统计功能不仅是一项技术手段&#xff0c;更是一双透视企业网络健康状态的慧眼。通过这一功能&#xff0c;企业能够实时捕捉到网络中每一个端口的流量情况&#xff0c;这不仅仅是数据的积累&#xff0c;更是对网络脉搏的精准把握。当网络的每一个脉动都被记录在案…

RecyclerView实现手势滑动选中相册图片

要使用RecyclerView实现手势滑动选中相册图片的功能&#xff0c;你需要以下几个步骤&#xff1a; 创建含有图片资源的ViewHolder&#xff0c;继承自RecyclerView.ViewHolder&#xff0c;用于显示相册中的每个图片。 创建一个Adapter&#xff0c;继承自RecyclerView.Adapter&…

建智慧医院核心:智能导航系统的功能全析与实现效益

在数字化转型的浪潮中&#xff0c;智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂&#xff0c;传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统&#xff0c;作为医疗数字化转型的关键组成部分&#xff0c;正逐…

怎么做IDS,入侵检测

要在Linux系统上实现入侵检测系统&#xff08;IDS&#xff09;&#xff0c;您可以选择许多开源或商业工具。以下是使用开源工具Snort和Suricata来实施入侵检测系统的详细步骤&#xff1a; 选择IDS工具 1. Snort Snort是一款流行的开源网络入侵检测和防御系统&#xff08;IDS…

禅心驭智,展望软件未来新纪元

禅心驭智&#xff0c;展望软件未来新纪元 阿弥陀佛&#xff0c;善哉善哉。于这瞬息万变的数字时代&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;如同璀璨星辰&#xff0c;引领着软件开发领域步入一个前所未有的新纪元。贫僧观此变革&#xff0c;心中满是感慨与期待…

freemarker取值使用

格式化 格式化为字符串 ${entity.name!} 格式化为数字 ${entity.id?c} 格式化为时间 ${detail.date?string("yyyy-MM-dd HH:mm:ss")} 格式化为金额 判断非空 <#if detail.aEntity?? && detail.aEntity.has?? && detail.aEntity.has1>-- …

进程监视器,进程资源管理器

进程资源管理器 - Sysinternals | Microsoft Learn 进程监视器 - Sysinternals | Microsoft Learn PC查看资源占用

环境检测聚四氟乙烯微波消解罐 特氟龙反应釜 适用于COD测定

COD消解罐是实验室中用于测定水样中化学需氧量&#xff08;Chemical Oxygen Demand&#xff0c;简称COD&#xff09;的一种专用设备。化学需氧量是衡量水体污染程度的一个重要参数&#xff0c;它表示在一定条件下&#xff0c;水样中的有机物质和部分无机物质被氧化的程度。以下…

中霖教育:二建报名成功后怎么审核?

【中霖教育怎么样】【中霖教育靠谱吗】 在成功完成二级建造师资格考试的报名流程后&#xff0c;需要准备后续的审核阶段&#xff0c;审核是否通过关乎考生是否能顺利参加考试&#xff0c;审核的方式包括&#xff1a;现场审核、网络审核以及考试后的审核。 某些地区会要求考生…

AI文字图片人脸生成原创视频文生图生肖生小程序开发

AI文字图片人脸生成原创视频文生图生肖生小程序开发 无限开 0.12生成 图生视频 AI技术在生成文字、图片、人脸以及视频方面已经取得了显著的进步。以下是一些可能包含在AI文字图片人脸生成原创视频小程序中的功能列表&#xff1a; 文字转视频&#xff1a; 输入文字或文章&…

x264_ratecontrol_mb解析

目的 x264_ratecontrol_mb调用发生在宏块编码之后,如果开启了AQ,则在AQ之后,由slice_write调用,从函数名称看,是用于宏块级码率控制,但是它与调用宏块QP没有直接的关系,该函数的主要目的由两个: 更新rc->qpa_aq和rc->qpa_rc的值rc->qpa_aq为当前slice目前宏块…

2024.7.5

2024.7.5 【向之所欣&#xff0c;俯仰之间&#xff0c;已为陈迹。】 Thursday 五月三十 组合 数学&#xff01; 可能公式比较多 二项式&#xff01; $$ \begin{pmatrix}n\m\end{pmatrix}\begin{pmatrix}n-1\m-1 \end{pmatrix}\begin{pmatrix} n-1 \m\end{pmatrix} \begi…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一)

文章目录 概要开发思路界面编辑新建工程&#xff0c;设置界面大小导入素材场景编辑场景编辑 移动组件输入组件添加移动状态脚本定位组件 概要 飞船设计游戏的学习&#xff0c;如下所示 原视频地址&#xff1a; https://www.youtube.com/playlist?listPL9FzW-m48fn09w6j8Now…

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1&#xff09;无缓冲通道 2&#xff09;有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁&#xff1a; 0&#xff09;死锁现场0 1&#xff09;死…

# [0701] Task05 策略梯度、Actor-critic 算法

easy-rl PDF版本 笔记整理 P4、P9 joyrl 比对 补充 P9 - P10 相关 代码 整理 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

气压传感器在自动驾驶汽车还有哪些应用场景

气压传感器在近年来被广泛应用于各种新兴领域&#xff0c;以下是其中几个最新的应用&#xff1a; 1、自动驾驶汽车&#xff1a;自动驾驶汽车需要精确的气压传感器来监测道路上的气压变化&#xff0c;帮助车辆进行准确的定位和导航。气压传感器可以提供高精度、可靠的气压数据&…