初探C语言|C语言中有哪些操作符呢?

文章目录

  • 前言
    • 算术操作符
      • 示例
    • 移位操作符
      • 原码,反码 与补码
        • 正数
        • 负数
          • 计算
      • 左移<<
      • 右移>>
    • 位操作符
      • 例题
    • 赋值操作符
    • 单目操作符
      • `sizeof` 操作符
    • 关系操作符
    • 逻辑操作符
      • 短路现象
    • 条件操作符
    • 逗号表达式
    • 下标引用、函数调用和结构成员
    • 表达式求值
      • 算术转换
      • 操作符属性


欢迎讨论:
如果你发现文章中有任何错误或不完善的地方,欢迎在评论区提出建议和指正。如果对某些内容有疑问,也非常期待你在评论区与我互动。
点赞+关注:
如果这篇文章对你有所帮助,不妨点赞并关注我哦~ 你的支持是我继续创作的动力!


前言

本篇文章将深入探讨 C 语言中的各种操作符,包括算术操作符、移位操作符、位操作符等,帮助大家更好地理解和使用这些操作符。

算术操作符

C语言中的基本算术操作符包括:+-*/%

  • 加法 (+)、减法 (-)、乘法 (*)、除法 (/)、取余 (%) 都可以作用于整数和浮点数。
  • 除法 (/):如果两个操作数都是整数,则执行整数除法;如果有一个操作数为浮点数,则执行浮点除法。
  • 取余 (%):仅适用于整数,返回整除后的余数。

示例

int a = 5, b = 2;
printf("a / b = %d\n", a / b);  // 输出: 2
printf("a %% b = %d\n", a % b); // 输出: 1
  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

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

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


移位操作符

C语言提供了两种移位操作符:左移 (<<) 和右移 (>>)。

  • 左移 (<<):将操作数的位向左移动,右边用零填充。
  • 右移 (>>):将操作数的位向右移动,左边填充根据操作数的符号位(算术移位)或零(逻辑移位)。

注意:移位操作符只适用于整数类型

相信大家还有点懵,无妨,我们来看看原理。

原码,反码 与补码

原码、反码和补码是2进制的表示形式

正数

正数的原码、反码、补码是相同的

int a = 10;
//	//00000000000000000000000000001010 - 原码//	//00000000000000000000000000001010 - 反码//	//00000000000000000000000000001010 - 补码
负数

负数的原码、反码、补码要经过计算的

计算

原码->反码:符号位不变,其余取反
反码->补码:+1
补码->原码:先取反(符号位不变)再+1(或先-1再取反(符号位不变))

注意:符号位为第32位

int a = -10;
//	//10000000000000000000000000001010 - 原码//	//11111111111111111111111111110101 - 反码//	//11111111111111111111111111110110 - 补码////	//11111111111111111111111111110110 - 补码//	//10000000000000000000000000001001//	//10000000000000000000000000001010 - 原码

左移<<

内存中存储的起始是:补码的二进制
所以在参与移位的时候,移动后都是补码

移位规则:

左边抛弃、右边补0

注意:不管怎么移,符号位的值永远不变。
在这里插入图片描述

右移>>

移位规则:

右移运算分两种:

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

取决于编译器,算术移位是更常见的,VS,DEV,VC++,gcc等等。


位操作符

&//按位与:有0则为0,全1才为1
|//按位或:有1则为1,全0才为0
^//按位异或:相同则为1,相异则为0

注意:操作数必须为整数
异或^符合结合律

例题

不能创建临时变量,实现两数交换

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

这个代码看似简洁,实则并不好。
1.可读性差,对读者并不友好。
2.时间复杂度和空间复杂度都不如创建临时变量更优。
平时实现需要交换两个数时,推荐使用临时变量。

另外还有一种解法:

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

赋值操作符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=

这些运算符都可以写成复合的效果。

比如:

int x = 10;
x = x+10;
x += 10;//复合赋值

这样写更加简洁


单目操作符

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

sizeof 操作符

关于sizeof,可以求变量(类型)所占空间的大小,其返回值类型为size_t,用%zd

int a = 10;
printf("Size of a: %zd bytes\n", sizeof(a));

关系操作符

>

>=

<

<=

!= 用于测试“不相等”

== 用于测试“相等”

注意:== 用于测试相等,= 为赋值操作符,二者不可混淆。


逻辑操作符

