【C语言】/*操作符(上)*/

目录

一、算数操作符:+、-、*、/、%

1.1 + 和 -

1.2 * 

1.3 / 

1.4 % 

二、赋值操作符:= 和符合赋值

2.1 连续赋值

2.2 复合赋值(自操作)

三、单目操作符:++、--、+(正号)、-(负号)

3.1 ++ 和 --  

3.1.1 前置++

3.1.2 后置++

3.1.3 前置--

3.1.4 后置--

3.2 正号(+) 和负号(-)

四、强制类型转换

五、关系操作符

六、条件操作符

七、逻辑操作符:&&、||、!

7.1 逻辑取反运算符

7.2 与运算符

7.3 或运算符

7.4 短路


一、算数操作符:+、-、*、/、%

1. 算术操作符分别是: +、-、*、/、%,这些操作符都是双⽬操作符(有两个操作数)

2. 注:操作符也被叫做运算符,是不同的翻译,意思是⼀样的。

 1.1 + 和 -

1. + 和 - 用来完成加法和减法。

2. 示例代码如下图:

1.2 * 

1. 运算符 * ⽤来完成乘法。

2. 示例代码如下图:

1.3 / 

1. 运算符/⽤来完成除法,除号的两端如果是整数,执⾏的是整数除法,得到的结果是商

2. 示例代码如下图:

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

4. 如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法

5. 示例代码如下图:

5. 示例代码如下图:

6. 上⾯的代码,你可能觉得经过运算, score 会等于 25 ,但是实际上 score 等于 0 。这是因为 score / 20 采用的是整数除法,(score / 20)会得到⼀个整数值 0 ,所以乘以 100 后得到的也是 0 。 为了得到预想的结果,可以将除数 20 改成 20.0 ,让整数除法变成浮点数除法。

1.4 % 

1. 运算符 % 表⽰取模运算,即返回两个整数相除的余值;这个运算符只能⽤于整数,不能⽤于浮点数。

2. 示例代码如下图:

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

4. 示例代码如下图:

5. 上⾯⽰例中,第⼀个运算数的正负号( 11 或 -11 )决定了结果的正负号。

二、赋值操作符:= 和符合赋值

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

    int a = 100;//初始化

    a = 200;//赋值,这⾥使⽤的就是赋值操作符

2. 赋值操作符 = 是⼀个随时可以给变量赋值的操作符

2.1 连续赋值

1. 赋值操作符也可以连续赋值,如:

    int a = 3;

    int b = 5;

    int c = 0;

    c = b = a+3;//连续赋值,从右向左依次赋值的。

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

2.2 复合赋值(自操作)

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

    int a = 10;

    a = a+3;

    a = a-2;

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

    int a = 10;

    a += 3;

    a -= 2;

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

    +=、-=、*=、 /=、 %=

    >>=、<<=、 &=、 |=、^=

三、单目操作符:++、--、+(正号)、-(负号)

1. C语⾔中还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。 ++、--、+(正)、-(负) 就是单⽬操作符的

3.1 ++ 和 --  

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

2. 单独写前置和后置表达的效果是一样的,例如:++a 和 a++ 表达的都是a自加1。

3.1.1 前置++

1. int a = 10;

    int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++

    printf("a=%d b=%d\n",a , b);

2. 计算⼝诀:先+1,后使⽤;

3. a原来是10,先+1,后a变成了11,再使⽤就是赋值给b,b得到的也是11,所以打印的结果,a和b都是11,上面的代码相当于这样的代码:

    int a = 10;

    a = a+1;

    b = a;

    printf("a=%d b=%d\n",a , b);

3.1.2 后置++

1. int a = 10;

    int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++

    printf("a=%d b=%d\n",a , b);

2. 计算⼝诀:先使⽤,后+1;

3. a原来是10,先使⽤,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以打印的结果 a是11,b是10,上面的代码相当于这样的代码:

    int a = 10;

    int b = a;

    a = a+1;

    printf("a=%d b=%d\n",a , b);

3.1.3 前置--

1. 计算⼝诀:先-1,后使⽤;

2. int a = 10;

    int b = --a;//--的操作数是a,是放在a的前⾯的,就是前置--

    printf("a=%d b=%d\n",a , b);//输出的结果是:9 9

