操作符(算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符)

news2024/11/24 6:57:01

目录

算术操作符

移位操作符

移位规则

位操作符

交换两个整形变量的写法

赋值操作符

单目操作符

sizeof和数组的纠缠

++和--运算符

多组输入的方案

关系操作符

逻辑操作符


算术操作符

-- 加法操作符(+):用于将两个值相加。

-- 减法操作符(-):用于将两个值相减。

-- 乘法操作符(*):用于将两个值相乘。

-- 除法操作符(/):用于将两个值相除得到商。

-- 取余操作符(%):用于将两个值相除得到余数。

除法:

        1.整数除法(除号两边都是整数)

        2.浮点数除法(除号两边至少有一个小数) 

        3.除数不能为零,除零报错(error C2124: 被零除或对零求模)

取余:m % n

        1.余数范围为【1,n-1】

        2.取余的操作数必须都是整数

        3. 不能对零取余,取余报错(error C2124: 被零除或对零求模)

移位操作符

-- 左移操作符(<<):将一个二进制数向左移动指定的位数,相当于该数乘以2的移动次幂

-- 右移操作符(>>):将一个二进制数向右移动指定的位数,相当于该数除以2的移动次幂

移位规则

左移

        左边抛弃、右边补0

右移

        1. 逻辑移位(逻辑移位是指将二进制数进行无符号移位)

                左边用0填充,右边丢弃

        2. 算术移位(算术移位是指将二进制数进行有符号移位)

                左边用原该值的符号位填充,右边丢弃

算术右移举例
#include<stdio.h>
int main()
{
	//整数在内存中存储的是补码
	
	signed int a = 15;
	
	//正数原、反、补码相同
	//原码:0000 0000 0000 0000 0000 0000 0000 1111
	//反码:0000 0000 0000 0000 0000 0000 0000 1111
	//补码:0000 0000 0000 0000 0000 0000 0000 1111

	signed int b = -15;
	//负数原、反、补不同
	//原码:1000 0000 0000 0000 0000 0000 0000 1111
	//反码:1111 1111 1111 1111 1111 1111 1111 0000
	//补码:1111 1111 1111 1111 1111 1111 1111 0001

	//a、b右移1位 - 移动的就是a、b的补码的二进制序列
	int c = a >> 1;
	//           [补]                                    [舍] 
	//移位后补码:0[0]000 0000 0000 0000 0000 0000 0000 111[1]
	//反码:      0 0 000 0000 0000 0000 0000 0000 0000 111
	//原码:      0 0 000 0000 0000 0000 0000 0000 0000 111 - 对应十进制 - 7


	int d = b >> 1;
	//           [补]                                    [舍] 
	//移位后补码:1[1]111 1111 1111 1111 1111 1111 1111 000[1]
	//反码:      1 1 111 1111 1111 1111 1111 1111 1110 111
	//原码:      1 0 000 0000 0000 0000 0000 0000 0001 000 - 对应十进制 - -8

	printf("%d\n", c);
	printf("%d\n", d);
	return 0;
}

注意:移位运算不会对原数据有任何的改变。

警告⚠ :

        对于移位运算符,不要移动负数位,这个是标准未定义的。

例如:

                int num = 10;

                num>>-1;//error

  

位操作符

-- 按位与操作符(&):将两个二进制数对应的位相与

-- 按位或操作符(|):将两个二进制数对应的位相或

-- 按位异或操作符(^):将两个二进制数对应的位异或