逻辑操作符用于逻辑判断:

&&     逻辑与||     逻辑或

短路现象

来看一道题:

360笔试题
程序输出的结果是什么?

#include <stdio.h>int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}

在这里插入图片描述

为什么呢?

  • 在逻辑与中,左边的表达式为假时,程序就不再继续判断右边表达式了,直接进入下一条语句。
  • 同样的,在逻辑或中,左边的表达式为真时,程序就不再继续判断右边表达式了,直接进入下一条语句。
  • 逻辑与 (&&):如果左边表达式为假,则右边表达式不再计算。
  • 逻辑或 (||):如果左边表达式为真,则右边表达式不再计算。
    这就是短路。

条件操作符

条件操作符(?:)是一个三目运算符,格式为:

exp1 ? exp2 : exp3

exp1 为真时,结果为 exp2,否则为 exp3

举个例子

if (a > 5)
b = 3;
else
b = -3;转换成条件表达式,是什么样?a > 5 ? b = 3 : b = -3;

逗号表达式

exp1,exp2,exp3,…expN

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
但最后一个表达式的结果受前面的表达式影响。

int a = (1, 2, 3);  // a 赋值为 3

下标引用、函数调用和结构成员

  1. 下标引用操作符

操作数:一个数组名 + 一个索引值

  1. ( ) 函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

  1. 访问一个结构的成员

. [[结构体]].成员名
-> [[结构体]]指针->成员名

#include <stdio.h>struct Stu
{
char name[10];
int age;
char sex[5];
double score;
}void set_age1(struct Stu stu)
{
stu.age = 18;
}void set_age2(struct Stu* pStu)
{
pStu->age = 18;//结构成员访问
}int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0;
}

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。

同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

算术转换

C语言会根据操作数的类型自动进行类型转换。类型转换的顺序从高到低为:

  1. long double
  2. double
  3. float
  4. unsigned long int
  5. long int
  6. unsigned int
  7. int

在运算过程中,如果需要,C语言会将较低类型的操作数转换为较高类型后进行运算。

操作符属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级

  2. 操作符的结合性

  3. 是否控制求值顺序。

两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

常用操作符优先级图表:
在这里插入图片描述

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

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

相关文章

GXUOJ-算法-第一次作业

1.整数划分 问题描述 GXUOJ | 整数划分 题解 #include<bits/stdc.h> using namespace std; const int N1010,mod1e97;int n; int f[N];int main(){cin>>n;f[0]1;for(int i1;i<n;i){for(int ji;j<n;j){f[j](f[j]f[j-i])%mod;}}cout<<f[n]; } 2.汉诺塔…

理想的以太网网络故障排查工具:LinkXpert M3

在排查铜缆、光纤和Wi-Fi以太网故障时&#xff0c;通常需要多种昂贵的工具&#xff0c;操作起来会很复杂。因此&#xff0c;我们推出了LinkXpert M3 —— 一个专为铜缆、光纤和Wi-Fi以太网网络故障排查而设计的工具。它功能强大、体积小巧、性价比高&#xff0c;无疑是您值得信…

Git如何设置和修改当前分支跟踪的上游分支

目录 前言 背景 设置当前分支跟踪的上游分支 当前分支已有关联&#xff0c;删除其关联&#xff0c;重新设置上游 常用的分支操作 参考资料 前言 仅做学习记录&#xff0c;侵删 背景 在项目开发过程中&#xff0c;从master新建分支时&#xff0c;会出现没有追踪的上游分…

专业版pycharm与服务器连接

一、先连接服务器 先创建配置&#xff1a; 名字随便取一个&#xff1a; 点击测试连接测试是否连接成功&#xff1b; 二、添加解释器 添加解释器&#xff0c;这个解释器是最开始在xshell中创建好的虚拟环境&#xff0c;具体虚拟环境创建可参考这篇&#xff1a;AutoDL服务器深…

LabVIEW如何学习FPGA开发

FPGA&#xff08;现场可编程门阵列&#xff09;开发因其高性能、低延迟的特点&#xff0c;在实时控制和高速数据处理领域具有重要地位。LabVIEW FPGA模块为开发者提供了一个图形化编程平台&#xff0c;降低了FPGA开发的门槛。本篇文章将详细介绍LabVIEW FPGA开发的学习路径&…

ISDP010_基于DDD架构实现收银用例主成功场景

