【C语言所有操作符详解1】

news2024/11/15 18:06:32

目录

操作符分类:

算术操作符

移位操作符

移位操作符介绍

原码,反码,补码 

左移操作符

右移操作符

位操作符

赋值操作符

赋值操作符

复合赋值符  

单目操作符

单目操作符介绍

sizeof 和 数组

关系操作符

逻辑操作符 


操作符分类:

算术操作符 + - * / %

移位操作符 >>    <<

位操作符.     & |

赋值操作符. =  +=.  -=.    *=.  

单目操作符.   !   sizeof   ++.     --

关系操作符.  >.  >=.    <=.  !=.  ==

逻辑操作符. &&.  ||

条件操作符. ?   :

逗号表达式.  ,

下标引用、函数调用和结构成员. [].  ().   ->

算术操作符

+        -       *          /         %

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

2. 对于 / 操作符如果两个操作数为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。 

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

 

如图  / 操作符如果两个操作数为整数,执行整数除法 结果是整数和数据类型无关

  

移位操作符

移位操作符介绍

<< 左移操作符 

>> 右移操作符

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

移动的是二进制的位

整数的二进制的表示形式有三种:原码,反码,补码

原码,反码,补码 

 正整数的原码、反码和补码相同,都是将整数直接转换成二进制的结果。

负整数的原码是将该数转换成二进制的结果,反码和补码需要通过原码计算得出。

负整数的反码的计算规则是将原码的符号位保持不变,其他位按位取反得到反码。

负整数的补码的计算规则是反码加1得到补码。

使用补码来存储整数有两个好处:

一是统一处理符号位和数值位

二是可以使用同一套硬件电路来进行原码和补码的相互转换,从而降低电路的复杂性。

整数在内存中是存的补码

使用的时候也是利用补码

 

10:

原码:00000000000000000000000000001010

反码:00000000000000000000000000001010

补码:00000000000000000000000000001010

-10:

原码:10000000000000000000000000001010

反码:111111111111111111111111111111111111110101

补码:111111111111111111111111111111111111110101

左移操作符

移位规则: 左边抛弃、右边补0

利用补码运算 

正整数:

 n = 2^3 + 2^2 + 2^1 = 14 (有乘二的意思)

负整数:

先求补码进行操作

然后在求原码看结果

n = -14 

右移操作符

移位规则:

首先右移运算分两种:

1. 逻辑移位 左边用0填充,右边丢弃

2. 算术移位 左边用原该值的符号位填充,右边丢弃

原来是负数 左边补1

原来是正数 左边补0

绝大多数的编译器都是算术移位

 

 

b = -5 

警告: 对于移位运算符,不要移动负数位,这个是标准未定义的。 

例如:

int num = 10;
num>>-1;//error

位操作符

位操作符有:

#include <stdio.h>
int main() {
    int num1 = 3;
    int num2 = -5;
    num1 & num2; //按(2进制)位与 有0就为0 两个1才为1
    num1 | num2; //按(2进制)位或 有1就为1 没有1为0
    num1 ^ num2; //按(2进制)位异或 相同为0 不同为1
    return 0;
}

 

c = 3 

 

c = 5

 

 c = -8

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

#include <stdio.h>
int main() {
    int a = 10;
    int b = 20;
    a = a^b;  //a = 10^20
    b = a^b;  //b = 10
    a = a^b;  //a = 10^20^10
    printf("a = %d  b = %d\n", a, b);
    return 0;
}

练习:编写代码实现:求一个整数存储在内存中的二进制中1的个数。 