#include<stdio.h>
int main()
{
	int a = 3;
	//补码:0000 0000 0000 0000 0000 0000 0000 0011
	int b = -5;
	//原码:1000 0000 0000 0000 0000 0000 0000 0101
	//反码:1111 1111 1111 1111 1111 1111 1111 1010
	//补码:1111 1111 1111 1111 1111 1111 1111 1011
	
	//& - 对于的补码序列有0为0,全1为1
	printf("%d\n",a & b);
	//3 补码:0000 0000 0000 0000 0000 0000 0000 0011
	//-5补码:1111 1111 1111 1111 1111 1111 1111 1011
	//  &   :0000 0000 0000 0000 0000 0000 0000 0011 - 对应十进制 - 3
	
	//& - 对于的补码序列有1为1,全0为0
	printf("%d\n", a | b);
	//3 补码:0000 0000 0000 0000 0000 0000 0000 0011
	//-5补码:1111 1111 1111 1111 1111 1111 1111 1011
	//  |   :1111 1111 1111 1111 1111 1111 1111 1011 - 补码
	//       1000 0000 0000 0000 0000 0000 0000 0101 - 原码 - 对应十进制 - -5

	// ^ - 对于的补码序列不同为1,相同为0
	printf("%d\n", a ^ b);
	//3 补码:0000 0000 0000 0000 0000 0000 0000 0011
	//-5补码:1111 1111 1111 1111 1111 1111 1111 1011
	//  ^   :1111 1111 1111 1111 1111 1111 1111 1000 - 补码
	//       1000 0000 0000 0000 0000 0000 0000 1000 - 原码 - 对应十进制 - -8
	return 0;
}

交换两个整形变量的写法

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	printf("交换前:a = %d,b = %d\n", a, b);
	int temp = 0;
	temp = a;
	a = b;
	b = temp;
	printf("交换后:a = %d,b = %d\n", a, b);
	return 0;
}

        这段代码展示了如何使用一个临时变量来交换两个变量的值。具体来说,代码中定义了两个整型变量a和b,并初始化为1和2。然后使用printf函数将它们的原始值打印出来。 接下来,代码定义了一个整型变量temp,并将a的值赋给temp,相当于把a的值复制到了temp中。然后,将b的值赋给a,相当于把b的值覆盖了a中原来的值。最后,将temp的值赋给b,相当于把a中原来的值存储到了b中。这样,a和b的值就互换了。 最后,代码使用printf函数再次将a和b的值打印出来,以显示它们已经被交换了。

  

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	printf("交换前:a = %d,b = %d\n", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("交换后:a = %d,b = %d\n", a, b);
	return 0;
}

        这段代码展示了一种不使用临时变量来交换两个变量的值的方法。具体来说,代码中定义了两个整型变量a和b,并初始化为1和2。然后使用printf函数将它们的原始值打印出来。

接下来,代码通过一系列的加减运算来交换a和b的值。首先将a和b的值相加,并将结果存储到a中。然后将新的a值减去旧的b值,并将结果存储到b中。最后将新a值减去刚才计算得到的新b的值,并将结果存储到a中。利用加减法运算完成了交换操作。最后,代码使用printf函数再次将a和b的值打印出来,以显示它们已经被交换了。注意,这种方法虽然不需要使用额外的变量来存储临时值,但需要进行多次加减运算,可能会影响代码的运行效率,同时由于是加法操作,会造成数据进行溢出。

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	printf("交换前:a = %d,b = %d\n", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后:a = %d,b = %d\n", a, b);
	return 0;
}

        这也是一段C语言代码,同样实现了两个变量的值交换功能,但是它使用了异或运算(^)来完成交换操作。 具体地,首先定义了两个整型变量a和b,且分别赋值为1和2。然后输出交换前a和b的值。 接着,使用异或运算(^)按位进行交换,具体地,a先和b进行异或运算,然后将结果赋值给a。这时a变成了3(0011),同时由于异或运算支持交换律,所以此时b异或上a(即原来的a)就相当于b异或上新的a(即原来的a异或上原来的b),得到的结果赋值给b。这时b变成了1。最后再利用异或运算(^)完成a和b的值交换。 最后输出交换后a和b的值,即完成了值交换的操作。

赋值操作符

赋值操作符可以连续使用,

比如:

        int a = 10;

        int x = 0;

        int y = 20;

        a = x = y+1;//连续赋值

等价于:      

         int a = 10;

        int x = 0;

        int y = 20;

        x = y+1;

        a = x;

这样的写法是不是更加清晰,更加容易辨识。

复合赋值符:+=  -=  *=  /=  %=  >>=  <<=  &=  |=  ^=

单目操作符

单目操作符是一种只需要一个操作数的操作符,通常用于对单个变量或值进行操作。

