完全自学C(干货) —— 操作符(一)

C++从入门到“精通“,我踩过的坑希望你可以绕着走 1 c++ 发展方向 实验室开发 C++绝对是工科生中的第一大语言,C++兼具面向过程以及面向对象的特性,既拥有比较优秀的运行速度,又有良好的大型项目开发能力,那简直可以制霸高校实验室了。 后端开发 学了C++之后,第一选择当然就是去面试后台开发的岗位。 客户端开发 需要扎实的编程基础和计算机理论基础,同时可能还要熟悉Windows/C++编译链接机制、QT客户端开发技术体系、Windows消息机制等技术。 音视频开发/多媒体开发 大平台都在做短视频,同时也不断接入各 阅读详情

目录

一,基本操作符

二,移位操作符(二进制位)

三,位操作符(二进制位)

四,赋值操作符

五,单目操作符

六,关系操作符

七,逻辑操作符

八,条件操作符

九,逗号表达式

十,下标引用操作符

十一,函数调用操作符

十二,结构成员


一,基本操作符

加 + 、减 - 、乘 * 、除 / 、求余 %

注:

  • 除了 % 操作符之外,其他的操作符都可以作用于整数和浮点数;
  • 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除 法。
  • % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
int main()
{
	int a = 1;
	int b = 2;
	a + b; 
	a - b;
	a * b;
	a / b; //结果为0,两整数相除结果仍为整数,只要其中有浮点数即可得出小数
	a % b; //左右边操作数需均为整数
	return 0; 
}

二,移位操作符(二进制位)

右移 >> ,左移 <<

1,>>,右移操作符(除2效果),右移有两种情况:

  • 算数右移,右边丢弃,左边补原符号位(可能是0,也可能是1);
  • 逻辑右移,右边丢弃,左边补0;
int main()
{
	int a = 3;
	printf("%d\n", a >> 1);
	//0000 0000 0000 0000 0000 0000 0000 0011 - 3的内存二进制形式(正整数原反补相同)
	//0000 0000 0000 0000 0000 0000 0000 0001 - 向右移一位,最左边补零
	//结果为:1
	return 0;
}

2,<<,左移操作符(乘2效果)

  • 左边丢弃,右边补0;
//正整数
int main()
{
	int a = 3;
	printf("%d\n", a << 1);
	//0000 0000 0000 0000 0000 0000 0000 0011 - 3的内存二进制形式(正整数原反补相同)
	//0000 0000 0000 0000 0000 0000 0000 0110 - 向左移一位,最右边补零
	return 0;
}
//结果为:6


//负整数
int main()
{
	int a = -3;
	printf("%d\n", a << 1);
	//1000 0000 0000 0000 0000 0000 0000 0011 - 原码
	//1111 1111 1111 1111 1111 1111 1111 1100 - 反码(符号位不变,其余取反)
	//1111 1111 1111 1111 1111 1111 1111 1101 - 补码(反码+1),即内存中的二进制形式  
	//1111 1111 1111 1111 1111 1111 1111 1010 - 向左移一位,最右边补零
	//1111 1111 1111 1111 1111 1111 1111 1001 - -1得到补码 
	//1000 0000 0000 0000 0000 0000 0000 0110 - 符号位不变,其余取反,得到原码
	return 0;
}
//结果为:-6

注:

  • 不要移负位数;
  • 整数的二进制表示由原码、反码、补码;(-1的补码全为1);

三,位操作符(二进制位)

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

  • & 按位与,有0即为0,都为1才为1;
  • | 按位或,有1即为1,都为0才为0;
  • ^ 按位异或,相同为0,相异为1;

注:操作数必须为整数;

int main()
{
	int a = 0; //0000 0000 0000 0000 0000 0000 0000 0000
	int b = 1; //1000 0000 0000 0000 0000 0000 0000 0001
	printf("%d %d %d\n", a & a, b & b, a & b); //结果:0 1 0
	printf("%d %d %d\n", a | a, b | b, a | b); //结果:0 1 1
	printf("%d %d %d\n", a ^ a, b ^ b, a ^ b); //结果:0 0 1
}

例:点击链接

四,赋值操作符

赋值操作符 = ;

复合赋值操作符 +=,-=,*=,/=,%=, &=,|=,^=, >>=,<<=;

注:赋值,即是修改调整变量的值;