//方法1
#include <stdio.h> 
int main()
{
   int num = 10;
   int count= 0;//计数 
   while(num)
  {
    if(num%2 == 1)
    count++;
    num = num/2;
  }
   printf("二进制中1的个数 = %d\n", count); 
   return 0;
}
//思考这样的实现方式有没有问题?
//方法2:
#include <stdio.h> 
int main()
{
    int num = -1;
    int i = 0;
    int count = 0;//计数 
    for(i=0; i<32; i++) {
        if( num & (1 << i) {
            count++;
   }
   printf("二进制中1的个数 = %d\n",count); 
   return 0;
}
//思考还能不能更加优化,这里必须循环32次的。
//方法3:
#include <stdio.h> 
int main()
{
    int num = -1;
    int i = 0;
    int count = 0;//计数 
    while(num)
    {
        count++;
        num = num&(num-1);
    }
    printf("二进制中1的个数 = %d\n",count);
    return 0; }
//这种方式是不是很好达到了优化的效果,但是难以想到。

赋值操作符

赋值操作符

int weight = 120;//体重 
weight = 89;//不满意就赋值 
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//连续赋值 这样的代码感觉怎么样?
那同样的语义,你看看:
x = y+1;
a = x; 这样的写法是不是更加清晰爽朗而且易于调试。

复合赋值符  

+=.   -=.   *=.    /=     %=.   >>=    <<=     &=    |=     ^=​​​​​​​

int x = 10;
x = x+10;
x += 10;//复合赋值 //其他运算符一样的道理。这样写更加简洁。

单目操作符

单目操作符介绍

演示代码:

#include <stdio.h>
int main() {
int a = -10;
int *p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); 
printf("%d\n", sizeof a);//这样写行不行? 
printf("%d\n", sizeof int);//这样写行不行? 
return 0;
}

C语言的解引用操作符是*。

它用于访问指针所指向的内存地址中存储的值。

例如,在下面的代码中,我们定义了一个整型指针p,并将其指向变量a的地址。然后,通过解引用操作符*,我们可以访问并修改p所指向的内存地址中存储的值。


#include <stdio.h>

int main() {
    int a = 20;
    int* p = &a;
    
    *p = 10;
    
    printf("%d\n", *p); // 输出10
    printf("%d\n", a); // 输出10
    
    return 0;
}

在上述代码中,通过*p可以访问p所指向的内存地址中存储的值,即变量a的值。

通过对*p进行赋值,我们实际上修改了a的值。

因此,最后的输出结果为10。

 

sizeof 和 数组

C语言中的sizeof运算符可以用来获取变量、数组和结构体所占用的内存空间大小

sizeof 计算的结果是size_t 类型

size_t 是无符号的类型

对size_t 类型的数据进行打印,可以使用%zd

sizeof 后面的括号在括号中写的不是类型的时候,括号可以省略,这样就说sizeof不是函数

sizeof是操作符 一 单目操作符

 

//++和--运算符
//前置++和-- #include <stdio.h> int main()
{
    int a = 10;
    int x = ++a;
//先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。 
    int y = --a; 
//先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10; 
    return 0;
}
//后置++和-- 
#include <stdio.h> 
int main()
{
int a = 10;
int x = a++; //先对a先使用,再增加,这样x的值是10;之后a变成11; 
int y = a--; //先对a先使用,再自减,这样y的值是11;之后a变成10; 
return 0;
}

 

关系操作符

警告:

在编程的过程中== 和=不小心写错,导致的错误。

逻辑操作符 

 

 

 区分逻辑与按位与 

 区分逻辑或按位或

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

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

相关文章

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10.A)- FlexSPI NAND启动时间(RT1170)...

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1170 FlexSPI NAND启动时间。 本篇是 i.MXRT1170 启动时间评测第四弹&#xff0c;前三篇分别给大家评测了 Raw NAND 启动时间(基于 MIMXRT1170-EVK_Rev.B)、Serial NOR 启动…

模电模电基础知识学习笔记汇总

来源&#xff1a;一周搞&#xff08;不&#xff09;定数电模电全集&#xff0c;电子基础知识 11小时 一&#xff1a;模电学习笔记 模电主要讲述&#xff1a;对模拟信号进行产生、放大和处理的模拟集成电路重点知识&#xff1a;常用电子元器件&#xff1a;电阻、电容、电感、保…

PostGis -基础、Springboot 整合、电子围栏处理

目的&#xff1a; 为什么要用PostgreSQL? 因为有时候我们需要存储 空间数据&#xff0c;如&#xff1a;存储一个 多边形 到数据。PostGis中 geometry、geography &#xff1a;基本空间数据类型&#xff0c;用于表达点线面等空间要素&#xff0c;具体类型涵盖了OGC的简单对象模…

Java类的加载过程是什么?

本文重点 本文将学习类的加载过程,java命令将class文件放到类加载器中,那么之后经历了什么?本文将对其进行学习。 类加载方式? 两种加载方式:隐式加载(静态加载)和显式加载(动态加载) 隐式加载指的是在程序使用new等方式创建对象的时候,会隐式地调用类的加载器把…

人工智能轨道交通行业周刊-第53期(2023.7.24-7.30)

本期关键词&#xff1a;交通大模型、铁路十大创新、隧道病害检测、信号专业标准、Llama-2测评 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetr…

golang中降本增效的常规实践

最近一年各大中小厂都在搞"优化"&#xff0c;说到优化&#xff0c;目的还是"降本增效"&#xff0c;降低成本&#xff0c;增加效益&#xff08;效率&#xff09;。 技术层面&#xff0c;也有一些降本增效的常规操作。 比如池化、io缓冲区技术 golangC#eg.池…

