c语言操作符(上)

news2024/12/23 18:56:07

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言初阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:
讲解c语言中有关操作符的知识.
金句分享:
最慢的步伐不是跬步,而是徘徊;最快的脚步不是冲刺,而是坚持!

目录

  • 前言
  • 一、算术操作符
  • 二、移位操作符
    • (1) 左移操作符('<<')
      • 左移正数:
      • 左移负数:
    • (2) 右移操作符('>>')
      • 右移正数
  • 三、位操作符
  • 四、赋值操作符
  • 五、单目操作符
    • (1) '!' (逻辑反操作):
    • (2)'&' (取地址操作符)
    • (3)sizeof()操作符与数组的联系
    • (4)' ~ ' (按位取反操作符)
    • (5)前置++和后置++操作符

一、算术操作符

算术操作符是最常见的,包括:

‘+’(加) ‘-’(减) ‘*’(乘) ‘/’(除) ‘%’(取余)

其中重点提一下‘/’(除)‘%’(取余)操作符 ,其它3个太简单就不介绍了,相信大家都懂.

(1) .’ / '(除)操作符的除数(除号后面的数)不能为0,否则编译器会报错,毕竟这样不符合数学的规则了.电脑表示它不会算除数为0.😂

//除数b为0时会报错
#include <stdio.h>
int main()
{
	int a = 4, b = 0;
	int c = a / b;
	printf("%d", c);
	return 0;
}

(2).相除的结果是和数学中的一样吗?

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

结果:

c=2
d=3

分析:c语言中的除法操作符结果只保留整数部分,而余数可以通过‘’%'(取余)操作符得到,这里11/4=2余3,所以有了上面的结果.
注意:!!!
除了‘’%‘(取余)操作符以外,其它操作符都可以用于浮点型., ’‘%’(取余)操作符的左右两个操作数必须为整数。返回的是整除之后的余数。

二、移位操作符

移位操作符的作用是什么呢?
其实"位"是指二进制位,所以移位操作符是指移动一个数的二进制位.
注意:!!!
移位操作符的操作数只能是整数。
说到二进制位,这就不得不提到二进制的三种形式

  • 原码
  • 反码
  • 补码

如果有不了解的小伙伴可以点击下面的传送门

(1) 左移操作符(‘<<’)

左移操作符即将操作数的二进制位向左移动
移动规则:

左边抛弃、右边补0(例题后面有效果图)

左移正数:

例如:将整形6左移两位

#include <stdio.h>
int main()
{
	int a = 6;
	printf("%d\n", a << 2);//将操作数a的二进制位向左移动两位
	printf("%d", a);//观察一下a本身的变化
	return 0;
}

运行结果:

24
6

结果分析:

将整形6左移两位后,得到的新的二进制序列表示的结果是:
0000 0000 0000 0000 0000 0000 0001 1000=24(十进制)
但是整形a的值并没有改变因为位移操作符并没有重新赋值,就如同:

printf("%d", -a);//打印结果虽然是-6,但是a本身的值并没有改变,还是6.

左移负数:

例如:将整形-6左移两位

#include <stdio.h>
int main()
{
	int a = -6;
	printf("%d\n", a << 2);//将操作数a的二进制位向左移动两位
	printf("%d", a);//观察一下a本身的变化
	return 0;
}

运行结果:

-24
-6

效果分析图:

通过上述示例,2我们不难发现,一般情况下,左移有翻倍的效果,左移一位的结果是原来的二倍,左移两位是原来的四倍.

(2) 右移操作符(‘>>’)

右移操作符即将操作数的二进制位向右移动
移位规则:
首先右移运算分两种:

  1. 逻辑移位
    左边用0填充,右边丢弃
  2. 算术移位(一般使用这个)
    左边用原该值的符号位填充,右边丢弃

右移正数

示例:

#include <stdio.h>
int main()
{
	int a = 10;
	printf("%d\n", a >> 1);//将操作数a的二进制位向右移动一位
	printf("%d", a);//观察一下a本身的变化
	return 0;
}