3.1.4 后置--

1. 计算⼝诀:先使⽤,后-1;

2. int a = 10;

    int b = a--;//--的操作数是a,是放在a的后⾯的,就是后置--

    printf("a=%d b=%d\n",a , b);//输出的结果是:9 10

3.2 正号(+) 和负号(-)

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

2. 运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。

    int a = +10; 等价于 int a = 10;

3. 运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负数。但是int a = --10;//err,--会被认为是前置--,且--操作符的操作数必须是可修改的值,而不能是常量,写成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

四、强制类型转换

1. 语法形式:(类型)

2. int a = 3.14; //a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告

3. 为了消除这个警告,我们可以使⽤强制类型转换:int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分

4. 俗话说,强扭的⽠不甜,我们使⽤强制类型转换都是万不得已的时候使⽤,如果不需要强制类型转化 就能实现代码,这样⾃然更好的。

五、关系操作符

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

     >      ⼤于运算符

     <      ⼩于运算符

    >=     ⼤于等于运算符

    <=     ⼩于等于运算符

    ==     相等运算符

    !=      不相等运算符

2. 关系表达式的结果为真返回1,为假返回0

3. C 语⾔中,0 表⽰假,所有⾮零值表⽰真,例如,20 > 12 返回 1 ,12 > 20 返回 0 。

4. 关系表达式常⽤于 if 或 while 结构。

    if (x == 3)

    {

           printf("x is 3.\n");

    }

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

    if (x = 3) ...

6. 上⾯⽰例中,原本的意思是 x == 3 ,但是不⼩⼼写成 x = 3,此时这个式⼦表⽰对变量 x 赋值3 ,它的返回值为 3 ,所以 if 判断总是为真。 为了防⽌出现这种错误,有的程序员喜欢将变量写在相等运算符的右边,例如 if (3 == x) ... 这样的话,如果把 == 误写成 = ,编译器就会报错,因为赋值表达式的左边必须是可以修改的左值

    /* 报错 */

    if (3 = x) ...

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

    i < j < k //err

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

    (i < j) < k

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

    i < j && j < k

10. ⽐如:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年,如果我们这样写,当我们输⼊10 的时候,依然输出⻘年。

    #include <stdio.h>

    int main()

   {

             int age = 0;

             scanf("%d", &age);

             if(18<=age<=36)

             {

                       printf("⻘年\n");

             }

             return 0;

   }

11. 这是因为,我们先拿 18 和 age 中存放的10⽐较,表达式18<=10为假, 18<=age 的结果是0,再拿 0 和 36⽐较,0<=36为真,所以打印了⻘年,所以即使当age是10的时候,也能打印⻘年 ,逻辑上是有问题的,修改代码如下。

12.  #include <stdio.h>

       int main()

      {

              int age = 0;

              scanf("%d", &age);

              if(age>=18 && age<=36)

              {

                       printf("⻘年\n");

              }

             return 0;

      }

六、条件操作符

1. 条件操作符也叫三⽬操作符(C语言中唯一的三目操作符),需要接受三个操作数的,形式如下:exp1 ? exp2 : exp3

2. 条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算计算的结果是整个表达式的结果

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > 5)
		b = 3;
	else
		b = -3;//上面四行代码可以直接写成:b = a > 5 ? 3 : -3;
	printf("%d\n", b);
	return 0;
}
//使⽤条件表达式实现找两个数中较⼤值
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int m = a > b ? a : b;
	printf("%d\n", m);
	return 0;
}

七、逻辑操作符:&&、||、!

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

    ! :逻辑取反运算符(改变单个表达式的真假),单目操作符

   && :与运算符,就是并且的意思(一假则假)

    || :或运算符,就是或者的意思(一真则正)

 7.1 逻辑取反运算符

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

     #include <stdio.h>

     int main()

     {

            int flag = 0;

            if(!flag)

            {

                    printf("do something\n");

            }

            return 0;

     }

2. 如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真 所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。

7.2 与运算符

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

2. ⽐如:如果我们想表示⽉份是3⽉到5⽉,是春天。

    int month = 0; 

    scanf("%d", &month);

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

    {

           printf("春季\n");

    }

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

7.3 或运算符

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

