IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C杂讲:运算符 -> 正文阅读

[C++知识库]C杂讲:运算符

目录

知识点1【算术运算符】

?知识点2【逻辑运算符】

!逻辑非

逻辑 && (重要)

逻辑&& 短路特性

逻辑||

逻辑|| 也有短路特性:

知识点3【位运算符】二进制位操作(重要)

&:按位与

|:按位或?

~:按位取反

^:按位异或

<<?左移运算符: 左边丢弃 右边补0

>> 右移运算符:

知识点4【?:】

知识点4【,】

知识点5【复合运算符】

知识点6【++ -- 运算符】

知识点6【优先级】请分析已有的代码


知识点1【算术运算符】

+、-、*、/、%等

a / b: 取整 (a,b可以为整数,也可以为浮点数 如果a b为整数 表示相除后取整 如果 a b只要有一个为浮点数 则表示除法运算)

a % b: 取余 必须为整数

void test06()
{
	printf("%d\n", 5/2);//取整 2
	printf("%d\n", 5%2);//余数 1
}
int main(int argc,char *argv[])
{
	test06();
	return 0;
}

?

案例:键盘输入一个数 是否能被3整除

void test07()
{
	int num = 0;
	//键盘输入一个int数
	printf("请输入一个整形数据:");
	scanf("%d", &num);

	//判断是否能被3整数
	if(num%3 == 0)
	{
		printf("ok\n");
	}
	else
	{
		printf("no\n");
	}
}
int main(int argc,char *argv[])
{
	test07();
	return 0;
}

练习:键盘输入一个4位数 请取出每位上的数值

提示:取整与取余

void test08()
{
	printf("%d\n", 5/2);//取整
	printf("%f\n",5/2.0f);//除
}

?知识点2【逻辑运算符】

!逻辑非

真:1(或其他非零值,c++ bool类型变量用 true表示真)

假:0(c++ bool 类型变量用 false表示假)

!(假) == (真)

!(真) == (假)

void test09()
{
	printf("%d\n", !1);//0
	printf("%d\n", !0);//1

	//C语言  0为假 其他都为真  -1
	printf("%d\n", !-1);//0
}
int main(int argc,char *argv[])
{
	test09();
	return 0;
}

运行结果:

逻辑 && (重要)

A && B A B同时为真 整个表达式结果为真。 A B只要有一个为假 整个表达式为假

void test10()
{
	if( (2>3) && (5>4) )
	{
		printf("ok\n");
	}
	else
	{
		printf("no\n");
	}
}
int main(int argc,char *argv[])
{
	test10();
	return 0;
}

运行结果:no

逻辑&& 短路特性

A && B 如果A为假 系统不会执行B 这就是&&的短路特性

void test11()
{
	int num=10;
	printf("比较之前num = %d\n",num);

	(2>3) && (num=100);
	printf("比较之后num = %d\n",num);


}
int main(int argc,char *argv[])
{
	test11();
	return 0;
}

运行结果:

逻辑||

A || B 只要A B任意一个为真 整个表达式结果为真,A B同时为假的时候 结果才为假。

逻辑|| 也有短路特性:

只要A为真 编译器不会判断B的真假。

void test12()
{
	int num=10;
	printf("比较之前num = %d\n",num);//10

	(3>2) || (num=100);//num=100得不到执行
	printf("比较之后num = %d\n",num);//10
}
int main(int argc,char *argv[])
{
	test12();
	return 0;
}

运行结果:

?综合案例:

知识点3【运算符】二进制位操作(重要)

&:按位与

语法:全1为1 其他为0

? ? 1010 1010

& 1111 0000

--------------------

? ?1010 0000

特点:和1相与 保持不变 和0相与 清零

应用场景:将固定为清

|:按位或?

语法:有1就为1 全0才为0

? 1010 1010

| 1111 0000

----------------------

? 1111 1010

特点:和0相或 保持不变 1相或 置1.

应用场景:将固定为置1.

案例:将1010 1010的第2、3为置1 其他为保持不变

? 1010 1010

| 0000 1100

-------------------

? 1010 1110

~:按位取反

语法:0变1 1变0

~1010 1010 == 0101 0101