通过上面学习了操作符左移,那正数的操作符右移应该不难吧。试着猜一下结果吧。

运行结果;

5
10

这里采用的是算术右移,补位为符号位0.

右移负数:

#include <stdio.h>
int main()
{
	int a = -10;
	printf("%d\n", a >> 1);//将操作数a的二进制位向右移动一位
	printf("%d", a);//观察一下a本身的变化
	return 0;
}
-5
-10

这里采用的是算术右移,补位为符号位1.这里可以看出逻辑右移算术右移的区别,如果采用逻辑右移,那么符号位补的就是0,负数就会变成正数,一般我们编译器采用的是算术右移.即左边抛弃,右边补符号位

总结:
左移有翻倍的效果,因为从效果图中可以看出,向左移动,数据位1代表的权重就会增加一倍,同样右移会减少到原来的二分之一.
注意:!!!

**其一:无论是左移还是右移,移动的位数不要太过火了,移动33位或者更多电脑表示无能为力
其二: 移动的位数不要是负数,否则是不是太奇怪了?
例如:<<-3是表示右移3位吗?并没有这种表示方法.**不要破坏规则哦.

三、位操作符

位操作符的分类:

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

注意:!!!
他们的操作数必须是整数。
同样这里的位也是指二进制位.
1)& (按位与操作符):只有两边的操作数都为真的时候才为真,否则都为假.
2)’ | '(按位或操作符):只要一边为真则为真.
3)’ ^ '(按位异或操作符):相同为假,相异为真.

我要晕了😂,其实二进制只有0和1,咱只需要知道:
1)& (按位与操作符):只有都为1时才是1,其它都为0.
2)’ | '(按位或操作符):只要有1就是1,除非你都是0.
3)’ ^ '(按位异或操作符):相同(同0或同1)则就是0,不同就是1.

试着读代码算出结果吧!

#include <stdio.h>
int main()
{
	int x = 78, y = 23;
	int a = x & y;
	int b = x | y;
	int c = x ^ y;
	printf("a=%d\nb=%d\nc=%d", a, b, c);
	return 0;
}

运行结果:

a=6
b=95
c=89

学会位操作符和移位操作符后,试着练习一下两道经典的题目吧!
小试牛刀

四、赋值操作符

赋值操作符并没有什么要讲解的,一句话:你让我不满意,我就换了你!
讲两点要注意的内容吧
1)连续赋值容易使人误解,建议分开赋值.

#include <stdio.h>
int main()
{
	int a = 0, b = 0,c=0;
	a=3,b = 4;
	c = a = b + 1;//连续赋值
	printf("%d %d %d", a, b, c);
	
	
	
	
	
	//建议写成如下形式:
	a = b + 1;
	c = a;
	return 0;
}

2)可以使用复合赋值符,简化赋值的代码量.

#include <stdio.h>
int main()
{
	int a = 2, b = 3;
	a += b;//等价于a=a+b
	a -= b;//等价于a=a-b
	a *= b;//等价于a=a*b
	a /= b;//...
	a %= b;
	a >>= b;
	a <<= b;
	a &= b;
	a |= b;
	a ^= b;
	return 0;
}

五、单目操作符

单目运算符;单目操作符的意思是操作数只有一个

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

(1) ‘!’ (逻辑反操作):

将逻辑结果取反,即真的变为假的,假的变为真的.
在c语言中,逻辑假用0表示,非0位真.

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

(2)‘&’ (取地址操作符)

‘&’ (取地址操作符):用于得到变量,数组等的地址.
在C语言中,变量,常量字符串,数组,结构体包括指针等在内存中都是有地址的,需要在内存中分配一块空间来存储这些值,而内存的编号就是内存地址.
但是字面常量(如常数 6)在内存中是没有地址的,因为它本身并不需要在保存下来.

(3)sizeof()操作符与数组的联系

