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

news2024/11/17 21:48:39

目录

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

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;
}

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

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

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

相关文章

汽车EDI:安通林Antolin EDI 项目案例

安通林&#xff08;Antolin&#xff09;是一家全球性的汽车零部件制造商&#xff0c;专注于汽车内饰系统和零部件的生产&#xff0c;致力于创新和采用先进的技术。近年来 安通林Antolin 推动其供应商部署EDI系统&#xff0c;使得双方能够通过EDI传输业务单据&#xff0c;极大提…

IDEA使用技巧2—发布web项目

作者&#xff1a;私语茶馆 1.War包类型 发布Web项目有两种模式&#xff1a;war和war exploded&#xff0c; war模式&#xff1a;将WEB工程以包的形式上传到服务器 &#xff1b;war exploded模式&#xff1a;将WEB工程以当前文件夹的位置关系上传到服务器&#xff1b; war ex…

java日历类概述

Java中的Calendar类位于java.util包下&#xff0c;它是一个抽象类&#xff0c;用于表示和管理日期及时间。Calendar类并不是直接实例化的&#xff0c;而是通过其提供的静态方法来获取实例。通常情况下&#xff0c;当你尝试创建一个Calendar实例时&#xff0c;实际上你得到的是G…

在 Navicat 17 中探索表配置文件

距离 Navicat 17&#xff08;英文版&#xff09;的发布还有不到一周的时间&#xff0c;现在是深入研究新的表配置文件功能的最佳时机。它允许我们保存经常用于表的筛选、排序和列显示的不同组合。所以&#xff0c;事不宜迟&#xff0c;让我们开始吧&#xff01; 创建表配置文件…

LeetCode 106.从中序与后序遍历序列构造二叉树

LeetCode 106.从中序与后序遍历序列构造二叉树 1、题目 题目链接&#xff1a;106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并…

思维导图在线怎么制作?推荐这些工具

思维导图在线怎么制作&#xff1f;在如今的快节奏时代中&#xff0c;思维导图作为一种高效的信息组织与思考工具&#xff0c;受到了广泛的应用。在线制作思维导图成打破了时间和空间的限制&#xff0c;使得团队协作变得更加便捷&#xff0c;个人创作也更为灵活。以下是四款备受…

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024)

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024) 会议简介 2024年国际生物医学、医学成像和信号处理会议&#xff08;ICBMISP2024&#xff09;很高兴邀请您提交主题为“生物医学、医学图像和信号处理的当前挑战和未来前景”的原稿。通过ICBMISP2024&#xff0c;生物…

鸿蒙开发接口Ability框架:【DataAbilityHelper模块(JS端SDK接口)】

DataAbilityHelper模块(JS端SDK接口) 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 本模块接口仅可在FA模型下使用。 使用说明 使用前根据具体情况引入如下模块 import featureAbility from …

i春秋-Backdoor

题目 考点 git源码泄露 Linux文件恢复 代码审计 http 解题 参考wp https://blog.csdn.net/cbhjerry/article/details/105791056https://www.pianshen.com/article/19461342501/扫描 题目给出提示&#xff1a;敏感文件泄漏 于是使用dirsearch扫一下 python dirsearch.py -…

ASP.NET一个简单的媒体播放器的设计与实现

摘 要 本论文所描述的播放器是在Microsoft Visual Studio .NET 2003平台下利用Visual Basic.NET语言完成的。使用Visual Basic.NET提供的Windows Media Player控件以及文件处理&#xff0c;最终实现一款别致的&#xff0c;贴近用户操作习惯的媒体播放器。 该播放器实现了对WAV…

原子学习笔记4——GPIO 应用编程

一、应用层如何操控 GPIO 与 LED 设备一样&#xff0c;GPIO 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/gpio 目录下&#xff0c;如下所示&#xff1a; gpiochipX&#xff1a;当前 SoC 所包含的 GPIO 控制器&#xff0c;我们知道 I.MX6UL/I.MX6ULL 一共包…

设计模式——行为型模式——策略模式(含实际业务使用示例、可拷贝直接运行)

目录 策略模式 定义 组成和UML图 代码示例 实际业务场景下策略模式的使用 策略模式优缺点 使用场景 JDK中使用策略模式示例 参考文档 策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化…

PC端与bluetooth蓝牙虚拟串口通信

应该采用RFCOMM虚拟串口方式来进行通信&#xff0c;原理跟socket通信类似&#xff0c;不同的是使用的通信协议不同&#xff0c;本人结合相关的API&#xff0c;做了以下最简单的封装。 1、获取本地蓝牙设备与附近蓝牙设备信息 2、通信类 /* 通信类&#xff1a;只是对于客户端通…

Live800:企业营销利用利用社区建设培养忠诚粉丝

社区建设是一种与顾客建立长期关系的活动&#xff0c;在社区中顾客可以在有限的时间和空间里&#xff0c;与企业的营销人员进行互动。通过企业提供的各种资源&#xff0c;例如产品、服务、促销活动、信息等&#xff0c;吸引顾客参与社区建设。与顾客建立长期关系&#xff0c;从…

【碳化硅】陷阱(traps)对SiC MOSFET阈值电压漂移的影响

这篇文章是关于硅碳化物(SiC)金属氧化物半导体场效应晶体管(MOSFET)的阈值电压漂移问题的研究。文章的主要目的是通过研究不同的陷阱(traps)对阈值电压漂移的影响,来解决SiC MOSFET的可靠性问题。 摘要(Abstract) 文章提出了一种研究方法,用于分析影响SiC MOSFET阈值…

【练习4】

1.两数之和 暴力&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();vector<int> res(2, -1); // 初始化结果为-1for (int i 0; i < n; i) {int temp nums[i];for (int j i 1; j <…

vivado Spartan-7 配置存储器器件

下表所示闪存器件支持通过 Vivado 软件对 Spartan -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、空白检查、编程和验证。赛灵…

用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)MicroSIP定时拨号

首先直接上结果吧&#xff0c;MicroSIP 助手&#xff0c;控制MicroSIP自动拨号&#xff0c;定时呼叫的非常实用小工具&#xff01; 在使用MicroSIP 助手之前&#xff0c;我们需要了解MicroSIP是什么&#xff0c;MicroSIP是一个SIP拨号软件&#xff0c;支持注册任意SIP平台实现拨…

独家原创 | BiTCN-BiGRU-CrossAttention融合时空特征的高创新预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

NSS题目练习2

[LitCTF 2023]我Flag呢&#xff1f; 打开题目后查看源码即可发现flag [第五空间 2021]WebFTP 看到提示&#xff0c;首先想到用dirsearch扫描链接&#xff0c;看是否存在git泄露 发现存在git泄露&#xff0c;用githack解决 克隆提示目录为空&#xff0c;说明不正确&#xff0c…