sizeof和数组的纠缠

#include <stdio.h>
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));
}
void test2(char ch[])
{
	printf("%d\n", sizeof(ch));
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(ch));
	test1(arr);
	test2(ch);
	return 0;
}

        在主函数中,首先定义了一个大小为10的int类型和char类型的数组arr和ch,分别使用sizeof打印出数组大小。此时,打印结果应该是40和10,因为一个int类型的元素占用4个字节,而数组中共有10个元素,所以整个数组占用40个字节。而一个char类型的元素占用1个字节,而数组中共有10个元素,所以整个数组占用10个字节。 然后调用test1和test2函数,分别将arr和ch数组作为参数传递给函数。在函数调用中,实际上传递的是数组的指针,即数组的首元素的地址。因此,在函数内部使用sizeof操作符打印出的大小为指针的大小,即在32位系统中为4个字节,而在64位系统中为8个字节。

++和--运算符

//++和--运算符
#include <stdio.h>
int main()
{
    int a = 10;

    //前置++和--
    int x = ++a;
    //先对a进行自增,然后再使用a,也就是表达式的值是a自增之后的值。x为11
    int y = --a;
    //先对a进行自减,然后再使用a,也就是表达式的值是a自减之后的值。y为10
    
    //后置++和--
    int x = a++;
    //先对a先使用,再增加,这样x的值是10,之后a变成11
    int y = a--;
    //先对a先使用,再自减,这样y的值是11,之后a变成10
    return 0;
}

        前置自增运算符“++”表示在使用变量之前先将变量的值加1,而后置自增运算符“++”表示先使用变量的值,然后再将变量的值加1。前置自减和后置自减运算符“--”也能使用相同的逻辑。

        在程序中,定义了一个整型变量a并初始化为10。接下来,使用前置自增运算符和前置自减运算符分别对变量a进行一次自增和自减操作,并将结果分别赋值给变量x和y。由于是前置运算符,因此表达式的值在使用变量之前就已经发生改变了,所以变量x和y的值分别为11和10。 接下来,再次使用变量a进行自增和自减操作,但这次使用的是后置自增“++”和后置自减“--”运算符。由于是后置运算符,表达式的值是先使用变量,然后再执行自增或自减操作,因此变量x和y的值分别为10和11,最后变量a的值变成了10。

        总结:前置自增和自减运算符在使用变量之前就对变量进行了加减操作,而后置自增和自减运算符在表达式的值确定之后才对变量进行加减操作。

#include<stdio.h>
int main()
{
	int a = 5;
	//0000 0000 0000 0000 0000 0000 0000 0101
	//0000 0000 0000 0000 0000 0000 0001 0000
	a |= (1 << 4);
	printf("%d\n", a);
	//0000 0000 0000 0000 0000 0000 0001 0101
	//1111 1111 1111 1111 1111 1111 1110 1111
	//0000 0000 0000 0000 0000 0000 0000 0101
	a &= (~(1 << 4));
	printf("%d\n", a);
	return 0;
}

多组输入的方案

#include<stdio.h>
int main()
{
	int n = 0;
	while (scanf("%d", &n) == 1)
	{
		printf("%d\n", n);
	}
	return 0;
}


#include<stdio.h>
int main()
{
	int n = 0;
	while (scanf("%d", &n) != EOF)
	{
		printf("%d\n", n);
	}
	return 0;
}


#include<stdio.h>
int main()
{
	//#define EOF    (-1)
	/*
		-1的补码
		1111 1111 1111 1111 1111 1111 1111 1111
		~(-1)
		0000 0000 0000 0000 0000 0000 0000 0000
		while(0)为假就不执行了
	*/
	int n = 0;
	while (~scanf("%d", &n))
	{
		printf("%d\n", n);
	}
	return 0;
}

关系操作符

>  >=  <  <=  !=   

        注意:不可以比较字符串

逻辑操作符

&&     逻辑与

||        逻辑或

计算结果是真,用1表示;计算结果为假,用0表示。