int main()
{
	int a = 0;
	int b = 0;
	a = b = 1; //可连续赋值(不推荐)
	
	a += 1; //等同于 a = a + 1;
	a -= 1; //等同于 a = a - 1;
	a *= 1; //等同于 a = a * 1;
	a /= 1; //等同于 a = a / 1;
	a %= 1; //等同于 a = a % 1;

	a &= 1; //等同于 a = a & 1;
	a |= 1; //等同于 a = a | 1;
	a ^= 1; //等同于 a = a ^ 1;

	a >>= 1; //等同于 a = a >> 1;
	a <<= 1; //等同于 a = a << 1;

	return 0;
}

五,单目操作符

  • 逻辑反 !
  • 负值 - 、正值 + 
  • 类型长度 sizeof
  • 按位取反 ~
  • 前置 ++a 、后置 a++ 
  • 强制类型转换 (类型)
  • 取地址 & 、解引用 *(NULL空指针不可解引用)

注:

  • 单目操作符,即只有一个操作数;
  • 双目操作符,即有两个操作数;
  • 三目操作符,即有三个操作数;
int main()
{
	int a = 0;
	int arr[5] = { 0 };

    //结果:20(5*4),相对于sizeof(int[5]),只统计类型所在空间字节大小
	printf("%d %d ", sizeof(arr), sizeof(int[5]));

    //结果:20,4
    printf("%d %d ", sizeof arr, sizeof arr[5]);

    //结果:4,因为sizeof括号内表达式不参与计算,只要识别a的类型即可
    //sizeof在编译时已计算,a += 1在运行时才计算的
	printf("%d ", sizeof(a += 1)); //a += 1并没有参与计算
	printf("%d ", a); //结果:0
    return 0;
}
//注:sizeof(变量)、sizeof(类型),变量时可省略括号;
//也因为sizeof(变量),括号可省略,证明sizeof是操作符不是函数;
//sizeof arr 和 &arr ,此两数组名表示整个数组;
int main()
{
	int a = 0;
	int b = ~a; //按位取反
	//0000 0000 0000 0000 0000 0000 0000 0000 - a内存二进制形式
	//1111 1111 1111 1111 1111 1111 1111 1111 - b内存二进制形式(补码,需还原为原码)
	//1111 1111 1111 1111 1111 1111 1111 1110 - 反码(补码-1)
	//1000 0000 0000 0000 0000 0000 0000 0001 - 原码(符号位不变,其余位取反)
	printf("%d ", b); //结果:-1,
    return 0;
}
//注:-1的内存补码形式全为1;
int main()
{
	int a = 10;
	int b = 10;
	int a1 = a++; //后置++,是先使用,在本身+1
	int b1 = ++b; //后置++,是先在本身+1,使用
	printf("a=%d a1=%d\n", a, a1); //结果:a=11, a1=10;
	printf("b=%d b1=%d\n", b, b1); //结果:b=11, b1=11;
    return 0;
}
//注:int b = (++a)+(++a)+(++a),此代码没有意义,在window和Linux结果是不一样的;
int main()
{
	int a = (int)3.14;
	printf("%a ", a); //结果:3;
	return 0;
}
int main()
{
	int a = 1;
	int* p = &a; //将变量a在内存中地址赋予给p(int*位指针类型)
	int b = *p; //对指针变量p的解引用可找到变量a
	printf("p=%p ", p); //结果:006FFD94 (此位十六进制格式,一个数表示4个位如f(1111))
	printf("b=%d ", b); //结果:1;
	return 0;
}

六,关系操作符

>,<,>=,<=,!=,==

注:==、=,不要写错,一个是关系操作符,一个是赋值操作符;

int main()
{
	int a = 1;
	if (1 == a) //注意书写形式
		printf("判断a是否等于1");
	return 0;
}

七,逻辑操作符

&&、||、!

注:

  • && 逻辑且,左右操作数均为真时,才为真;如第一个操作符为假,第二个操作数将不在参与计算;
  • || 逻辑或,左右操作数只要有一个为真时,即为真;如第一个操作符为真,第二个操作数将不在参与计算;
  • !逻辑非;
  • 注意与按位与&、取地址&,及按位或|的区别
