操作符——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^5
	b = a ^ b;//b=3^5^5      b=3
	a = a ^ b;//a=3^5
	printf("交换后: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的值为0
    printf("%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去修改值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AJAX入门Day01笔记

Day01_Ajax入门 知识点自测 如下对象取值的方式哪个正确? let obj {name: 黑马 }A: obj.a B: obj()a 答案 A选项正确 哪个赋值会让浏览器解析成标签显示? let ul document.querySelector(#ul) let str <span>我是span标签</span>A: ul.innerText str B: ul…

<MySQL> 查询数据进阶操作 -- 联合查询

目录 一、什么是笛卡尔积&#xff1f; 二、什么是联合查询&#xff1f; 三、内连接 3.1 简介 3.2 语法 3.3 更多的表 3.4 操作演示 四、外连接 4.1 简介 4.2 语法 4.3 操作演示 五、自连接 5.1 简介 5.2 自连接非必要不使用 六、子查询(嵌套查询) 6.1 简介 6.…

计算机毕设 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要…

自己动手实现一个深度学习算法——六、与学习相关的技巧

文章目录 1.参数的更新1&#xff09;SGD2&#xff09;Momentum3&#xff09;AdaGrad4&#xff09;Adam5&#xff09;最优化方法的比较6&#xff09;基于MNIST数据集的更新方法的比较 2.权重的初始值1&#xff09;权重初始值不能为02&#xff09;隐藏层的激活值的分布3&#xff…

使用docker部署ELK日志框架-Elasticsearch

一、ELK知识了解 1-ELK组件 工作原理&#xff1a; &#xff08;1&#xff09;在所有需要收集日志的服务器上部署Logstash&#xff1b;或者先将日志进行集中化管理在日志服务器上&#xff0c;在日志服务器上部署 Logstash。 &#xff08;2&#xff09;Logstash 收集日志&#…

gRPC协议详解

gRPC介绍 gRPC是一个高性能、开源和通用的RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;由Google发起并开发&#xff0c;于2015年对外发布。它基于HTTP/2协议和Protocol Buffers设计&#xff0c;支持多种编程语言&#xff08;如C、Java、Python、Go、Ruby、C#、No…

es安装方式

es安装方式 1.下载镜像的方式 分词器 kibana和es和容器互通的方式 docker network create es-net开始拉去镜像的方式 docker pull kibana:7.12.1运行镜像的方式 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-…

论文笔记——BiFormer

Title: BiFormer: Vision Transformer with Bi-Level Routing AttentionPaper: https://arxiv.org/pdf/2303.08810.pdfCode: https://github.com/rayleizhu/BiFormer 一、前言 众所周知&#xff0c;Transformer相比于CNNs的一大核心优势便是借助自注意力机制的优势捕捉长距离…

【算法】堆排序

算法-堆排序 前置知识 堆&#xff08;即将更新&#xff09; 思路 我们现在有一个序列&#xff0c;怎么对它排序&#xff1f; 这是一个非常经典的问题&#xff0c;这里我们使用一个借助数据结构的算法——堆排序解决。 这里有一个序列&#xff0c;要对它升序排序 4 7 3 6 5 …

kubectl get nodes报错:The connection to the server localhost:8080

报错描述kubectl get nodes命令无法执行 在K8S-master初始化后&#xff0c;worker-node节点加入K8S集群后 kubeadm join 192.168.31.150:6443 --token 2n0t62.gvuu8x3zui9o8xnc \--discovery-token-ca-cert-hash sha256:d294c082cc7e0d5f620fb10e527a8a7cb4cb6ccd8dc45ffaf2c…

突发!奥特曼宣布暂停ChatGPT Plus新用户注册!

大新闻&#xff01;就在刚刚&#xff01; OpenAI的CEO Sam Altman宣布暂停ChatGPT Plus 新用户注册&#xff01; Sam Altman对此解释道&#xff1a; 由于OpenAI开发日后ChatGPT使用量的激增超出了我们的承受能力&#xff0c;我们希望确保每个人都有良好的体验。 您仍然可以在a…

51单片机应用从零开始(三)

51单片机应用从零开始&#xff08;一&#xff09;-CSDN博客 51单片机应用从零开始&#xff08;二&#xff09;-CSDN博客 详解 KEIL C51 软件的使用建立工程-CSDN博客 详解 KEIL C51 软件的使用设置工程编绎与连接程序-CSDN博客 目录 1. 用单片机控制第一个灯亮 2. 认识单片…

Mendix 创客访谈录|低代码赋能IoT应用开发

本期创客 郑锴 舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部 毕业于浙江大学&#xff0c;三年软件设计开发经验。目前任职于舜宇光学科技&#xff08;集团&#xff09;有限公司信息技术部&#xff0c;担任软件开发工程师&#xff0c;主要负责工业互联网相关软件…

报错资源不足,k8s使用containerd运行容器修改挂载点根目录换成/home

运行k8s一段时间发现存储不足报错 发现这里用的是根路径的挂载&#xff0c;修改一下

深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解

深入学习 Android Framework 第三&#xff1a;深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解 文章目录 深入学习 Android Framework前言一、Android 系统的启动流程1. 流程图2. 启动流程概述 二、源码详解1. 时序图2. 源代码1、ZygoteInit # main…

opencv(1):创建和显示窗口, 读取保存图片

下载源码&#xff0c;方便查看 API 信息。 快速在源码文件夹中搜索相关 api. grep“namedWindow(*-Rn// 限定 .h 文件 grep“namedWindow(*-Rn|grep "\.h" vscode 语法检测有问题 一直有波浪线 打开 vscode, setting 界面&#xff0c;搜索 python 在 setting.json…

【Shell脚本12】Shell 输入/输出重定向

Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入&#xff0c;默认情况下&#xff0c;这恰好是你的终端。同样&#xff0c;一个命令通常将其输出写入到标准输出&#xff0c;默…

Linux系统编程——进程中vfork函数

函数原型 pid_t vfork(void);//pid_t是无符号整型 所需头文件 #include <sys/types.h> #include <unistd.h> 功能 vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程&#xff0c;但它们创建的子进程是有区别的。 返回值 成功子进程中返回 …

RK3588平台开发系列讲解(摄像头篇)USB摄像头驱动分析

🚀返回专栏总目录 文章目录 一. USB摄像头基本知识1.1 内部逻辑结构1.2 描述符实例解析二. UVC驱动框架2.1、设备枚举过程2.2、数据传输过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 USB摄像头驱动位于 drivers\media\usb\uvc\uvc_driver.c ,我们本篇重点看下…

rpmbuild 包名 version 操作系统信息部分来源 /etc/rpm/macros.dist

/etc/rpm/macros.dist openeuler bclinux src.rpm openssl-1.1.1f-13.oe1.src.rpm 打包名称结果 openeuler openssl-1.1.1f-13.aarch64.rpm bclinux openssl-1.1.1f-13.oe1.bclinux.aarch64.rpm 验证 修改openeuler配置文件macros.dist 重新在openeuler上执行rpmbuild…