sizeof()用于计算操作数所占空间大小,单位是字节,可以以类型、指针、数组和函数等作为参数。
返回值类型为unsigned int

 #include <stdio.h>
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));
}
void test2(char arr[])
{
	printf("%d\n", sizeof(arr));
}
void test3(float arr[])
{
	printf("%d\n", sizeof(arr));
}
void test4(double arr[])
{
	printf("%d\n", sizeof(arr));
}
int main()
{
	int arr1[10] = { 0 };
	char arr2[10] = { 0 };
	float arr3[10] = { 0 };
	double arr4[10] = { 0 };
	printf("%d\n", sizeof(arr1));
	printf("%d\n", sizeof(arr2));
	printf("%d\n", sizeof(arr3));
	printf("%d\n", sizeof(arr4));
	test1(arr1);
	test2(arr2);
	test3(arr3);
	test4(arr4);
	return 0;
}

结果分析:
我们知道,在数据类型篇已经了解c语言中各数据类型占用多少字节.
所以当sizeof(数组名)操作符在计算不同类型的数组的时候.得到的结果不同,为相应数组中元素总和所占用的字节数.
当我们在数组传参时,传的是数组首元素的地址,而计算地址的大小只有两种结果

32位机器是4字节
64位机器是8字节

运行结果:

40
10
40
80
8
8
8
8

&数组名:这里的数组名表示的是整个数组,即这里取的是整个数组的地址

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("&arr=%p\n",&arr) ;
	printf("&arr+1=%p\n", & arr + 1); 
	printf("arr=%p\n", arr);
	printf("arr+1= %p\n", arr + 1);
	return 0;
}

细节来了:

#include <stdio.h>
int main()
{
	char a = 2;
	int b = 3;
	printf("%d\n", sizeof(a = b + 3));
	printf("%d\n", a);
	return 0;
}

试着猜一下结果吧,不一定猜得到哦!

运行结果:

1
2

结果分析,sizeof()操作符括号里面的表达式是不进行计算的.所以a=b+3是没有执行的.这是因为sizeof()操作符在编译过程中就已经完成了,而计算需要在运行过程中完成,当运行时,这里已经是sizeof(a)的结果2了.并没有计算.

总结:
数组名一般表示的是数组首元素的地址,但有两个情况是例外的!

1.sizeof(数组名)——这里数组名表示的是整个数组,用于计算整个数组所占空间的大小
2.&数组名-----这里的数组名表示的是整个数组,即这里取的是整个数组的地址
数组+1:
1.数组的地址----以整个数组的大小为整体,+1就是跳过整个数组
2.数组首元素的地址-----数组第一个元素的地址,+1就是下一个元素的地址
数组传参传的是数组首元素的地址----计算地址的大小,32位机器是4,64位机器是8

(4)’ ~ ’ (按位取反操作符)

顾名思义,就是将操作数的二进制位按位取反.
例如:

#include <stdio.h>
int main()
{
	int a = 7;
	
	printf("%d", ~7);
	return 0;
}

(5)前置++和后置++操作符

前置++:操作数先自增(+1),后再被使用.
后置++:操作数先被使用,后自增(+1).
🌰上栗子

#include <stdio.h>
int main()
{
	int a = 5, c = 0;
	//前置++
	c = ++a;//先a自增1使得a的值变为6,然后再被赋值到c.
	printf("%d\n", c);//6
	printf("%d\n", a);//6


	//后置++
	a = 5, c = 0;
	c = a++;//先使a被赋值到c,此时a=5,赋值完成后,a再自增1,变为6.
	printf("%d\n", c);//5
	printf("%d\n", a);//6
	return 0;
}

试着看两段代码练练手吧!
代码1:

#include <stdio.h>
int main()
{
	int i = 0;
	while (i++ < 5)
	{
		printf("%d ", i);
	}
	return 0;
}

代码2:

#include <stdio.h>
int main()
{
	int i = 0;
	while (++i < 5)
	{
		printf("%d ", i);
	}
	return 0;
}