信息系统开发实践 &#xff5c; 系列文章传送门 ISDP001_课程概述 ISDP002_Maven上_创建Maven项目 ISDP003_Maven下_Maven项目依赖配置 ISDP004_创建SpringBoot3项目 ISDP005_Spring组件与自动装配 ISDP006_逻辑架构设计 ISDP007_Springboot日志配置与单元测试 ISDP008_SpringB…

中学数学:一个函数值计算题

在数学的领域中&#xff0c;函数是一种描述变量之间关系的桥梁&#xff0c;它能够揭示出看似复杂现象背后的简洁规律。通过函数&#xff0c;我们可以预测、分析并解决实际问题。在这张图片中&#xff0c;我们看到了一位数学爱好者手写的解题过程&#xff0c;它展示了如何巧妙地…

#渗透测试#漏洞挖掘#红蓝攻防#常见未授权访问漏洞汇总

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

基于Oauth2的SSO单点登录---前端

Vue-element-admin 是一个基于 Vue.js 和 Element UI 的后台管理系统框架&#xff0c;提供了丰富的组件和功能&#xff0c;可以帮助开发者快速搭建现代化的后台管理系统。 一、基本知识 &#xff08;一&#xff09;Vue-element-admin 的主要文件和目录 vue-element-admin/ |--…

华为 AI Agent:企业内部管理的智能变革引擎(11/30)

一、华为 AI Agent 引领企业管理新潮流 在当今数字化飞速发展的时代&#xff0c;企业内部管理的高效性与智能化成为了决定企业竞争力的关键因素。华为&#xff0c;作为全球领先的科技巨头&#xff0c;其 AI Agent 技术在企业内部管理中的应用正掀起一场全新的变革浪潮。 AI Ag…

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

阿里云新用户服务器配置

创建和链接实例 创建实例&#xff0c;点击左侧标签栏总的实例&#xff0c; 找到链接帮助 根据帮助中的ip信息&#xff0c;然后启用vscode的ssh链接 ctrlp选择配置&#xff0c;输入公网的ip即可 passwd修改root密码 安装conda 参考 https://blog.csdn.net/adreammaker/arti…

五金产品视觉检测

五金产品种类繁多&#xff0c;且与我们的日常生活紧密有关&#xff0c;依照加工工艺的不同&#xff0c;五金产品有压铸件&#xff0c;五金冲压件&#xff0c;铸件等&#xff0c;无论是哪种加工方式&#xff0c;产品总会存在各式各样的问题&#xff0c;今天我们就五金产品的缺陷…

拼多多纠偏,能否实现买卖平权?

科技新知 原创作者丨江蓠 编辑丨蕨影 当曾将仅退款、运费险作为标配的电商平台们开始听到商家诉求&#xff0c;有意优化营商环境&#xff0c;作为“仅退款”服务发起者的拼多多也坐不住了。 在推出一揽子减免计划讨好中小商家之后&#xff0c;拼多多近期被传正在内测精选用户…

XGPT用户帮助手册

文章目录 20242024.12.27 摘要 本文介绍如何使用XGPT软件, XGPT融合了当前最先进的人工智能技术&#xff0c;并专为国内用户优化。 2024 2024.12.27 XGPT v1正式发布, 特色功能: 具备图像文本多模态处理功能包含GPT等最先进模型国内可访问 B站视频介绍 图1 XGPT v1 快照

低代码开源项目Joget的研究——Joget7社区版安装部署

大纲 环境准备安装必要软件配置Java配置JAVA_HOME配置Java软链安装三方库 获取源码配置MySql数据库创建用户创建数据库导入初始数据 配置数据库连接配置sessionFactory编译下载tomcat启动下载aspectjweaver移动jw.war文件编写脚本运行 测试参考资料 Joget&#xff0c;作为一款开…

后端开发如何高效使用 Apifox?

Apifox 是一个 API 协作开发平台&#xff0c;后端、前端、测试都可以使用 Apifox 来提升团队的工作效率。对于后端开发者而言&#xff0c;Apifox 的核心功能主要包括四个模块&#xff1a;调用 API、定义 API、开发与调试 API 以及生成 API 文档。本文将详细介绍后端开发人员如何…

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

极客说|微软新模型:Phi-4 来了

作者&#xff1a;魏新宇 - 微软 AI 全球黑带高级技术专家 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客…