小试牛刀

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

        1.由于a++是后置++,所以a是先使用后自增,所以a++表达式是0,由于是逻辑与(&),并且逻辑与(&)具有短路的特点,只要有假就是假,后的表达式++b和d++都不会执行。

        所以结果是:1 2 3 4

        2.由于a++是后置++,所以a是先使用后自增,所以a++表达式是0,由于是逻辑或(|),需要执行后面的表达式,由于++b是前置++,先自增后使用,++b的值为3,为真,并且逻辑或(&)具有短路的特点,只要一个为真就是着呢,后的表达式d++就不会执行。

        所以结果是:1 2 3 4

本次分享就到这里啦!

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

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

相关文章

算法修炼之练气篇——练气八层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

cv2BGR转化为RGB

import cv2 import matplotlib.pyplot as plt img cv2.imread(1.png,1)#1加载彩图 0加载灰度图 img2 cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#cv2读取是BGR 如果使用plt包要转换为RGB plt.subplot(1,2,1) plt.imshow(img2) plt.subplot(1,2,2) plt.imshow(img) plt.savefig(&qu…

【Java零基础入门篇】第 ⑥ 期 - 异常处理

博主&#xff1a;命运之光 专栏&#xff1a;Java零基础入门 学习目标 掌握异常的概念&#xff0c;Java中的常见异常类&#xff1b; 掌握Java中如何捕获和处理异常&#xff1b; 掌握自定义异常类及其使用&#xff1b; 目录 异常概述 异常体系 常见的异常 Java的异常处理机制…

【数学】通俗理解泰勒公式(牛顿迭代法有用到)

【数学】通俗理解泰勒公式&#xff08;牛顿迭代法有用到&#xff09; 文章目录 【数学】通俗理解泰勒公式&#xff08;牛顿迭代法有用到&#xff09;1. 介绍2. 通俗理解2.1 近似计算 3. 泰勒公式的推导4. 泰勒公式的定义5. 扩展 — 麦克劳林公式参考 1. 介绍 最近在看一些机器…

java异常的分类(常见的异常类型)

异常的分类 1. 编译时异常 在程序编译期间发生的异常&#xff0c;称为编译时异常&#xff0c;也称为受检查异常(Checked Exception) public class Person {int age;private String name;private String gender;// 想要让该类支持深拷贝&#xff0c;覆写Object类的clone方法即…

C语言—字符函数和字符串函数

字符函数和字符串函数 strlenstrcpystrcatstrcmpstrncpystrncatstrncmpstrstrstrtokstrerrorperror字符分类函数字符转换函数memcpymemmovememmcmpmemset C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在 常量字符…

ChatGPT最强对手Claude如何无门槛使用?

Claude&#xff0c;一个冉冉升起的新星&#xff0c;由 chatgpt 团队出来的员工开发的&#xff0c;由于他们对模型的一些发展理念不同&#xff0c;单独融资创建了 Claude&#xff0c;总体来说表现可圈可点&#xff0c;但整体看可能还不如 chatgpt4.0。 ChatGPT 眼中的 Claude C…

【产品应用】一体化电机在卡盘设备中的应用

在现代工业生产中&#xff0c;自动化程度的提高和生产效率的提升对于生产设备的要求也越来越高。卡盘设备作为自动化生产线中的重要组成部分&#xff0c;其设计和制造也必须适应现代工业的需求。一体化电机在卡盘设备中的应用&#xff0c;不仅可以提高生产效率和精度&#xff0…

线程状态是五种还是六种

从操作系统层面上描述线程状态 初始状态&#xff1a;仅仅是语言层面创建了线程对象,还没有与操作系统相关联.比如new 了一个Thread对象还没有调用start方法可运行状态&#xff1a;仅仅是语言层面创建了线程对象,还没有与操作系统相关联.比如new 了一个Thread对象还没有调用s…

微服架构基础设施环境平台搭建 -(二)Docker私有仓库Harbor服务搭建

微服架构基础设施环境平台搭建 -&#xff08;二&#xff09;Docker私有仓库Harbor服务搭建 通过采用微服相关架构构建一套以KubernetesDocker为自动化运维基础平台&#xff0c;以微服务为服务中心&#xff0c;在此基础之上构建业务中台&#xff0c;并通过Jekins自动构建、编译、…

