初阶C语言——详解操作符(1)

news2024/11/27 14:36:15

Hello,我们又见面了,最近不知道大家是否在持续输出代码呢?代码能力是否提高了呢?今天让我们来一起学习操作符,操作符在我们学习语言中很重要,我们要知道每个操作符的作用和用法,下面开始我们的学习。

  1. 操作符分类:

算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

2算数操作符

     +    -   *   /     %

加(+) 减(-) 乘(*)和数学的一样,和大家讲一讲除(/)和取模(%)的用法。

#include<stdio.h>
int main()
{
	float a = 5 / 2;
	printf("%f", a);
	return 0;
}

在这里插入图片描述
我们可以看到虽然是浮点型,但是求出来的不是我们想要结果,这是为什么呢

原因是我们要求小数点的后面位的时候,5和2必须要有一个小数,比如5.0或者2.0,让我们加上看一看结果吧

#include<stdio.h>
int main()
{
	float a = 5 .0/ 2;
	printf("%f", a);
	return 0;
}

在这里插入图片描述
还有我们的取模符号

首先取模符号左边和右边必须是整型,结果是余数

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

这样写就对了

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

3. 移位操作符

在讲位移操作符的时候我们得先了解一个东西,那就是二进制,因为我们的移位操作符操作的是二进制的补码

我们的整数是可以用二进制来表示的,整数的二进制有三种表达形式,分别是
原码
反码
补码
其中正数的二进制,反码补码原码都相等,但是负数的不相等
负整数数的反码是原码符号位不变,其余按位取反,补码是反码加1

下面举几个例子来让大家更好的了解二进制

大家可能对二进制的计算不是特别明白,但是大家肯定知道十进制,十进制就是我们生活中常用的数字,满十进一位,就像9到10一样,那我们的二进制也是一样,满2就往前进一位,比如111就是十进制的7
在这里插入图片描述
计算结果就是我们常用的十进制

我们简单了解二级制位,那么让我们来看一看原码反码补码
在这里插入图片描述
正整数的原码反码补码是一样的,比如5的原码是

00000000000000000000000000000101 原码
00000000000000000000000000000101 反码
00000000000000000000000000000101 补码

而我们的位移操作符是对二进制的补码进行操作的
左移操作符<<

