【C语言复习】第六篇、关于C语言操作符的知识

news2024/11/26 23:19:34

目录

第一部分、常见操作符

第二部分、每个操作符的具体使用        

1、算术操作符

1.1、除法运算符 / 

1.2、取模运算符 %

2、移位操作符

2.1、左移 <<

2.2、右移 >>

 3、位操作符

3.1、按位异或的妙用

3.2、按位与的妙用

4、单目操作符

4.1、逻辑反操作符 !

 4.2、sizeof操作符

 4.3、按位取反~

4.4、强制类型转换

5、三目操作符(条件操作符)

6、逗号表达式

第三部分、往期文章


第一部分、常见操作符

      操作符类型相应的操作符
算术操作符+        减       乘       除/        取模%
移位操作符左移<<        右移>>
位操作符

按位与&        按位或|        按位异或^

复合赋值操作符

加等于+=     减等于-=       乘等于*=       模等于/=     余等于%=     按位与&=       

按位异或等于^=       按位或等于|=        右移等于>>=       左移等于<<=

单目操作符(只有一个操作数)

逻辑取反操作!        取地址&        计算操作数的类型长度sizeof        按位取反~

前置、后置++        前置、后置--        解引用操作符(间接访问)        

强制类型转换(类型)X   地(X为变量或者指针)

关系操作符

大于>        大于等于>=        小于<        

小于等于<=        等于等于==        不等于!=

 逻辑操作符逻辑与&&        逻辑或||
条件操作符(三目操作符)exp1 ? exp2 : exp3
逗号表达式从左往右执行exp1,exp2,exp3,exp4
下标引用、函数调用和结构成员下标引用[]        函数调用()        访问结构成员.         指针访问结构体成员->

第二部分、每个操作符的具体使用        

        这里主要记录一些使用这些操作符的基本知识,有些太简单,我就不没有记录

1、算术操作符

1.1、除法运算符 / 

        如果除号两边都是整数执行的是整数除法如果被除数与除数之间有一个是小数,那么计算结果就是小数。示例如下:

1.2、取模运算符 %

        % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

2、移位操作符

        注意:移位操作符的操作数只能是整数

2.1、左移 <<

        向左移位,右边永远补0。小技巧:对于偶数,左移1位等价于除以2,因此在FPGA内部便可用左移的方式代替除法,减少逻辑资源的使用。

2.2、右移 >>

        当操作数为正数时:向右移位,左边补0。

        当操作时为负数时:分为两种情况:(取决于编译器)

方式一、逻辑移位:左边用0填充,右边丢弃(包括符号位)

