栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C杂讲:运算符

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C杂讲:运算符

目录

知识点1【算术运算符】

 知识点2【逻辑运算符】

!逻辑非

逻辑 && (重要)

逻辑&& 短路特性

逻辑||

逻辑|| 也有短路特性:

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

&:按位与

|:按位或 

~:按位取反

^:按位异或

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

>> 右移运算符:

知识点4【?:】

知识点4【,】

知识点5【复合运算符】

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

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


知识点1【算术运算符】

+、-、*、/、%等

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

a % b: 取余 必须为整数

void test06()
{
	printf("%dn", 5/2);//取整 2
	printf("%dn", 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("okn");
	}
	else
	{
		printf("non");
	}
}
int main(int argc,char *argv[])
{
	test07();
	return 0;
}

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

提示:取整与取余

void test08()
{
	printf("%dn", 5/2);//取整
	printf("%fn",5/2.0f);//除
}

 知识点2【逻辑运算符】

!逻辑非

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

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

!(假) == (真)

!(真) == (假)

void test09()
{
	printf("%dn", !1);//0
	printf("%dn", !0);//1

	//C语言  0为假 其他都为真  -1
	printf("%dn", !-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("okn");
	}
	else
	{
		printf("non");
	}
}
int main(int argc,char *argv[])
{
	test10();
	return 0;
}

运行结果:no

逻辑&& 短路特性

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

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

	(2>3) && (num=100);
	printf("比较之后num = %dn",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 = %dn",num);//10

	(3>2) || (num=100);//num=100得不到执行
	printf("比较之后num = %dn",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 = %dn", 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 = %dn",data1);//3
	printf("data2 = %dn",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 = %dn",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 = %dn", i,j);//4  4
}

案例:

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

	printf("i = %d, j = %dn", 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 = %dn",i);//4

	++j;//j=j+1
	printf("j = %dn",j);//4


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

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

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

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917417.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号