#include<stdio.h>
int main()
{
	int a = 5<<1;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

学会正整数的左移操作符,让我们来学习一下负数的吧

#include<stdio.h>
int main()
{
	int a = -5 << 1;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
这样解释大家一定明白了吧,所以左移的规则是右边舍弃,左边加0。
右移操作符>>
右边操作符和左移也差不多

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

下面举个例子

#include<stdio.h>
int main()
{
	int a = 5 >> 1;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
算数移位的右边是加符号位

补充:补码变成反码也可以先取反然后加1,符号位不变

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

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

4. 位操作符

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

首先他们操作的都是整数

  • 按位与&
#include<stdio.h>
int main()
{
	int a = 5 & 3;

	printf("%d", a);
	return 0;
}

在这里插入图片描述
这里的按位与我们可以这样理解,首先我们要把他们的二进制位都写出来,就像上面的一样然后对齐,有一个0的结果就是0,全部为1的才是1。

  • 按位或|
#include<stdio.h>
int main()
{
	int a = -1|3;

	printf("%d", a);
	return 0;
}

在这里插入图片描述

所以按位或是有一个1就是1

  • 按位异或
#include<stdio.h>
int main()
{
	int a = -1^3;

	printf("%d", a);
	return 0;
}

在这里插入图片描述

这样我们就位操作符讲明白了,在给大家补充一点,这些操作符都是双目操作符,什么是双目操作符呢,比如3&5,&两边的操作数分别是3和5,那么&就是双目操作符,大家看到&是不是会想到取地址符号,当然他们肯定是不同的,取地址&是个单目操作符

下面是一个笔试题,不能创建临时变量(第三个临时变量)来交换数

#include<stdio.h>
int main()

{
	int a = 20;
	int b = 10;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("%d %d", a, b);
	return 0;
}

5. 赋值操作符

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;
这样的写法是不是更加清晰爽朗而且易于调试。

所以我们在给我们的变量赋值的时候一定要看起来至少能让人明白a = x = y+1像这个代码的话先把y+1赋值给x在赋值给y,这样的可读性并没有分开赋值看起来的明白
复合赋值符
在这里插入图片描述
6. 单目操作符
在这里插入图片描述

逻辑反操作

相当于把真变成假,把假变成真比如我的if函数中if(1)就是真,但是我们如果加上!就变成if(!1)就是逻辑假

负值和正值
插入一个代码大家马上就能理解

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

编译器显示的答案就是4
正值就和我们的正数一样

  • . 取地址&

就是取出该变量在我们内存的位置

  • sizeof
#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;
}

在X86编译器下地址的字节是4位,在64位的平台下,字节大小是8位

sizeof中最难的就是和数组组合,因为大家可能总是会有一个误解,举个例子给大家。

#include <stdio.h>
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
	printf("%d\n", sizeof(ch));//(4)
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%d\n", sizeof(arr));//(1)
	printf("%d\n", sizeof(ch));//(3)
	test1(arr);
	test2(ch);
	return 0;
}
//问:
//(1)、(2)两个地方分别输出多少?
//(3)、(4)两个地方分别输出多少?

在这里插入图片描述
只要大家知道函数在传数组的时候传过去的首元素的地址,相信大家应该就能理解了,之前的文章也专门讲过,不会的往前看看就行了。

  • ~
    是按位取反,相当于把一个二进制数1的部分变成0,0的部分变成1
#include<stdio.h>
int main()
{
	int a = 2;
	printf("%d", ~a);
	return 0;
}

在这里插入图片描述

- 前置++和–
先++或者–然后再使用

#include<stdio.h>
int main()
{

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

	int a = 1;
	int b = --a;//a=a-1 b=a
	printf("%d %d", a, b);
	return 0;
}

后置++和–


#include<stdio.h>
int main()
{

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

	int a = 1;
	int b = a--;//b=a a=a-1
	printf("%d %d", a, b);
	return 0;
}

解引用操作符*

一般用在指针,比如想知道指针变量的内容的时候我们就可以用*来知道他的内容,大家是不是可以发现他和&取地址刚刚好相反

()这个符号是强制转换,举个简单的例子


#include<stdio.h>
int main()
{
	float a = 5.0;
	int c = (int)a / 2;
	printf("%d", c);
	return 0;
}

虽然是浮点型,但是经过我们的强制转换,最后a是一个整型

  • 7. 关系操作符
    在这里插入图片描述

警告:一定要区分==和=
今天的分享就到这里,期待下次和你们见面

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

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

相关文章

yaml语言入门(YAML Ain‘t Markup Language)

文章目录 YAML为什么YAML强调自己不是一种标记语言&#xff1f;YAML文件与HTML、XML、JSON标记语言的异同 YAML的基本语法代码示例python解析yaml示例示例1示例2 python组包yaml示例 其他问题yaml中的引用的作用和用法 YAML YAML&#xff08;YAML Ain’t Markup Language 强调…

【Spring boot+VUE2+Android 7.1】智慧校园源码

一、智慧校园实现了智慧校园基础数据的统一管理&#xff0c;通过此平台提供教师基础信息管理、学生基础信息管理、用户认证管理、权限管理、资源管理、应用管理、第三方应用接入等基础功能与服务。 二、源码包含&#xff1a;电子班牌管理系统、成绩管理系统、考勤人脸刷卡管理系…

小马识途谈人物百科创建流程和技巧

百度百科通过搜集、整理和展示各种知识和信息&#xff0c;为人们提供了一个方便的查找和了解世界的平台。它的价值在于帮助人们获取知识和信息&#xff0c;并促进了知识的传播和共享。此外&#xff0c;百度百科还为学者、研究人员、教育工作者和一般公众提供了一个交流和分享知…

移动硬盘怎么加密?移动硬盘设置密码的方法

在工作中&#xff0c;我们经常需要使用移动硬盘来储存大量重要数据&#xff0c;而为了保护数据安全&#xff0c;我们则需要采用加密的方法来保护移动硬盘的安全。那么移动硬盘该怎么加密呢&#xff1f;下面我们就来了解两种移动硬盘加密的方法。 常规方法 我们可以使用BitLock…

计算机网络期末复习题(华南理工mooc习题及解答)

目录 &#x1f389;第一章 概述&#x1f389; &#x1f389;第二章 物理层&#x1f389; &#x1f389;第三章 数据链路层&#x1f389; &#x1f389;第四章 网络层&#x1f389; &#x1f389;第五章 运输层&#x1f389; &#x1f389;第六章 应用层&#x1f389; &am…

Vue 如何简单快速组件化

文章目录 前言相关文章组件化实战如何引入组件什么是父组件&#xff0c;什么是子组件如何实现给子组件赋值完整代码 如何调用子组件方法完整代码 总结 前言 为了简化拆分复杂的代码逻辑&#xff0c;和实现代码的组件化&#xff0c;封闭化。我们需要使用组件化的方法。我这里只…

划片机之半导体MiniLED/MicroLED封装技术及砂轮切割工艺

对于MiniLED和MicroLED的封装技术&#xff0c;除了之前提到的COB、coG、coF、IMD和MiP工艺&#xff0c;还有一些新的封装技术&#xff0c;例如&#xff1a; 0CRL&#xff08;Oxide-Buffered CuInGaZn/Quar&#xff09;工艺&#xff1a;这种工艺使用氧化物缓冲层来增强芯片和基板…

9.2.4 vim 的暂存盘、救援回复与打开时的警告讯息

当我们在使用 vim 编辑时&#xff0c; vim 会在与被编辑的文件的目录下&#xff0c;再创建一个名为.filename.swp 的文件。 比如说我们在上一个小节谈到的编辑 /tmp/vitest/man_db.conf 这个文件时&#xff0c; vim 会主动的创建 /tmp/vitest/.man_db.conf.swp 的暂存盘&#x…

网络运维工程师是干什么的:为网络世界保驾护航的技术守护者

网络运维工程师是现代企业中至关重要的职业之一。他们负责保证网络的正常运行&#xff0c;解决各种网络故障&#xff0c;并优化网络性能。本文将揭秘网络运维工程师的神秘面纱&#xff0c;带您了解他们的日常工作和职责。 1. 故障排除和维护&#xff1a; - 网络故障诊断&#x…

千亿儿童食品赛道,谁能成为行业“指明灯”?

文 | 螳螂观察 作者 | 易不二 近几年的热门赛道&#xff0c;风口此起彼伏&#xff0c;但儿童食品却是长风常吹。 《儿童零食市场调查白皮书》预测&#xff0c;2019—2023年间&#xff0c;儿童零食市场将以10%-15%的复合年增长率稳定增长&#xff0c;市场预期超6000亿元&…

【C++学习笔记】RAII思想——智能指针

智能指针 1 内存泄漏问题2 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;2.1 使用RAII思想设计的SmartPtr类2.2 智能指针的原理2.3 小总结智能指针原理 3 智能指针的拷贝问题3.1 std::auto_ptr3.2 std::unique_ptr3.3 std::shared_ptr3.3.1 拷贝构造函数…

等保二级配置(四)口令复杂度策略和禁止root登录

口令复杂度策略 序号检查项名称检查指南符合性说明整改方法1口令复杂度策略1.确认账号现用密码&#xff1b; 2.查看配置文件/etc/pam.d/system-auth中相关参数。1.密码长度不小于8位&#xff0c;至少包括数字、大写字母、小写字母、特殊字符中的三种字符&#xff0c;非常见弱密…

23款奔驰GLS450时尚型更换原厂几何多光束大灯,让智能照亮您前行的路

奔驰几何多光束大灯核心特点就是通过内部的84颗可独立控制的LED光源&#xff0c;行车远光灯会甄别对向驶来的车辆或者行人&#xff0c;并且动态的跟随目标&#xff0c;之后阴影话该区域&#xff0c;避免晃到车辆和行人。

简单分享下小程序商城开发要多少钱

小程序商城的开发费用因多种因素而异&#xff0c;包括以下几点&#xff1a; 一、功能需求&#xff1a;商城的功能要求不同&#xff0c;开发所需的工作量也会有所不同。例如&#xff0c;基本的商品展示和购买功能相对较简单&#xff0c;而复杂的订单管理、支付、物流等功能可能需…

linux中安装Nginx的具体步骤

1.首先介绍一下Ngnix nginx是一款使用c语言编写的高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上Nginx的并发能力确实在同类型的网页服务器中表现得最好&#xff0c;中国大陆使用Nginx网站用户有&#xff1a;百度、京东、…

【IMX6ULL - LOGO替换】linux内核启动打印logo替换详细教程

Starting kernel ...[ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.1.15 (root@ubuntu) (gcc version 5.3.0 (GCC) ) #1 SMP PREEMPT Thu Jul 6 16:06:11 CST 2023这里我们针对性的修改 “root@ubuntu”

java的集合框架ListSetMap

什么是集合&#xff1f; 存储多个对象的单一对象&#xff08;java容器&#xff09;。 为什么不用数组&#xff1f; 集合与数组都是对数据进行存储操作的结构&#xff0c;简称java容器。 此时的存储主要是内存方面的&#xff0c;不涉及到持久话存储(.txt&#xff0c;.jpg&#x…

XXX汽车SAP ERP系统预月结模式助力成本高效结算(投稿数字化月报二)

XXX汽车业务复杂&#xff0c;零部件数据繁多&#xff0c;SAP ERP系统实施时&#xff0c;引进了行业的领先模式&#xff0c;所以系统挑战相对大&#xff0c;尤其是在月底进行账务结算时&#xff0c;出现过结算异常的情况&#xff0c;而公司对月结有固定的完成时间&#xff0c;因…

Seafile搭建个人云盘 - 内网穿透实现在外随时随地访问

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4. 公网访问测试5. 结语 转载自cpolar极点云文章&#xff1a;使用SeaFile搭建…

Java 设计模式——代理模式

目录 1.概述2.结构3.静态代理3.1.实现3.2.优缺点 4.动态代理4.1.JDK 动态代理4.1.1.实现4.1.2.思考4.1.2.1.ProxyFactory 是代理类吗&#xff1f;4.1.2.2.动态代理的执行流程是什么样&#xff1f;4.1.2.3.为什么 JDK 动态代理只能代理有接口的类&#xff1f; 4.2.CGLIB 动态代理…