2. ⽐如:如果我们想表示⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天。

    int month = 0;

    scanf("%d", &month);

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

    {

           printf("冬季\n");

    }

//输⼊⼀个年份year,判断year是否是闰年
//闰年判断的规则:
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年
int main()
{
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		printf("是闰年\n");
	return 0;
}

 7.4 短路

1. C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为“短路”。

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

3. 上面的表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季),所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏

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

5. 上面的表达式中如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季),所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数

6. 练习:阅读代码,计算代码输出的结果

    #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\nb = %d\nc = %d\nd = %d\n", a, b, c, d);//1 2 3 4
         return 0;
}

   本篇文章已完结,谢谢支持哟 ^^ !!!

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

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

相关文章

Flutter实战记录-协作开发遇到的问题

一.前言 Android项目使用了混合架构&#xff0c;部分模块使用Flutter进行开发。在电脑A上开发的项目提交到git仓库&#xff0c;电脑B拉取后进行操作&#xff0c;遇到两个问题&#xff0c;特此做一下记录&#xff1b; 二.问题A Settings file ‘D:\xxx\settings.gradle’ line…

【生信技能树】数据挖掘全流程

R包的安装&#xff0c;每次做分析的时候先运行这段代码把R包都安装好了&#xff0c;这段代码不需要任何改动&#xff0c;每次分析直接运行。 options("repos""https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packag…

号外!IP SSL证书申请只需十分钟!

JoySSL官网 注册码230918 IP SSL证书是一种专为IP地址设计的SSL证书&#xff0c;它使得基于IP地址的网站或服务能够实现HTTPS加密&#xff0c;确保数据在传输过程中的安全性和完整性。以下是关于IP SSL证书的一些技术性要点和申请流程概述&#xff1a; 一、IP SSL证书技术要点…

搭建Docker私服镜像仓库Harbor

1、概述 Harbor是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker Compose 快速部署。 …

CLion 写 Rust 报Project directory `/Users/.../rsheets` does not exist.

每次打开CLion都会看到像下面这样的报错&#xff0c;Project directory /Users/.../rsheets does not exist.&#xff0c;虽然不会影响你写代码&#xff0c;但每次看到还是不舒服&#xff0c;所以研究一下怎么解决。 原因是这样的&#xff0c;每当我们创建一个 Cargo 项目&…

揭秘全网都在搜索的抖音快速涨10000粉的方法,打造真实粉丝海洋!巨量千川投流

抖音作为当下最热门的社交媒体平台之一&#xff0c;拥有数以亿计的用户。对于许多用户来说&#xff0c;快速涨粉成为了一个追逐的目标。在这篇文章中&#xff0c;我们将揭秘一些全网都在搜索的抖音快速涨粉方法&#xff0c;帮助你打造属于自己的真实粉丝海洋。巨量千川投流&…

会员卡积分收银源码系统 支持多门店系统 带完整的安装代码包以及安装搭建教程

在数字化浪潮的推动下&#xff0c;传统零售行业面临着巨大的转型压力。为了满足现代消费者多样化的需求&#xff0c;提高门店管理效率和顾客满意度&#xff0c;小编给大家分享一款会员卡积分收银源码系统——支持多门店系统&#xff0c;并附带了完整的安装代码包以及安装搭建教…

SpringBoot 集成 FFmpeg 解析音视频

文章目录 1 摘要2 核心 Maven 依赖3 核心代码3.1 FFmpeg 解析音视频工具类3.2 音视频文件信息参数3.3 音视频文件上传Controller3.4 application 配置文件 4 测试数据4.1 视频文件解析4.2 音频文件解析 5 注意事项5.1 文件必须在本地 6 推荐参考文档7 Github 源码 1 摘要 FFmp…

element-plus表单上传,唯一替换文件校验,封装方法统一管理

<el-formref"ruleFormRef":model"ruleForm":rules"rules"label-width"110px" ><el-form-item label"语言成绩材料" prop"languageList"><div class"dis-flex w100"><el-uploadref…

Elastic Stack--04-1--Kibana查数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Kibana查数1.查询所有记录2.匹配id字段matchterm 3.bool[复合查询]4.业务查询 Kibana查数 在ElasticSearch中支持两种检索方式 通过使用REST request URL 发送检索…

计算机网络实验1:交换机基本配置管理

