【C语言篇】操作符详解(上篇)

文章目录

  • 操作符详解(上篇)
    • 前言
    • sizeof
    • 强制类型转换
    • 算术操作符
    • 赋值操作符
    • 逻辑操作符
      • 逻辑取反运算符
      • 逻辑与运算符
      • 逻辑或运算符
    • 关系操作符
    • 自增自减操作符
    • +和-
    • 逗号表达式

操作符详解(上篇)

前言

操作符又被叫做运算符,是不同的翻译,意思是一样的

依据操作符的操作数有几个,分为单目双目三目操作符

sizeof

强制类型转换

上述两种操作符在C语言数据类型和变量中已经做过详细介绍了,不熟悉的小伙伴可以去看看

算术操作符

C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是: +、-、*、/、%,这些操作符都是双目操作符

  • +、-、*和数学上规则是一样的
  • /
    • 两端如果都是整数,得到结果也是整数
#include <stdio.h>
int main()
{float x = 6 / 4;int y = 6 / 4;printf("%f\n", x); // 输出 1.000000 printf("%d\n", y); // 输出 1 return 0;
}

上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是 1.5 。原因就在于C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。

  • 注意:

    当都为正数或负数时,向下取整

    当一正一负时,向上取整

#include <stdio.h>
int main()
{printf("%d\n", 3 / 2);//1printf("%d\n", (-3) / (-2);//1printf("%d\n", -3 / 2);//-1
}
  • %

    • 运算符 % 表⽰求模(余)运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数

    • 负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定

#include <stdio.h>
int main()
{printf("%d\n", 11 % -5); // 1printf("%d\n",-11 % -5); // -1printf("%d\n",-11 % 5); // -1return 0;
}

赋值操作符

在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。

int a = 100;//初始化
a = 200//赋值
  1. 赋值操作符 = 是⼀个随时可以给变量赋值的操作符。
  • 赋值操作符也可以连续赋值,如:
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。 

C语⾔虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执⾏细节。

  1. 复合赋值符

在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:

int a = 10;
a = a+3;
a = a-2;

这样代码C语⾔给提供了更加⽅便的写法:

int a = 10;
a += 3;
a -= 2;

C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:

+= -=
*= /= %=
//下⾯的操作符之后讲解 
>>= <<=
&= |= ^=

逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。

  • !:逻辑取反运算符(改变单个表达式的真假)。
  • && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
  • || :逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

逻辑取反运算符

在这里插入图片描述

⽐如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:

#include <stdio.h>
int main()
{int flag = 0;if(!flag){printf("do something\n");}return 0;
}

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真

所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。

逻辑与运算符

ssets%2Fimage-20240803095429302.png&pos_id=img-brAABIcS-1722653006071)

&&就是与运算符,也是并且的意思&是⼀个双⽬操作符,使⽤的⽅式是 a&&b&两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。

int month = 0;
scanf("%d", &month);
if(month >= 3 && month <= 5)
{printf("春季\n");
}

这⾥表达的意思就是month既要⼤于等于3,⼜要⼩于等于5,必须同时满⾜。

逻辑或运算符

|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b , || 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

int month = 0;
scanf("%d", &month);
if(month == 12 || month==1 || month == 2)
{printf("冬季\n");
}
  • 这里表达的意思就是⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天

输⼊⼀个年份year,判断year是否是闰年

闰年判断的规则。 能被4整除并且不能被100整除是闰年 2. 能被400整除是闰年

#include <stdio.h>
//代码1 
int main()
{int year = 0;scanf("%d", &year);if(year%4==0 && year%100!=0)printf("是闰年\n");else if(year%400==0)printf("是闰年\n");return 0;
}
//代码2 
int main()
{int year = 0;scanf("%d", &year);if((year%4==0 && year%100!=0) || (year%400==0))printf("是闰年\n");return 0;

逻辑运算符特点:短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。

如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。

如前⾯的代码:

if(month >= 3 && month <= 5)

表达式中&&的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的 结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。

所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。

对于 || 操作符是怎么样呢?我们结合前⾯的代码:

if(month == 12 || month==1 || month == 2)

如果month==12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。

所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为短路求值。


关系操作符

C语⾔⽤于⽐较的表达式,称为“关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator),主要有下⾯6个:

  • >⼤于运算符

  • <⼩于运算符

  • >= ⼤于等于运算符

  • <= ⼩于等于运算符

  • == 相等运算符

  • != 不相等运算符