int main()
{
	int a = 0;
	int b = 0;
	if (!(a && ++b))
		printf("a=%d,b=%d\n",a,b); // a=0,b=0 因为++b并未参与计算
	if (++a || ++b)
		printf("a=%d,b=%d\n", a, b); // a=1,b=0 因为++b并未参与计算
	return 0;
}

八,条件操作符

exp1? exp2: exp3

注:

  • 条件操作符,也是三目操作符;
  • exp1表达式为真执行exp2,假exp3;
  • exp2,exp3只会执行其中一个;
int main()
{
	int a = 0;
	int b = 0;
	a = (0 == a) ? ++a : ++b;
	printf("a=%d,b=%d\n", a, b); //a=1,b=0 因为++b并未参与计算
	return 0;
}

九,逗号表达式

(exp1,exp2,...,expN)

注:

  • 逗号表达式,就是用逗号隔开的多个表达式。
  • 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
int main()
{
	int a = 0;
	int b = 0;
	printf("%d", (a++, b++, a + b)); //结果:2
	return 0;
}
a = get();
count(a);

while (a > 0)
{
    //... 业务处理
    a = get();
    count(a);
}

//如果使用逗号表达式,可改写:
while (a = get(), count(a), a > 0)
{
//... 业务处理
}

十,下标引用操作符

[ ]

注:

  • 是针对数组的,即获取数组指定下标的元素值(下标从0开始);
  • 操作数:一个数组名 + 一个索引值,如arr[5],操作数为arr和5;
int main()
{
	int arr[6] = { 1,2,3,4,5,6 };
	printf("%d", arr[5]); //结果:6
	return 0;
}

十一,函数调用操作符

()

注:

  • 是函数的,即调用指定的函数;
  • 操作数可以一个或多个;第一个操作数是函数名,剩余的操作数就是传递给函数参数;
#include <stdio.h>

void print1()
{
	printf("hehe\n");
}

void print2(char* str)
{
	printf("%s\n", str);
}

int add(int x, int y)
{
	return x + y;
}

int main()
{
	print1(); //只有一个操作数print1
	print2("C"); //有两个操作数print1和"C"
	printf("%d\n", add(2, 3)); //有三个操作数add、2和3
	return 0;
}

十二,结构成员

.  、->

. 注:

  • 均是访问结构体成员的,结构体.成员名 、 结构体指针->成员名;
int main()
{
	struct stu s = { "zhangsan",20,90.5 }; //初始化结构体变量s
	struct stu* p = &s; //取地址
	printf("%s\n", s.name); //结果:zhangsan
	printf("%s\n", p->name); //结果:zhangsan
}

ArcMap|时空地理加权回归(GTWR) ArcGIS的GTWR插件下载地址:https://www.researchgate.net/publication/329518786_GTWR_ADDIN_Valid_till_Dec_31_2022 更详细的操作参考: https://www.bilibili.com/video/BV1fR4y1M7xB?spm_id_from=333.999.0.0 https://blog.youkuaiyun.com/weixin_40008135/article/details/112693520 双击“GTWR_Be 阅读详情

相关推荐

FreeSurfer安装避坑指南:从邮箱选择到环境变量设置的全流程解析

本文详细解析了在Windows系统上安装和配置FreeSurfer神经影像分析工具的全流程避坑指南。重点涵盖WSL2深度配置、软件版本选择、许可邮箱获取策略、环境变量模块化设置以及图形界面调试等关键步骤,帮助用户高效构建稳定的分析环境,避免常见安装陷阱。

weixin_29243063的博客 229

完全自学C(干货) —— 操作符(二)

操作符的优先级和结合性,整型提升、算术转换;

NapoleonCoder的博客 348

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

kercii的博客 1万+

【C语言】C语言零基础纯干货教学(中)

小白的保姆级入门教程~

s_little_monster的博客 10万+

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 775

从ORCAP-1589警告看Cadence ORCAD的DRC设置:如何避免‘网络别名’引发的潜在短路风险

本文深入解析Cadence ORCAD中ORCAP-1589警告的深层含义,探讨网络别名可能引发的短路风险及DRC设置优化方案。通过分析网络别名的设计意图、DRC规则配置及最佳实践,帮助工程师有效规避设计风险,提升电路设计的可靠性和规范性。

weixin_34194829的博客 297

完全自学C(干货) —— 数组

一组相同类型元素的集合,可存储一系列相同类型的数据;

NapoleonCoder的博客 1153