实验目的和要求 安装Packer Tracer&#xff0c;了解Packer Tracer的基本操作掌握交换机基本命令集实验项目内容 认识Packet Tracer软件 交换机的基本配置与管理 交换机的端口配置与管理 交换机的端口聚合配置 交换机划分Vlan配置 实验环境 硬件&#xff1a;PC机&#x…

UML之用例图

1.用例图 用例图指参与者&#xff0c;用例&#xff0c;边界以及它们之间的关系构成的用于描述系统功能的视图。说明是谁要使用系统&#xff0c;以及可以使用该系统可以做些什么。展示了一个外部用户能够观察到的系统功能模型图 2.用例图的元素 &#xff08;1&#xff09;参与…

视频拼接融合产品的产品与架构设计(二)

视频拼接融合产品的产品与架构设计一 以上是第一期&#xff0c;以前思考的时候还是比较着急&#xff0c;现在思考的更多了&#xff0c;现实世界的拼接更加需要我们沉下心来做&#xff0c;尤其是对于更多画面&#xff0c;画面更加清晰怎么做 本篇章不在于其他功能&#xff0c;在…

【记录】Python3| 将 PDF 转换成 HTML/XML(✅⭐PyMuPDF+tqdm)

本文将会被汇总至 【记录】Python3&#xff5c;2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果&#xff08;汇总&#xff09;&#xff0c;更多其他工具请访问该文章查看。 文章目录 PyMuPDF 使用体验与评估1 安装指南2 测试代码3 测试结果3.1 转 HTML …

谷歌地图商家采集在外贸客户开发中的作用和意义

谷歌地图商家采集在外贸客户开发中扮演着至关重要的角色&#xff0c;其主要作用和意义体现在以下几个方面&#xff1a; 精准定位目标市场&#xff1a;通过谷歌地图&#xff0c;外贸人员可以根据特定的行业关键词&#xff08;如“fabric stores”&#xff09;搜索目标国家或地区…

《十日终焉》中的定律整理-向虫队学习(举例+持续更新)

1、二八定律 二八定律&#xff0c;又称帕累托法则&#xff0c;也叫巴莱多定律。 是19世纪末20世纪初意大利经济学家巴莱多发明的。其中指出&#xff0c;约仅有20%的因素影响80%的结果。也就是说&#xff1a;所有变因中&#xff0c;最重要的仅有20%&#xff0c;虽然剩余的80%占…

基于Laravel 10 + Vue(scui) + MySQL的快速开发的后台管理系统

​ 系统介绍 ​基于Laravel 10 Vue(scui) MySQL的快速开发的后台管理系统 版权申明 禁止将本产品用于含诈骗、赌博、色情、木马、病毒等违法违规业务使用。 代码仓库 gitee地址&#xff1a; 基础版本 内置模块 用户管理&#xff1a;用于维护管理系统的用户&#xff0c…

格雷希尔GripSeal:E10系列低压信号电测试连接器,应用于新能源汽车的DCR测试和EOL测试

新能源车的电驱动、电池包等都有一些信号接口&#xff0c;从几针到几十针不等&#xff0c;而且每种接口都有独特的电性能要求&#xff0c;这些接口在电池包进DCR测试或是EOL测试时&#xff0c;为了满足这些信号接口的需求&#xff0c;我们设计了E10系列信号针快速接头&#xff…

【吃透Java手写】4-Tomcat-简易版

【吃透Java手写】Tomcat-简易版-源码解析 1 准备工作1.1 引入依赖1.2 创建一个Tomcat的启动类 2 线程池技术回顾2.1 线程池的使用流程2.2 线程池的参数2.2.1 任务队列&#xff08;workQueue&#xff09;2.2.2 线程工厂&#xff08;threadFactory&#xff09;2.2.3 拒绝策略&…

JAVA使用Apache POI动态导出Word文档

文章目录 一、文章背景二、实现步骤2.1 需要的依赖2.2 创建模板2.3 书写java类2.3.1 模板目录2.3.2 Controller类2.3.2 工具类 2.4 测试2.4.1 浏览器请求接口2.4.2 下载word 三、注意事项四、其他导出word实现方式 一、文章背景 基于Freemarker模版动态生成并导出word文档存在弊…