好了,今天操作符的内容就分享到这里了,希望对大家有所帮助,剩余没讲的操作符下一篇会介绍的,持续关注牛牛哦!
最后,小伙伴们的点赞就是给牛牛最大的支持,能不能给牛牛来一个一键三连呢?谢谢支持。

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

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

相关文章

Python读取sqlite3数据库中的数据

文章目录1. 简介1.1. 使用1.1.1. 创建1.1.2. 插入1.1.2.1. 插入一条数据1.1.3. 查询1.1.3.1. 查询所有数据查询一条数据1.1.3.2. 读取特定位置的数据1.1.4. 修改数据1.1.5. 删除数据1. 简介 从Python3.x版本开始&#xff0c;在标准库中已经内置了SQLlite3模块&#xff0c;它可…

Redis中的哨兵机制

有了主从复制的实现以后,我们如果想对主从服务器进行监控,那么在redis2.6以后提供了一个 “哨兵” 的机制,在2.6版本中的哨兵为1.0版本,并不稳定,会出现各种各样的向题,在2.8以后的版本哨兵功能才稳定起来。 顾名思义,哨兵的含义就是监控Redis系统的运行状况。其主要功…

STM32/51单片机实训day6——Proteus8.6版本+ STM32F103驱动LCD12864显示Keil5程序设计

内 容&#xff1a;实现LCD显示 学 时&#xff1a;4学时 知识点&#xff1a;LCD12864芯片介绍&#xff0c;读写操作时序&#xff0c;电路设计 重点&#xff1a; 读写操作时序 难点&#xff1a;读写操作时序 时间&#xff1a;2022年12月26日 9:00&#xff5e;11:50 总结&…

全国产龙芯2K0500多功能SoC处理器及其解决方案

龙芯2K0500片内集成单个64位龙架构(LoongArch)LA264处理器核、32KB一级指令缓存、32KB一级数据缓存、512KB二级缓存、32位DDR2/3-1066控制器、2DGPU图形核心、DVO显示接口、两路PCIe2.0、两路SATA2.0、四路USB2.0、一路USB3.0、两路GMAC、PCI总线、彩色黑白打印接口、HDA及其他…

有备无患!DBS高性价比方案助力富途证券备份上云

“某中心受病毒攻击&#xff0c;导致服务中断&#xff0c;线上业务被迫暂停” “某公司员工误操作删库&#xff0c;核心业务数据部分丢失&#xff0c;无法完全找回” “由于服务器断线&#xff0c;某医院信息系统瘫痪近4小时&#xff0c;期间病人无法使用医保卡挂号和结算” …

Talk预告 | 微软高级研究员杨征元:统一的视觉语言模型

本期为TechBeat人工智能社区第467期线上Talk&#xff01; 北京时间12月29日(周四)20:00&#xff0c;微软高级研究员——杨征元的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “统一的视觉语言模型”&#xff0c;届时将从一个统一的角度概述视觉语…

深度循环神经网络

在深度循环神经网络中&#xff0c;隐状态的信息被传递到当前层的下一时间步和下一层的当前时间步。 有许多不同风格的深度循环神经网络&#xff0c; 如长短期记忆网络、门控循环单元、或经典循环神经网络。 这些模型在深度学习框架的高级API中都有涵盖。 总体而言&#xff0c…

第三方库react-redux基础使用 容器UI组件使用 数据管理优化

其实redux并不是React特有的技术 redux是一家独立公司 做出来 适配与目前几大前端主流框架的状态管理工具。 其实 最初 redux也希望码友们用它来管理vue的状态数据 但后面 React官方发现 很多人喜欢在React项目中使用redux 于是 React公司专门做了react-redux这个第三方的库 帮…

【计组】数据通路和流水线设计--《深入浅出计算机组成原理》(三)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 目录 一、建立数据通路 &#xff08;一&#xff09;组合逻辑电路 1、指令周期 2、数据通路 3、CPU所需硬件电路 &#xff08;二&#xff09;时序逻辑电路 1、时序逻辑电路可以解决的问题 二…

Python爬虫进行正则数据解析实战