应用场景:配合 & | 操作

^:按位异或

语法:相同为0 不同为1

? 1010 1010

^ 0000 1111

----------------------

? 1010 0101

特点:和0异或 保持不变 和1异或 取反

应用场景:将固定的为 发生高低电频 翻转。

案例:将1010 1010 的第0位 发生翻转.

? 1010 1010

^ 0000 0001

----------------------

? 1010 1011

^ 0000 0001

---------------------

? 1010 1010

<<?左移运算符: 左边丢弃 右边补0

注意:移动的位数 不要 超过自身长度

1010 1100 << 2

>> 右移运算符:

1010 1100 >> 2

右移分类:逻辑右移 算术右移

????????逻辑右移:右边丢弃 左边补0.

????????算术右移:

????????无符号数:右边丢弃 左边补0

????????有符号数:

????????????????正数:右边丢弃 左边补0

????????????????负数:右边丢弃 左边补1

右移基本上是右边丢弃 左边补0 只有负数且算术右移 左边才会补1.

逻辑右移和算术右移 是编译器决定,但是我们可以检测。

练习:自己写代码 判断你的编译器 是逻辑右移还是算术右移。

综合案例:将data的第1、5清0, 第3, 4位置1 其他为保持不变

unsigned char data = 0xaa;//1010 1010

将data的第1、5清0:

data = data & 1101 1101

1101 1101 = ~(0010 0010) =~(0010 0000 | 0000 0010)

0010 0000 = 0000 0001 << 5

0000 0010 = 0000 0001 << 1

1101 1101 = ~(0x01 << 5 | 0x01 << 1)

data = data & ~(0x01 << 5 | 0x01 << 1)

第3, 4位置1:

data = data | 0001 1000;

0001 1000 = 0001 0000 | 0000 1000

??????????????????= 0x01 << 4 |?0x01 << 3

data = data | (0x01 << 4 | 0x01 << 3);

知识点4【?:】

表达式1 ? 值1:值2

语法:如果表达式1 为真 整个表达式的值为“值1” 否则为“值2”

案例:

void test01()
{
	int ret = 0;
	ret = 3>2? 5:6;

	printf("ret = %d\n", ret);//5
}
int main(int argc,char *argv[])
{
	test01();
	return 0;
}

知识点4【,】

案例:逗号运算符

void test02()
{
	int data1 = 0;
	int data2 = 0;

	data1 = 3,4,5,6;
	data2 = (3,4,5,6);
	printf("data1 = %d\n",data1);//3
	printf("data2 = %d\n",data2);//6

}
int main(int argc,char *argv[])
{
	test02();
	return 0;
}

知识点5【复合运算符】

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

a += b; ==> a = a + b;

a *= b; ==> a= a * b;

注意:=号 右边必须看成一个整体

案例:

void test03()
{
	int data = 3;
	//将=右边看成一个整体
	data *= 3+5;//data = data * (3+5);
	printf("data = %d\n",data);//24
}
int main(int argc,char *argv[])
{
	test03();
	return 0;
}

知识点6【++ -- 运算符】

++i 或 --i 加、减 使用

i++ 或 i-- 使用 加、减

案例:

void test04()
{
	int i = 3;
	int j = 0;

	//++左边 先加 后使用
	j = ++i;//i=i+1;  j=i;

	printf("i = %d, j = %d\n", i,j);//4  4
}

案例:

void test04()
{
	int i = 3;
	int j = 0;
	
	//先使用  后 加、减
	j = i++;//j=i; i=i+1;

	printf("i = %d, j = %d\n", i,j);//4  3
}
int main(int argc,char *argv[])
{
	test04();
	return 0;
}

注意:i++ 或 ++i 作为单独的指令 没有区别

void test05()
{
	int i=3;
	int j=3;
	
	i++;//i=i+1;
	printf("i = %d\n",i);//4

	++j;//j=j+1
	printf("j = %d\n",j);//4


}
int main(int argc,char *argv[])
{
	test05();
	return 0;
}

知识点6【优先级】请分析已有的代码

优先级 先执行 同级别的优先级 要看结合性

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 17:55:54  更:2022-05-24 17:57:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 9:24:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码