Zephyr,设备树概述

Zephyr使用设备树(DTS)描述硬件配置,通过设备树源码和绑定文件生成C头文件供开发使用。设备树采用树状结构,节点对应硬件设备,属性描述硬件特性。示例展示了I2C总线及其外设的节点层级关系,包括单元地址、兼容性标识等关键属性。构建系统将设备树转换为devicetree.h中的宏,使开发者能通过DT_前缀宏访问硬件信息,同时保留Kconfig覆盖默认值的能力。

汽车电子软件领域知识分享 722

完全自学C(干货) —— 预处理详解

预处理;

NapoleonCoder的博客 941

RK3588与FPGA高速PCIe通信:从理论带宽到实战优化的全流程解析

本文深入解析了瑞芯微RK3588与FPGA之间基于PCIe Gen2的高速通信全流程。从理论带宽计算(约1640MB/s)出发,详细拆解了硬件连接、驱动加载、DMA配置等关键步骤,并重点分享了中断优化、内存管理及高级调优等实战技巧,旨在帮助开发者从“跑通”到“跑好”,实现接近理论极限的稳定高效数据传输。

weixin_29175469的博客 332

基于Lstm+transformer的刀具磨损预测实战

基于Lstm+transformer的刀具磨损预测实战

2906

0基础C保姆自学 第二节——初步认识C语言的全部知识框架

在看本章节前,请确保已经掌握了第一节的内容呦。不懂的欢迎在评论区留言~~~~ 本节定位:初步了解认识一下C中的知识,所有的知识都是点到为止。目的是在接下来章节的介绍中笔者的举例读者可以更好的接受。比如在函数的介绍中我们会用到指针。 所有的知识点我们会在接下来的章节一一详细介绍,读者在阅读本章的时候,只需要知道有这么个东西,并且能够理解笔者所说的含义即可。 本节我们将沿着上一节介绍: 本节内容有: 数据类型; 常量和变量; 字符串; 转义字符; 代码注释; 数组; 函数; 选择语句;

jxwd的博客 1万+

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

锂电池剩余使用寿命预测(RUL) | 基于Stacked-LSTM-Autoencoder的锂电池寿命多变量多步预测(Tensorflow)

前程算法屋的博客 851

完全自学C(干货) —— 指针初识

指针即内存地址(编号);

NapoleonCoder的博客 356

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C自学之路1——干货!C中运算符优先级的实操!

干货!C中运算符优先级的实操! 这是我的第一个博客,在我初中一次意外接触到编程后,便一发不可收拾,然而业精于勤荒于嬉,贪玩的我到最后一无所有,被这残酷的现实压垮;就又准备抄老底了嘿嘿嘿嘿。 我会从现在开始慢慢记录我学习的每一步…哦也慢不得,时间不等人呀!开始吧。 -------------------一条没有感情的分割线------------------- 今天主要探讨C语言学习过程中一直没搞明...

白告月当空照的博客 330

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

完全复制一个dict_Python3 自学第7天:字典dict

前面我们了解了列表list和元组tuple两个序列,是存储不同类型数据的容器。对列表和元组不清楚的朋友可以了解下这两篇文章:《Python3 自学第5天:列表list》《Python3 自学第6天:元组tuple》今天我们了解下另外一种容器类型:字典dict,它可以存储任意类型的对象。字典dict定义,它里面的元素是“健值对”形式,包裹在花括号{ }里面,用冒号(:)将键key与值value隔开;...

weixin_42377695的博客 265

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python大纲图_干货!!python自学大纲!

上期看到一个读者留言到:看了那么多期文章,看着视频去写代码没问题,但是脱离视频和文章就不会了,通过了解这位读者的基本功不扎实,概念模拟两可。小编在此不禁感叹道! 相信大多数python初学者对学习的方向模糊不清,一开始是吗都去接触,总想着一步就想达到想讲解这一样在pycharm里各种写代码,但却忘记里基本功这一基石,到自己写代码的时候对概念模拟两可;今天的内容就是给大家介绍python的基石以及学...

weixin_32312889的博客 371

134安装教程_从没有接触过编程的人怎样从头开始自学编程,给大家一些学习Python的建议和教程!...