今天继续给大家介绍Python爬虫相关知识&#xff0c;本文主要内容是Python爬虫进行正则数据解析实战。 一、需求分析 今天&#xff0c;我们尝试使用re正则表达式来对爬取到的页面进行数据解析。需求如下&#xff1a; 针对网页&#xff1a;https://blog.csdn.net/weixin_402282…

第三十二章 数论——组合数详解(1)

第三十二章 数论——组合数的多种求法一、数学基础二、组合数——递推公式1、题目2、思路3、代码三、组合数——快速幂1、问题&#xff1a;2、分析一、数学基础 组合数来自于高中排列组合的知识&#xff1a; 我们从aaa个小球中随机一次性取出bbb个&#xff0c;所有的取法记作…

Numpy学习记录

numpy.ma.ravel 返回一个连续的扁平数组。 参考&#xff1a; numpy中的ravel()方法使用介绍https://blog.csdn.net/weixin_44025103/article/details/125062287 Python numpy.ravel函数方法的使用https://www.cjavapy.com/article/870/ numpy.meshgrid 二维坐标系中,X轴…

图片如何批量重命名?一步一步教会你

爱拍照的小伙伴应该都知道&#xff0c;无论是手机还是相机拍出来的照片&#xff0c;导入电脑后&#xff0c;它的默认名称都是一串长长的字符。不仅让桌面看起来杂乱无章&#xff0c;还会给我们在查找图片时带来诸多的不便。其实我们可以通过软件对这些图片进行批量重命名的&…

线性代数基础----矩阵

秩的理解: 举证的秩的理解: 特征值和特征向量 线性相关和线性无关 向量的拉伸和旋转: 特征值和特征向量: 特征值: 特征向量: 用来描述矩阵的信息 特征向量 和 特征值之间的关系 拳击:方向和力量 特征值和特征向量的物理意义: 表示相关的重要性 特征值和特征向量:进行提…

阳了在家没事干?教大家用python在家做一个万能看视频软件,绝对正经啦~

嗨害大家好鸭&#xff01;我是小熊猫~ 我前阵子不小心阳了&#xff0c;该说不说&#xff0c;真挺难受的 我在家真的就是纸巾热水不离手&#xff0c; 楼下水果店老板娘还说我年轻人身体怎么这么差… 哼我阳过之后我就锻炼去&#xff01;&#xff01;&#xff01; 效果展示 有…

如何删除掉设备和驱动器下百度网盘的图标

电脑安装百度网盘后&#xff0c;在设备和驱动器这里会有百度网盘的图标&#xff0c;如下图所示。 对有强迫症的人来说&#xff0c;这很难受&#xff0c;就一定要想办法删除掉该图标&#xff0c;那么具体怎么操作呢&#xff1f; 你如果在设备和驱动器下右击百度网盘&#xff0c…

12月小报|读小报,涨知识

本期知识小集的主要内容包括&#xff1a;• Flutter桥调用请注意结果反馈• Flutter await代码带来的潜在并发• Flutter FPS 高不代表一定流畅• Flutter新渲染引擎impeller尝鲜Flutter桥调用请注意结果反馈通过桥来拓展Flutter的能力&#xff0c;是非常通用的Flutter开发场景…

Weda创建视图表格

这边我们先创建一个数据集。 在更多操作里面分布这个数据集。 点击编辑&#xff0c;选择视图配置。 在下面这个界面&#xff0c;新建视图。 在操作里面&#xff0c;点击更多&#xff0c;发布这个视图。 我们点击编辑设置视图的第一行&#xff08;表列设置&#xff09;。 点击…

马上又是新的一年了 “跨年倒计时”送给大家

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;跨年倒计时 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光的…

pytorch 深度学习

第二章 回归问题 即使是最简单的线性回归,由于观测误差的存在,也不可能找到一个满足所有样本的函数。因此,我们退而求其次,寻找到一个满足大部分样本点的直线。那么如何衡量这个呢,我们可以求出所有样本点真实值和预测值的误差,满足总误差最小的就是最好的。 连续值…