关系表达式通常返回 0 或 1 ,表⽰真假。 C语⾔中, 0 表⽰假,所有⾮零值表⽰真。⽐如, 20 > 12 返回 1 , 12 > 20 返回 0 。 关系表达式常⽤于 if 或 while 结构。

if (x == 5) {printf("x is 5.\n");
}

注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。

if (x = 5)...

上⾯⽰例中,原意是 x == 5 ,但是不⼩⼼写成 x = 5 。这个式⼦表⽰对变量 x 赋值5 ,它的返回值为5,所以 if 判断总是为真。 为了防⽌出现这种错误,有的程序员喜欢将变量写在等号的右边。

if(5 == x)...

这样的话,如果把 == 误写成 = ,编译器就会报错。

另⼀个需要避免的错误是:多个关系运算符不宜连⽤。

i < j < k

上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。

(i < j) < k

上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法。

i < j && j < k

自增自减操作符

++是⼀种⾃增的操作符,⼜分为前置++和后置++
--是⼀种⾃减的操作符,也分为前置--和后置--.

int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++ 
printf("a=%d b=%d\n",a , b);//11 11int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++ 
printf("a=%d b=%d\n",a , b);//11 10

总结:

  • 前置++:计算⼝诀:先+1,后使⽤
  • 后置++:计算⼝诀:先使⽤,后+1

--操作符道理同上

+和-

这⾥的+是正号,-是负号,都是单⽬操作符。

  • 运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。
int a = +10; //等价于 int a = 10;
  • 运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负 数。
int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n", b, c);//这⾥的b和c都是-10 
int a = -10;
int b = -a;
printf("b=%d\n", b); //这⾥的b是10 

逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是⽤逗号隔开的多个表达式。

逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。

//代码1 
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式 
//c是多少?//代码2 
if (a =b + 1, c=a / 2, d > 0)//代码3 
a = get_val();
count_val(a);
while (a > 0)
{//业务处理 //...a = get_val();count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{//业务处理 
}
  • 代码一中,从左向右依次执行,a=b+10,所以a=11,b=a+1,所以b=12,即最后一个表达式结果为c的值,c=12。所以千万不能认为逗号表达式是最后一个表达式的值就只看最后一个表达式进行计算,因为前面的表达式也可能影响后面表达式的值
  • 代码二中就只和d是否大于0有关
  • 代码三使用逗号表达式简化代码

以上就是操作符详解(上篇)的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️
请添加图片描述

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

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

相关文章

进程状态(三)----- linux 中具体的进程状态(下)

目录 前言1. T && t 状态2. X 与 Z 状态3. 孤儿进程 前言 继上一篇文章 进程状态&#xff08;二&#xff09;----- linux 中具体的进程状态&#xff08;上&#xff09; 介绍了 linux 系统中具体的 R、S、D 状态&#xff0c;而这篇文章继续介绍 linux 系统中剩下的三种…

SpringBoot简单项目(二维码扫描)

pom.xml中导入依赖 <!-- zxing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</gro…

探索七款前沿UI设计软件:创新与实践

之前我们分享了制作原型的有用工具。制作完原型后&#xff0c;我们需要优化界面&#xff0c;这就是 UI 设计师的任务了。UI 设计软件对设计师来说非常重要。UI 设计工具的使用是否直接影响到最终结果的质量&#xff0c;所以有人会问&#xff1a;UI 界面设计使用什么软件&#x…

Java批量查询CSDN质量分

文章目录 前言代码实现pom.xml实体类工具类质量分查询 效果开源仓库 前言 在CSDN平台申请“专家博主”、“优质创作者”等称号的时候&#xff0c;往往会对博客的质量分有一定的要求&#xff0c;这时候我们需要审视以往所发表的博客&#xff0c;找出质量分较低的博客&#xff0…

nordic 蓝牙ble 配对绑定的流程 原理

目录 配对和绑定的基本概念 配对和绑定的流程 1. 配对请求和响应 2. 配对方法选择 3. 密钥生成和交换 4. 配对完成和绑定 配对和绑定的代码实现 初始化Peer Manager 处理Peer Manager事件 处理BLE事件 启动广播 在Nordic芯片上实现蓝牙低功耗(BLE)设备的配对和绑定…

Python 为Excel单元格设置填充\背景色 (纯色、渐变、图案)

在使用Excel进行数据处理和分析时&#xff0c;对特定单元格进行背景颜色填充不仅能够提升工作表的视觉吸引力&#xff0c;还能帮助用户快速识别和区分不同类别的数据&#xff0c;增强数据的可读性和理解性。 本文将通过以下三个示例详细介绍如何使用Python在Excel中设置不同的单…