从没有接触过编程的人怎样从头开始自学编程?分享自学建议和方法如果你选择了自学Python那么,我想给你提几点建议:1,找显而易懂,完整的比较好的教程,从头到尾看下去。不要看很多教程,专注于一套教程。把里面的例程都手打一遍,搞懂为什么。2,去找实际的项目去练手。最好是要有真实的项目做。可以多找几个志同道合的小伙伴,一起做个网站之类的。3,找到一个已经学会了Python的人。多问问他的学习规划和建议,...

weixin_39801165的博客 183

干货转载

干货地址:http://blog.youkuaiyun.com/wufeng55/article/details/74165021 干货内容列表 App 系列(高仿、练手等) SmartRecom:一款干货满满,助你进阶的 App 项目 Android 仿今日头条的开源项目 手把手教你从零开始做一个好看的 APP KeepGank.IO - 又一款开源 Gank.IO 客户

aidou1314的博客 471

Android开发新手入门教程,【干货

一、设计思想与代码质量优化二、程序性能优化三、开发效率优化。

2401_84408404的博客 2411

0基础C语言自学保姆教程——第十一节 自定义类型(结构体、枚举、位段、联合)与预处理指令(#define、#include等)

1、结构体: 1-1结构的概念: 1-2 结构的声明: 1-3 结构体的实例化和访问: 1-4 "特殊"的声明方式 1-5 结构体的自引用 1-6 结构体内存对齐 1-7 修改默认对齐数 1-8 结构体传参 2、枚举 2-1 枚举的概念 2-2 枚举的优点(供参考) 3、位段: 3-1 位段的大小 4、联合 4-1 联合概念 4-2 联合大小的计算 5、预处理指令 5-1 预定义符号 5-2 #define 5-2-1 #define定义标识符 5-2-2 #de

jxwd的博客 963

PostgreSQL 9,2024年最新干货满满

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面

2401_84281693的博客 703

python 如何修改字典的key值_Python3 自学第7天:字典dict

前面我们了解了列表list和元组tuple两个序列,是存储不同类型数据的容器。对列表和元组不清楚的朋友可以了解下这两篇文章:《Python3 自学第5天:列表list》《Python3 自学第6天:元组tuple》今天我们了解下另外一种容器类型:字典dict,它可以存储任意类型的对象。字典dict定义,它里面的元素是“健值对”形式,包裹在花括号{ }里面,用冒号(:)将键key与值value隔开;...

weixin_39867208的博客 1137

C# list删除 另外list里面的元素_Python3 自学第5天:列表list

在开始之前我们先了解一下序列(sequence):序列中的元素都是有序的,其实在前面“极客干货”已经分享过一种序列了,那就是字符串《Python3 自学第4天:字符串》Python总共有6个内置的序列,即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象。序列的操作包括:索引、长度、切片、遍历、组合(序列相加)、检查成员、重复(乘法)、最小值和最大值。今天我们了解下数...

weixin_39797532的博客 149

安卓开发自学!腾讯,字节等大厂面试真题汇总,小白也能看明白

前言 我最近在筹备Android面试的相关文章,我发现,Framework是一个十分重要的点,被不少大厂所看重。 如图,这是我们的一个技术交流群里面的对话↓↓↓ 前阵子我写的Android技术文里面,关于Framework这个知识点的文阅读量破千,但是,有很多朋友私信我说那篇文写的不够详细,文章深度不够,学不到什么东西。 感受到了大家对这个知识点的热情,我最近也一直在留意这个方面的知识。 不久前,一个腾讯的朋友说他们那里有一个T4的大佬每天熬夜到凌晨,肝了半个月,把Android Framework 内核

chayel123的博客 269

134安装教程_自学Python拼尽全力,换得一个未来的美好生活,给大家一些学习Python的建议和教程!...

如果你选择了自学Python那么,我想给你提几点建议:1,找显而易懂,完整的比较好的教程,从头到尾看下去。不要看很多教程,专注于一套教程。把里面的例程都手打一遍,搞懂为什么。2,去找实际的项目去练手。最好是要有真实的项目做。可以多找几个志同道合的小伙伴,一起做个网站之类的。3,找到一个已经学会了Python的人。多问问他的学习规划和建议,然后再遇到卡壳的地方找他请教。这样的话学习成功的话会事半功倍...

weixin_39970689的博客 149
上一篇: 完全自学C(干货) —— 选择、循环结构
下一篇: 完全自学C(干货) —— 操作符(二)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值