方式二、算术移位:左边用该值的符号位填充,右边丢弃(一般情况下是算数右移

验证编译器的移位方式,示例如下:

        因为a = -1,其在内存中的存储方式为:11111111_11111111_11111111_11111111,根据算术移位,其值不发生改变。

        如果该编译器的右移方式为逻辑移位时:01111111_11111111_11111111_11111111,该值为一个很大的正数。

 3、位操作符

        合理的使用位操作符,得到的代码可太妙了。其次注意:位操作符的操作数也为整数。

3.1、按位异或的妙用

        示例、不定义中间变量的方式,实现两个整数 a,b值之间的互换。

int a = 3,b =5;
//按位异或的方式
a = a ^ b;
b = a ^ b;//b = a^b^b
a = a ^ b;//a = a^b^a

//相加的方式,容易溢出
a = a + b;//8(缺点,a,b值太大时容易溢出)
b = a - b;//8 - 5 = 3
a = a - b;//8 - 3 = 5

3.2、按位与的妙用

        示例、求一个整数存储在内存中的二进制中1的个数。

方法1、常规思路

int main()
{
        int a = -1;
        int count = 0;
        for (int i = 0;i < 32; i++)
        {
            if (a & (1<<i))//注意这里的写法,不用去定义一个变量让他去移位
            {
                count++;
            }
    
        }
        printf("%d\n", count);
        return 0;
}

方法2、大佬思路

int main()
{
        int num = -1;
        int i = 0;
        int count = 0;//计数
        while (num)
        {
            count++;
            num = num & (num - 1);//num 与 num - 1 相与
        }
        printf("二进制中1的个数 = %d\n", count);
        return 0;
}

4、单目操作符

4.1、逻辑反操作符 !

        注意:C语言中,0就是假,非0就为真。 a = 100 ;!a = 0;

 4.2、sizeof操作符

        sizeof的作用:以字节为单位给出与变量或类型在内存中所占的空间大小。

        注意:1. sizeof计算字符串的时候会算入\0。

                   2. sizeof括号内部的表达式是不参与运算的!结果只有a的类型决定,定义a的时候已经给a开辟了空间。

如下图:

         关于sizeof的用法还是很多的,例如下面两张截图展示的内容。

例如1、计算不同类型变量所占空间大小

例如2、用来计算整型数组的长度(会常用!!!)

        数组长度再进行传参的时候,只能在外部提前计算好数组的长度,随后再进行传参。

 4.3、按位取反~

        对某个数取反,是将其在内存中的二进制数据(补码)进行按位取反。

        这里为啥是-1?应该懂了吧。

4.4、强制类型转换

        变量前面右括号,括号里面还有类型,那么就是强制类型转换。

(数据类型)变量 

  • 强制类型的正常用法 

  • 强制类型的更妙的用法(涉及到后面的指针的一些知识)

         void* :示任何类表型的地址都可以放进去。无论是char*,int*还是其他指针类型,都可以用void*来存放。

        用通俗的话来说,void* 就是指针类型变量的垃圾桶,可以存放任何类型变量的地址。

        因此,利用这一点,就有了一个应用场景,在编写函数的入口参数时,我不知道传入该函数的参数是什么指针类型,那么此时我先用void*来存放该指针,等我函数里面要用到该指针的时候我再去进行强制类型转换。妙的压批!

5、三目操作符(条件操作符)

        说实话,我个人认为该操作符在C语言里面经常被人遗忘,也可能是我接触的C太少。但是这个操作符在verilog HDL里面可是一个宠儿,大宠儿

        在verilog里面和assign赋值语句一起用,能够解决输出结果存在一个周期延迟的问题。这里不探讨太多,后面关于verilog 中如何使用,我会详细解释。

exp1 ?exp2 :exp3;

exp1成立,整个表达式返回exp2的值,如果exp1不成立,整个表达式返回exp3的值。

6、逗号表达式

        逗号表达式,就是用逗号隔开的多个表达式。

        逗号表达式,从左向右依次执行整个表达式的结果是最后一个表达式的结果

示例如下:用来简化代码。

int main()
{
    
    a = get_val();
    count_val(a);
    while (a > 0)
    {
        a = get_val();
        count_val(a);
    }
    return 0; 
}
//等价于
int main()
{
    while (a = get_val(), count_val(a),a > 0)
    {
        
    }
    return 0; 
}

第三部分、往期文章

        希望我的笔记对你有帮助,有需要的小伙伴可以看一下往期的文章🤪🤪🤪

        【C语言复习】第一篇、关于我的C语言的复习路线_大屁桃的博客-CSDN博客

        【C语言复习】第二篇、VS2017软件的使用以及常用小技巧_大屁桃的博客-CSDN博客 

        【C语言复习】第三篇、Gitee码云的创建和使用_大屁桃的博客-CSDN博客

        【C语言复习】第四篇、有关C语言数据类型的知识_大屁桃的博客-CSDN博客

       【C语言复习】第五篇、变量,常量,字符串,转义字符的知识_大屁桃的博客-CSDN博客

        

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

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

相关文章

18-1降维与特征选择——偏最小二乘方法(附matlab程序)

1.简述 降维&#xff1a; 比如现在有100维的变量来表征一个东西&#xff0c;我们觉得太冗余复杂了&#xff0c;想降低到10维。但是我们没有确定的筛选依据&#xff0c;直接使用数学工具来实现降维&#xff0c;就好像丢进了一个黑箱&#xff0c;经过抽象、提炼&#xff0c;得到了…

【深度学习】3-3 神经网络的学习- 导数梯度

导数 导数就是表示某个瞬间的变化量&#xff0c;式子如下&#xff1a; 式子的左边&#xff0c;表示f(x)关于x的导数&#xff0c;即f(x)相对于x的变化程度。式子表示的导数的含义是&#xff0c;x的“微小变化”将导致函数f(x)的值在多大程度上发生变化。其中&#xff0c;表示…

AI绘画是什么?怎样提高AI绘画技巧

大家好&#xff0c;我是权知星球&#xff0c;今天跟大家探讨一下AI绘画是什么&#xff1f;怎样才能提高AI绘画技巧的问题。 随着人工智能技术的迅速发展&#xff0c;AI绘画已成为一项具有前瞻性的技术。在过去几年中&#xff0c;涌现出了许多功能强大的人工智能绘画工具&#x…

荣耀加冕!数据猿斩获三项大奖,彰显技术媒体硬实力!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 6月15日及6月16日&#xff0c;由数央网、数央公益联合国内众多媒体共同举办的2023国际绿色零碳节暨ESG领袖峰会、2023国际智造节暨硬科技峰会在北京举行。 该峰会旨在倡导全社会关注气候变化问题&#xff0c;积极采取行动&a…

TBarCode SDK:条码生成:11.15.1 Crack

TBarCode SDK&#xff1a;条码生成软件 TBarCode SDK 提供给 Microsoft Office 用户 和软件开发人员 条码打印。用这种 条码生成软件 您可以优良的品质的创建和打印所有用于工业和商业的 条码符号 。 最好的条码生成软件 TBarCode SDK 表示一个公知的集条形码创建组件集. 优秀…

Python爬虫需要那些步骤 ?

Python爬虫是一种自动化程序&#xff0c;可以通过网络爬取网页上的数据。Python爬虫可以用于各种用途&#xff0c;例如数据挖掘、搜索引擎优化、市场研究等。Python爬虫通常使用第三方库&#xff0c;例如BeautifulSoup、Scrapy、Requests等&#xff0c;这些库可以帮助开发者轻松…

Python面向对象编程2-面向过程的银行账号模拟程序 项目2.1 创建账号与存款

项目总目标&#xff1a;用面向过程思想设计一个简单的银行账号模拟程序。本次将迭代多个程序版本&#xff0c;每个版本都将添加更多功能。虽然这些程序没有达到发布的质量标准&#xff0c;但整个项目的目的是关注于代码如何与一个或多个银行账户的数据进行交互。 分析项目的必要…

<Linux> 基础IO

文章目录 文件操作基本概念当前路径文件打开方式"a""w""r" 文件描述符文件描述符fd是啥1. 为什么fd是从3开始&#xff0c;0&#xff0c;1&#xff0c;2呢&#xff1f;2. fd为什么是0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#…

Mockito单元测试基本使用

文章目录 1.为什么需要Mock2.Mockito 中常用方法2.1 Mock 方法2.2 对 Mock 出来的对象进行行为验证和Junit结果断言2.3 测试桩stub2.4 参数匹配器2.5 mock()与spy()2.6 InjectMocks 本文参考&#xff1a; 【码农教程】手把手教你Mockito的使用 - 掘金 (juejin.cn) java - doRet…

利用SD的插件从文本或者图片创建3D模型

利用SD的插件从文本或者图片创建3D模型 一个用于自动从文本或图像生成3D模型的稳定扩散WebUI的自定义扩展。 利用 OpenAl Shap-E 从文本或图像生成 3D 模型&#xff0c; GitHub项日地址: https://github.com/jtydhr88/sd-webui-txt-img-to-3d-model 安装步骤: 在扩展中心选…

Linux之LVM模式下LV和VG扩容

一、LVM简介 LVM (Logical Volume Manager) 是一个逻辑卷管理器&#xff0c;它允许用户将多个硬盘分区或者整个硬盘组成一个或多个逻辑卷。LVM 可以在运行时动态地改变逻辑卷的大小&#xff0c;而不需要关机或重新启动系统。它也可以将多个硬盘的存储空间组合在一起&#xff0c…

OpenGL视口学习

VC6新建一个openGL类型项目&#xff1b; 出现一些选项&#xff0c;默认后生成一个项目&#xff1b; VC6自带GL支持&#xff1b; 需要添加附加包含路径&#xff1b; 而后构建工程&#xff1b;运行如下&#xff1b; 是一个旋转的立方体&#xff1b; 生成的代码不是MFC的&#xff…

Python入门教程+项目实战-13.4节-程序实战-二分查找算法

目录 13.4.1 何为二分查找&#xff1f; 13.4.2 算法实现 13.4.3 系统学习python 13.4.1 何为二分查找&#xff1f; 我们已经学完了Python中的字典和集合&#xff0c;利用字典和集合就可以实现快速查找&#xff0c;非常方便。字典与集合使用了哈希表的索引结构来加快查找&am…

C++ 设计模式----“对象创建“模式

“对象创建”模式  通过“对象创建” 模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持对象创建的稳定。它是接口抽象之后的第一步工作。  典型模式 • Factory Method •…

【Java】Java核心要点总结 68

文章目录 1. 为什么重写 equals() 时候必须重写 hashCode()2. 字符串常量池3. 字符串中的 intern() 方法4. try-catch-finally5. finally 中的代码不一定会执行 1. 为什么重写 equals() 时候必须重写 hashCode() 因为两个相等的对象的 hashCode 值必须是相等。也就是说如果 equ…

三、动画 -变形transform

目录&#xff1a; 1.变形transform定义 2.具体描述 3.用途 4.练习 一、变形transform定义 变形就是指通过CSS来改变元素的形状或位置 变形不会影响到页面的布局transform 用来设置元素的变形效果设置具体的值用translate()函数 二、具体描述 - 平移&#xff1a;translateX() 沿…

2023 3de实时仿真环境下资源不可见或没有了(只有floor)

F3退出实时仿真环境&#xff0c;双击结构树父节点 之后再进入实时仿真&#xff0c;3d仿真&#xff0c;再打开资源就可以看到了。

【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【Atlas 200DK A2体验】Atlas 200DK A2初体验记录

开箱照 烧录镜像 Windows版制卡工具下载地址&#xff1a; https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas%20200I%20DK%20A2/DevKit/tools/latest/Ascend-devkit-imager_latest_win-x86_64.exe 准备一张MicroSD卡&#xff0c;个人建议容量至少在64GB以上 一键制…

6 月份有哪些 GitHub 项目火了?

本期推荐开源项目目录&#xff1a; 1. 谁在招人&#xff1f; 2. ChatGPT-Midjourney 3. 让 AI 给你写代码 4. 免费的 OpenAI GPT-4 的 API 5. 金融领域的大模型 6. 文本生成音乐模型 01 谁在招人&#xff1f; 阮一峰在 GitHub 上维护了一个《科技爱好者周刊》&#xff0c;每周五…