sql注入——sqlilabs1-15

目录 sql注入靶场练习--sqlilabs 1.less-1​编辑 1.测试发现单引号为逃逸符号 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.查询用户表的列名字 6.查询用户信息 2.less-2​编辑 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.…

机械学习—零基础学习日志(高数23——无穷小运算)

零基础为了学人工智能&#xff0c;真的开始复习高数 这段时间&#xff0c;把张宇老师讲解考研的第一部分基本全部学习完毕了。 这里把第一部分的内容最后汇总一下。 无穷小运算——吸收律 这里展示一些无穷小的具体计算思路 无穷小运算——计算方法 泰勒展开的原则 夹逼准则…

SQL报错注入之floor

目录 1.简述 2.关键函数说明 1.rand函数 2.floor&#xff08;rand&#xff08;0&#xff09;*2&#xff09;函数 3.group by 函数 4.count&#xff08;*&#xff09;函数 3.报错分析 4.报错流程 4.1寻找注入点 4.2爆数据库名 4.3爆表名 4.4爆字段名 4.5查询数据 1.…

PySide入门实战之五 | 信号与槽函数之鼠标、键盘等事件

&#x1f680;&#x1f680;&#x1f680; Pyside6实战教程专栏目录入口&#xff1a;点击跳转 目录 一、前期准备二、鼠标触发事件鼠标拖动窗口 一、前期准备 我们采用Pyside入门实战之四中通过QTDesigner创建的界面&#xff0c;具体由两个Label和一个Button组件构成&#xff…

【c++】基础知识——快速入门c++

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C 目录 前言 一、手搓一个Hello World 二、命名空间namespace 1.命名空间的定义 2.命名空间的使用 3.命名空间补充知识 三、c中的输入和输出 四、缺省参…

图书馆座位再利用小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;座位信息管理&#xff0c;座位预订管理&#xff0c;互勉信息管理&#xff0c;意见反馈管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我的 开发…

Unity补完计划 之Tilemap

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 1.Tilemap 是什么 Q&#xff1a;和 SpriteShape有什么区别&#xff1f; A&#xff1a;tilemap强项在于做重的复背景&…

VsCode无法远程调试

一、问题描述 按照《VsCode gdb gdbserver远程调试C程序》中介绍的方法&#xff0c;配置好VsCode后&#xff0c;按下F5快捷键&#xff0c;或点击“Start Debugging”按钮&#xff0c;没有反应&#xff0c;无法启动调试&#xff1a; 二、解决方法 针对该问题&#xff0c;我尝…

常用设计模式总结

代码的评判角度 常见的评判代码好坏的词汇&#xff1a; 灵活性&#xff08;flexibility&#xff09;、可扩展性&#xff08;extensibility&#xff09;、可维护性&#xff08;maintainability&#xff09;、可 读性&#xff08;readability&#xff09;、可理解性&#xff08;…

电子元器件—三极管(一篇文章搞懂电路中的三极管)(笔记)(面试考试必备知识点)

三极管的定义及工作原理 1. 定义 三极管&#xff08;Transistor&#xff09;是一种具有三层半导体材料&#xff08;P-N-P 或 N-P-N&#xff09;构成的半导体器件&#xff0c;用于信号放大、开关控制和信号调制等应用。三极管有三个引脚&#xff1a;发射极&#xff08;Emitter…

Javascript——NaN有什么用法

简介 在 JavaScript 中&#xff0c;NaN&#xff08;Not a Number&#xff09;是一个特殊的值&#xff0c;用来表示非数字的结果&#xff0c;例如一个不合法的数学运算的结果。根据 IEEE 754 浮点数标准&#xff0c;NaN 不等于任何值&#xff0c;包括它自己。这意味着 NaN 是唯…

JAVA毕业设计158—基于Java+Springboot的二手车交易管理系统(源代码+数据库+万字论文+ppt)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringboot的二手车交易管理系统(源代码数据库万字论文ppt)158 一、系统介绍 本项目前后端不分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#…

Golang | Leetcode Golang题解之第326题3的幂

题目&#xff1a; 题解&#xff1a; func isPowerOfThree(n int) bool {return n > 0 && 1162261467%n 0 }

AXS4054:单节锂电池充电管理芯片特性与应用推荐

AXS4054是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;芯片集成功率晶体管&#xff0c;充电电流可以用外部电阻设定&#xff0c;蕞大持续充电电流可达600mA,非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不…