初探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. 是否控制求值顺序。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习记录:配置mybatisplus的分页查询插件,mybatis-plus-jsqlparser 依赖

来源官方文档:分页插件 | MyBatis-Plus 于 v3.5.9 起&#xff0c;PaginationInnerInterceptor 已分离出来。如需使用&#xff0c;则需单独引入 mybatis-plus-jsqlparser 依赖 配置Maven bom 在我们的配置文件&#xff0c;pom.xml中 <properties> 这个标签下面&#xf…

电子应用设计方案74:智能家庭对讲系统设计

智能家庭对讲系统设计 一、引言 智能家庭对讲系统作为智能家居的重要组成部分&#xff0c;为家庭成员之间以及与访客的沟通提供了便捷、高效的方式。本设计方案旨在打造一个功能强大、稳定可靠、操作简便且具有良好扩展性的智能家庭对讲系统。 二、系统概述 1. 系统目标 - 实…

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…

埃斯顿机器人程序模版案例,欢迎指点

埃斯顿机器人程序模版案例&#xff0c;欢迎指点

python监控数据处理应用服务Socket心跳解决方案

1. 概述 从网页、手机App上抓取数据应用服务&#xff0c;涉及到多个系统集成协同工作&#xff0c;依赖工具较多。例如&#xff0c;使用Frida进行代码注入和动态分析&#xff0c;以实现对网络通信的监控和数据捕获。在这样的集成环境中&#xff0c;手机模拟器、手机中应用、消息…

C# GDI+数码管数字控件

调用方法 int zhi 15;private void button1_Click(object sender, EventArgs e){if (zhi > 19){zhi 0;}lcdDisplayControl1.DisplayText zhi.ToString();} 运行效果 控件代码 using System; using System.Collections.Generic; using System.Drawing.Drawing2D; using …

药片缺陷检测数据集,8625张图片,使用YOLO,PASICAL VOC XML,COCO JSON格式标注,可识别药品是否有缺陷,是否完整

药片缺陷检测数据集&#xff0c;8625张图片&#xff0c;使用YOLO&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式标注&#xff0c;可识别药品是否有缺陷&#xff0c;是否完整 有缺陷的标注信息&#xff1a; 无缺陷的标注信息 数据集下载&#xff1a; yolov11:https://d…

jenkins集成工具(一)部署php项目

目录 什么是CI 、CD Jenkins集成工具 一、Jenkins介绍 二、jenkins的安装和部署 环境部署 安装jenkins 安装gitlab 配置镜像源进行安装 修改密码 安装git工具 上传测试代码 Jenkins部署php项目wordpress 发布php代码 安装插件 测试代码发布 实现发布成功发送邮件…

Web开发:ORM框架之使用Freesql的分表分页写法

一、自动分表&#xff08;高版本可用&#xff09; 特性写法 //假如是按月分表&#xff1a;[Table(Name "log_{yyyyMM}", AsTable "createtime2022-1-1(1 month)")]注意&#xff1a;①需包含log_202201这张表 ②递增规律是一个月一次&#xff0c;确保他们…

【UE5.3.2】生成vs工程并rider打开

Rider是跨平台的,UE也是,当前现在windows上测试首先安装ue5.3.2 会自动有右键的菜单: windows上,右键,生成vs工程 生成的结果 sln默认是vs打开的,我的是vs2022,可以open with 选择 rider :Rider 会弹出 RiderLink是什么插

FFmpeg在python里推流被处理过的视频流

链式算法处理视频流 视频源是本地摄像头 # codinggbk # 本地摄像头直接推流到 RTMP 服务器 import cv2 import mediapipe as mp import subprocess as sp# 初始化 Mediapipe mp_drawing mp.solutions.drawing_utils mp_drawing_styles mp.solutions.drawing_styles mp_holis…

【工具】—— SpringBoot3.x整合swagger

Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务的接口文档。Swagger简单说就是可以帮助生成接口说明文档&#xff0c;操作比较简单添加注解说明&#xff0c;可以自动生成格式化的文档。 项目环境 jdk17SpringBoot 3.4.0Sp…

Docker 部署 plumelog 最新版本 实现日志采集

1.配置plumelog.yml version: 3 services:plumelog:#此镜像是基于plumelog-3.5.3版本image: registry.cn-hangzhou.aliyuncs.com/k8s-xiyan/plumelog:3.5.3container_name: plumelogports:- "8891:8891"environment:plumelog.model: redisplumelog.queue.redis.redi…

图像处理-Ch5-图像复原与重建

Ch5 图像复原 文章目录 Ch5 图像复原图像退化与复原(Image Degradation and Restoration)噪声模型(Noise Models)i.i.d.空间随机噪声(Generating Spatial Random Noise with a Specified Distribution)周期噪声(Periodic Noise)估计噪声参数(Estimating Noise Parameters) 在仅…

在vscode的ESP-IDF中使用自定义组件

以hello-world为例&#xff0c;演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…

WordPress网站中如何修复504错误

504网关超时错误是非常常见的一种网站错误。这种错误发生在上游服务器未能在规定时间内完成请求的情况下&#xff0c;对访问者而言&#xff0c;出现504错误无疑会对访问体验大打折扣&#xff0c;从而对网站的转化率和收入造成负面影响。 504错误通常源于服务器端或网站本身的问…

C++——运算符重载

一、运算符重载 ①含义 函数重载或函数多态&#xff1a;同名函数完成相同的基本操作 C将重载的概念扩展到运算符上&#xff0c;于是出现了运算符重载 C中有很多运算符已经被重载 *运算符&#xff0c;运用于地址&#xff0c;可以得到存储在这个地址的值&#xff1b;运用于两个…

抖去推碰一碰系统技术源码/open SDK转发技术开发

抖去推碰一碰系统技术源码/open SDK转发技术开发 碰一碰智能系统#碰碰卡系统#碰一碰系统#碰一碰系统技术源头开发 碰碰卡智能营销系统开发是一种集成了人工智能和NFC技术的工具&#xff0c;碰碰卡智能营销系统通过整合数据分析、客户关系管理、自动化营销活动、多渠道整合和个…

【Unity3D】ECS入门学习(六)状态组件 ISystemStateComponentData

当需要获知组件是否被销毁时&#xff0c;ECS是没有回调告知的&#xff0c;因此可以将组件继承于ISystemStateComponentData接口&#xff0c;这样即使组件的实体被销毁了&#xff0c;该组件本身是不会消失的&#xff0c;所以可以通过在组件实体销毁后&#xff0c;去设置状态组件…

期权懂|如何计算期权卖方平仓后的盈利?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何计算期权卖方平仓后的盈利&#xff1f; 期权卖方平仓后的盈利计算涉及多个因素&#xff0c;包括期权的交易价格、平仓价格以及权利金的变动等。 交易价格&#xff1a;期权卖…