【数学杂记】表达式中的 s.t. 是什么意思

今天写题的时候遇见了这个记号&#xff1a;s.t.&#xff0c;查了一下百度。 s.t.&#xff0c;全称 subject to&#xff0c;意思是“使得……满足”。 比如这个&#xff1a; 意思是存在 i i i&#xff0c;使得 i i i 满足 A i ≠ B i A_i\neq B_i Ai​Bi​. 运用这个记号…

MySQL面试题1(索引)

目录 1.MySQL如何实现索引机制 1.1InnoDb与MyISAM索引实现区别是是什么&#xff1f; 1.2一个表中如果没有创建索引&#xff0c;还会创建B树么&#xff1f; 2.说一下B树索引实现原理&#xff08;数据结构&#xff09; 2.1聚簇索引和非聚簇索引在B树实现区别是什么&#xff1…

【Python每日一练】总目录(更新至2023.5.12)

Python 2023.05 2023.05.11-2023.05.12 20230512 1. 跳跃游戏 V 2. 跳跃游戏 VI 3. 跳跃游戏 VII 20230511 1. 跳跃游戏 Jump Game I 2. 跳跃游戏 Jump Game II 3. 跳跃游戏 Jump Game III 4. 跳跃游戏 Jump Game IV 2023.05.01-2023.05.10 20230510 1. 石子游戏 Ston…

[googletest] --- 简易使用教程

1 googletest下载/官方sample分析 1.1 googletest源码下载编译 源码下载编译 // 下载 git clone https://github.com/google/googletest // 现在官方已经把 gtest 和 gmock 一起维护&#xff0c;所以这个 git 仓库还包含了 gmock。// 编译、安装 cd googletest-main mkdir b…

【申请教程】ChatGPT访问互联网插件

https://openai.com/blog/chatgpt-plugins 大家好&#xff0c;我是章北海mlpy 申请ChatGPT插件很久了&#xff0c;一直没下文 最近看到两种套路&#xff0c;我早上试了一下&#xff0c;看能否快速成功吧。 方法一&#xff1a;用ChatGPT帮忙写申请文案 [外链图片转存失败,源…

大数据如何助力营销(2)用户画像

用户画像是指根据用户的数据&#xff0c;构建出用户的特征和兴趣&#xff0c;从而对用户进行分类和个性化的过程。用户画像可以帮助营销人员更有效地触达目标客户&#xff0c;提高营销效果和转化率。 用户画像的价值 用户画像的价值主要体现在以下几个方面&#xff1a; 提升用…

IP协议介绍

文章目录 一、IP协议的基本认识二、IP的协议头格式三、网段划分四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址 一、IP协议的基本认识 IP在网络分层中属于网络层协议&#xff0c;传输层协议里的TCP协议解决的是可靠性问题&#xff0c;网络层协议里的IP协议能…

VScode自动滚屏cin、input输入问题解决方法

文章目录 前言一、输出自动滚屏二、解决cin或input之类的输入问题总结 前言 VScode 是一个轻量的文本编辑器&#xff0c;微软出品。很多人把它作为主要开发工具写代码&#xff0c;因为它几乎是万能的&#xff0c;想要什么功能就装什么插件&#xff0c;可以适用于几乎任何编程语…

如何和AI聊天

AI产品工具目录&#xff1a;AI产品目录 Prompt 在和AI聊天时&#xff0c;你得表明你需要啥&#xff0c;并且描述的越精确&#xff0c;AI回答的就越贴近你的预期&#xff0c;简单的对话&#xff0c;可以自己尝试&#xff0c;但是如果想做应用级别的就得学习这种聊天技术&#…

Flask celery异步发送邮件

首先安装celery pip install celery安装redis 一、Redis for Windows下载 之前微软维护了一份Windows版本的Redis&#xff0c;但是版本停留在3.2&#xff0c;并且也关闭了项目更新渠道。这里我们使用另外一位大神提供的Windows Redis&#xff0c;更新及时&#xff0c;用户量也…