操作符——C语言初阶

一.算数操作符:

+        -        *        /        %

  1. +、-、*、/这四个运算符均可用于整数及浮点数的运算。

  2. 当使用/运算符时,如果两个操作数均为整型,那么执行整数除法,运算结果也为整型;如果两个操作数至少一个为浮点数,那么执行浮点数运算,运算结果为浮点型。

  3. %运算符只能用于两个整数相除,返回余数


二.位移操作符:

<<        >>

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

  1. 左移操作符(<<):不论算术移位还是逻辑移位,均将左边的数舍弃,右边空缺位补0(左边丢弃,右边补0)
  2. 右移操作符(>>)

    当进行逻辑移位时,右边位丢弃,左边空缺位补0(右边丢弃,左边补0) ;  当进行算术移位时,右边位丢弃,左边位补原数的符号位(右边丢弃,左边补符号位)。

拓展:

整数的二进制表示有三种——原码反码补码

  1. 正整数的原码,反码补码相同
  2. 负的整数的原码,反码,补码是要计算的
  3. 整数在内存中储存的是补码

(1).例如=>7——由二进制得111,且为正整数(四个字节=32个比特位),所以首位为0

  • 原码:00000000000000000000000000000111
  • 反码:00000000000000000000000000000111
  • 补码:00000000000000000000000000000111

(2)..例如=>-7——由二进制得111,且为负整数(四个字节=32个比特位),所以首位为1

  • 原码:10000000000000000000000000000111(首位为1)
  • 反码:11111111111111111111111111111000(原码的符号位不变,其他位按位取反)
  • 补码:11111111111111111111111111111001(反码+1)

观察代码及其输出结果:

注意:

  1. 移位操作不改变原值。
  2. 移位时不能移负数位,这个是标准未定义的

三.位操作符:

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

注:它们的操作数必须是整数

(1)& 按(二进制)位与

例如(观察代码及其结果):

%d意味着打印一个有符号的数

思路如下:

  • 00000000000000000000000000000011—— 3的补码
  • 00000000000000000000000000000101—— -5的原码
  • 11111111111111111111111111111010—— -5的反码
  • 11111111111111111111111111111011—— -5的补码
  • 计算方法(比较二者补码,同零为零,同一为一,二者不同为零,最后转化为原码输出)
  • 00000000000000000000000000000011——按位与结果,正整数原码和补码相等(转化后结果为3)

(2). | 按(二进制)位或

例如(观察代码及其结果):

思路如下:

  • 00000000000000000000000000000011—— 3的补码
  • 00000000000000000000000000000101—— -5的原码
  • 11111111111111111111111111111010—— -5的反码
  • 11111111111111111111111111111011—— -5的补码
  • 计算方法(比较二者补码,只要有一为一,同时为零为零,最后转化为原码输出)
  • 11111111111111111111111111111011——按位或结果
  • 10000000000000000000000000000101——转化为原码,符号位不变(结果为-5)

(3). ^ 按(二进制)位异或

例如(观察代码及其结果):

思路如下:

  • 00000000000000000000000000000011—— 3的补码
  • 00000000000000000000000000000101—— -5的原码
  • 11111111111111111111111111111010—— -5的反码
  • 11111111111111111111111111111011—— -5的补码
  • 计算方法(比较二者补码,相同为零,相异为一,最后转化为原码输出)
  • 11111111111111111111111111111000——按位异或结果
  • 10000000000000000000000000001000——转化为原码,符号位不变(结果为-8)

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

如下图(交换成功):

代码如下:

//异或操作符支持交换律
#include<stdio.h>
int main()
{int a = 3;int b = -5;printf("交换前:a=%d,b=%d\n", a, b);a = a ^ b;//a=3^5b = a ^ b;//b=3^5^5      b=3a = a ^ b;//a=3^5printf("交换后:a=%d,b=%d\n", a, b);
}