stable diffusion打造自己专属的LORA模型

通过Lora小模型可以控制很多特定场景的内容生成。 但是那些模型是别人训练好的&#xff0c;你肯定很好奇&#xff0c;我也想训练一个自己的专属模型&#xff08;也叫炼丹&#xff5e;_&#xff5e;&#xff09;。 甚至可以训练一个专属家庭版的模型&#xff08;family model&…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十一天 41/50【异或】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

自定义类型知识详解(结构体,位段,枚举,联合体)

目录 结构体 定义&#xff0c;初始化&#xff0c;自引用 内存对齐&#xff0c;修改默认对齐数 传参 位段 位段内存问题 跨平台及其应用问题 枚举 定义&#xff0c;初始化 实战举例使用及其优点 联合体 联合体定义 特点 大小计算问题 结构体 定义&#xff0c;初始化&#xff…

揭秘 ChatGPT:构建 AI 搜索的不同方法

作者&#xff1a;Sherry Ger 什么是 ChatGPT&#xff1f; 首先&#xff0c;ChatGPT 太棒了&#xff01; 它可以帮助你更高效地工作 —— 从总结 10,000 字的文档到提供竞争产品之间的差异列表&#xff0c;以及许多其他任务。 ChatGPT 是最著名的基于 Transformer 架构的大型语…

SpringBoot读取配置文件顺序

文章目录 一、前言二、SpringBoot配置文件目录读取顺序源码解析 三、SpringBoot配置文件类型读取顺序源码解析 一、前言 本文通过源码分析 SpringBoot 加载配置文件目录的顺序&#xff0c;以及 properties、xml、yml、yaml文件的读取顺序 二、SpringBoot配置文件目录读取顺序…

前端学习——Vue (Day7)

vuex 构建 vuex [多组件数据共享] 环境 state状态 mutations状态 mapMutations actions mapActions getters 模块 module (进阶语法) 综合案例 - 购物车 axios报错解决方案 import axios from axiosexport default {namespaced: true,state () {return {list: []}},mutations…

用户体系之账户设计

文章目录 前言一、需求分析1、登录功能2、退出功能3、账号绑定功能3、其他注意事项 二、账户设计1、表设计2、QA 三、实践1、账户密码登录2、手机号登录3、第三方授权登录4、账户统一 前言 随着互联网的发展&#xff0c;越来越多的应用、网站需要用户进行登录才能使用。为了方…

LeetCode 刷题 数据结构 数组 283题 移动零

难度&#xff1a;简单 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入:…

QGraphicsView实现简易地图2『瓦片经纬度』

前文链接&#xff1a;QGraphicsView实现简易地图1『加载离线瓦片地图』 地图采用GCJ02 Web 墨卡托投影&#xff0c;最小坐标&#xff1a;(-180.00000000000000,-85.05112877980655)&#xff0c;最大坐标&#xff1a;(180.00000000000000,85.05112877980655)。瓦片地图单张图片像…

如何通俗理解扩散模型?

扩散模型(Diffusion Model)是一类十分先进的基于扩散思想的深度学习生 成模型。生成模型除了扩散模型之外&#xff0c;还有出现较早的 VAE ( Variational Auto- Encoder&#xff0c;变分自编码器) 和 GAN ( Generative Adversarial Net &#xff0c;生成对抗网络) 等。 虽然它们…

Cpp学习——类与对象(2)

思维导图&#xff1a; 一&#xff0c;构造函数 1.定义 对于构造函数首先就要知道构造函数怎么写&#xff0c;构造函数怎么写呢&#xff1f;你要知道如下两点&#xff1a; 1.构造函数的函数名要与类名相同 2.构造函数是没有返回值的&#xff0c;但可以有参数。 因为这第二点&am…

ubuntu目录分析

在Ubuntu根目录下&#xff0c;以下是一些常见文件夹的含义&#xff1a; /bin&#xff1a;存放可执行文件&#xff0c;包含一些基本的命令和工具。 /boot&#xff1a;存放启动时所需的文件&#xff0c;如内核和引导加载程序。 /dev&#xff1a;包含设备文件&#xff0c;用于与硬…

关于计算机视觉的Open3D简介

一、说明 Open3D 是一个开源库&#xff0c;使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式&#xff0c;例如 .ply、.obj、.stl 和 .xyz&#xff0c;并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…

【雕爷学编程】MicroPython动手做(16)——掌控板之图片图像显示

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…