四.赋值操作符:

  1. 赋值运算可以修改一个变量的值(=
  2. 复合运算符:+=,-=,*=,%=,>>=,<<=,&=,|=,^=

如下图所示,同理可推理出其他复合运算符的含义


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

  •                逻辑反操作符
  • -                 负值
  •               正值
  •               取地址
  • sizeof         操作数的类型长度(以字节为单位)
  •                对一个数的二进制按位取反
  • --                 前置,后置--
  • ++               前置,后置++
  •                 间接访问操作符(解引用操作符)
  • (类型)     强制类型转换

(上面的操作符基本上前面都已经总结过,除了~)

(1)~(按位取反) 
例题:    对一个数的二进制按位取反 (包括符号位)

例如:

#include <stdio.h>
int main()
{int a = -1;//根据前面复习的知识点,易得//10000000000000000000000000000001 - 原码//11111111111111111111111111111110 - 反码//11111111111111111111111111111111 - 补码int b = ~a; //全部按位取反//b的表示应为://00000000000000000000000000000000 //故将a按位取反之后赋值给b的值为0printf("%d\n", a);printf("%d\n", b);return 0;
}


(2)sizeof:操作数的类型长度(以字节为单位)

  • sizeof是操作符,不是函数
  • strlen是库函数,是用来求字符串长度
  • sizeof括号中的表达式是不参与运算的


六.关系操作符:

>        <        >=        <=         !=        ==

  1. ==是等于,=是赋值,不要混淆!
  2. !=是不等于,>=是大于等于,<=是小于等于
  3. 关系运算符就是进行比较,结果为真返回1,结果为假返回0

七.逻辑操作符:

  • &&             逻辑与      
  • ||                逻辑或 

  • 截断特性:逻辑与左边为假,右边不在读取计算 , 逻辑或左边为真,右边不在读取计算

(1)&&  逻辑与  

        理解为: 即 怎么  又 怎么 , 一假全假,全真为真

(2)||     逻辑或    

        理解为:   要么 怎么 要么 怎么 , 一真为真, 全假为假


七.条件操作符(三目操作符):

表达式1?表达式2:表达式3;

  1. 有三个操作数
  2. 若exp1假,则输出exp3;若exp1真,则输出exp2


八.逗号表达式:

exp1,exp2,exp3,...expN   

  1. 逗号表达式就是逗号隔开的一串表达式
  2. 逗号表达式的特点是:从左向右依次计算,整个表达式的结果是最后一个表达式的结果


九.下标引用、函数调用和结构成员

(1)下标引用操作符[ ]

  1. 操作数:一个数组名+一个索引值
    int arr[10];//创建数组
    arr[9] = 10;//实用下标引用操作符
    [ ]的两个操作数是arr和9

(2)函数调用操作符( )

  1. 接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数

(3)访问一个结构的成员:

  •               结构体.成员名
  • ->              结构体指针->成员名
  1. 结构体普通变量如何访问结构体成员:C语言规定,结构体的普通成员可以通过运算符“点.”去访问其成员
  2. 结构体指针变量如何访问其成员:可以通过箭头符号的方式去访问其成员
  3. (*p).name = = p -> name 左右两种方式等价
  4. 结构体成员如果是字符串,不能直接通过符号“=”去修改值,可以通过C语言中的拷贝函数strcpy去修改值

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

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

相关文章

点云从入门到精通技术详解100篇-双传感器模式的非结构化环境检测与识别(续)

目录 3.3 KD-Tree算法点云特征提取 3.3.1 KD-Tree算法的基本原理 3.3.2边沿点提取 3.4道路边沿线拟合验证

macOS 13.6 及后续系统安装 Asahi Linux 将破坏引导

导读Asahi Linux 是一个致力于为 Apple Silicon 设备带来 Linux 支持的项目&#xff0c;日前有用户反馈称&#xff0c;若在相关设备上安装了 macOS 13.6-14&#xff0c;再安装 Asahi Linux &#xff0c;就会导致系统引导失败&#xff0c;出现“黑屏”情况。 目前 Asahi Linux 项…

并发线程特性-可见性和有序性

2 可见性 2.1 什么是可见性 可见性问题是基于CPU位置出现的&#xff0c;CPU处理速度非常快&#xff0c;相对CPU来说&#xff0c;去主内存获取数据这个事情太慢了&#xff0c;CPU就提供了 L1&#xff0c;L2&#xff0c;L3的三级缓存&#xff0c;每次去主内存拿完数据后&#x…

对产品实现汇率换算服务(将两个CompletableFuture对象整合起来,无论它们是否存在依赖)

需求 有一家商店提供的价格是以欧元&#xff08;EUR&#xff09;计价的&#xff0c;但是你希望以美元的方式提供给你的客户。你可以用异步的方式向商店查询指定商品的价格&#xff0c;同时从远程的汇率服务那里查到欧元和美元之间的汇率。当二者都结束时&#xff0c;再将这两个…

单片机实验(一)

前言 实验一&#xff1a;用单片机控制多只数码管(屏)分别左、右滚动显示自己完整的学号&#xff1b; 实验二&#xff1a;用单片机控制LED1616点阵交替正序、逆序显示自己的中文姓名。 参考链接&#xff1a; LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff0…

Android网络模块基本实现步骤

Android网络模块主要是用于访问网络和获取数据&#xff0c;下面是网络模块的基本实现步骤&#xff1a; 选择网络框架&#xff1a;Android中常用的网络框架有HttpURLConnection、OkHttp、Volley和Retrofit等。最新的版本已经支持使用Kotlin协程完成网络请求&#xff0c;可以根据…

关于对Java中volatile关键字的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/134430096 出自【进步*于辰的博客】 启发之作&#xff1a;Java volatile关键字最全总结&#xf…

RK3588平台开发系列讲解(项目篇)嵌入式AI的学习步骤

文章目录 一、嵌入式AI的学习步骤1.1、入门Linux1.2、入门AI 二、瑞芯微嵌入式AI2.1、瑞芯微的嵌入式AI关键词2.2、AI模型部署流程 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2; 本篇将给大家介绍什么是嵌入式AI。 一、嵌入…

C++二分查找算法:132 模式解法二枚举2

题目及解法一&#xff1a; https://blog.csdn.net/he_zhidan/article/details/134362273 分析 第一步&#xff0c;选择各3对应的1&#xff0c;如果有多个符合对应最小的1&#xff0c;记录num[0,j)中的最小值iMin&#xff0c;如果nums[j]大于iMin&#xff0c;则m3To1 [nums[j…

基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码

基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于平衡优化器优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

STM32与ZigBee技术在智能家居无线通信中的应用研究

一、引言 智能家居系统是利用物联网技术将家庭各种设备进行互联互通&#xff0c;实现智能化控制和管理的系统。在智能家居系统中&#xff0c;无线通信技术起着至关重要的作用&#xff0c;而STM32微控制器和ZigBee技术则是实现智能家居无线通信的关键技术。本文将对STM32与ZigB…

Mysql Innodb Cluster集群搭建 - docker

Mysql Innodb Cluster集群搭建 - docker 背景搭建环境架构图3台机器如下:修改三台机器的ip域名映射如下,并重启网络使其生效部署mysql server实例通过docker启动三台mysql server实例,需要映射数据请自行更改配置加入-v启动第一台mysql-server启动第二台mysql-server启动第三…

图像分类:弥合像素和理解之间的差距

一、介绍 在人工智能的广阔领域中&#xff0c;图像分类作为一种关键应用脱颖而出&#xff0c;它无缝地融合了计算机视觉和机器学习的复杂性。图像分类的核心是训练机器对数字图像中的对象或场景进行识别和分类。这项技术有着广泛的应用&#xff0c;从自动驾驶汽车和医疗诊断到社…

计算机网络中的面向连接与无连接

目录 面向连接和无连接在计算机网络中是如何理解的面向连接和无连接的通信在路由选择上有哪些区别 面向连接和无连接在计算机网络中是如何理解的 在计算机网络中&#xff0c;面向连接和无连接是两种核心的网络通信方式&#xff0c;它们决定了数据包如何传输和接收。 面向连接&…

CPU vs GPU:谁更适合进行图像处理?

CPU 和 GPU 到底谁更适合进行图像处理呢&#xff1f;相信很多人在日常生活中都会接触到图像处理&#xff0c;比如修图、视频编辑等。那么&#xff0c;让我们一起来看看&#xff0c;在这方面&#xff0c;CPU 和 GPU 到底有什么不同&#xff0c;哪个更胜一筹呢&#xff1f; 一、C…

C# new 和 override 的区别

在C#中子类继承抽象类的时候&#xff0c;new 和override都可以用来修饰子类方法&#xff0c;但两者之间是有区别的。 相同点&#xff1a; 它们都是子类在覆写基类方法时&#xff0c;修饰子类同名方法用的&#xff0c;都是为了隐藏基类的同名方法在实例化子类对象的时候&#…

Hive使用max case when over partition by 实现单个窗口取两个窗口的值(单个开窗函数,实际取两个窗口)

一、Hive开窗函数根据特定条件取上一条最接近时间的数据&#xff08;单个开窗函数&#xff0c;实际取两个窗口&#xff09; 针对于就诊业务&#xff0c;一次就诊&#xff0c;多个处方&#xff0c;处方结算时间可能不一致&#xff0c;然后会有多个AI助手推荐用药&#xff0c;会…

SpringCloud微服务:Ribbon负载均衡

目录 负载均衡策略&#xff1a; 负载均衡的两种方式&#xff1a; 饥饿加载 1. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule&#xff0c;根据zone选择服务列表&#xff0c;然后轮询 2&#xff0e;负载均衡自定义方式 代码方式:配置灵活&#xff0c;但修…

自定义控件封装

上边对两个控件整合时用函数指针是因为QSpinBox::valueChange有重载版本 自定义的接口放在类外 你设计的界面可以通过提升为调用这些接口 添加qt设计师界面类

Elasticsearch的配置学习笔记

文/朱季谦 Elasticsearch是一个基于Lucene的搜索服务器。它提供一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口&#xff0c;Elasticsearch是用Java语言开发的。 关于Elasticsearch系列笔记&#xff0c;主要从Elasticsearch的配置、核心组件、架构设计、使…