C语言初阶----14~16操作符

算术操作符

  • 加法+

  • 减法-

  • 乘法*

  • 除法---- /

整形的除法: 1/2=0
浮点型的除法 1.0/2=0.5

  • 取模%

注: 取模操作符的两端必须是整数

移位操作符

  • 移位操作符,移动的是二进制,操作数只针对整数

  • >> 右移操作符
    << 左移操作符

//int–4个字节–32个比特位
// 正数7----原码,反码,补码相同
//00000000 00000000 00000000 00000111----原码
//00000000 00000000 00000000 00000111----反码
//00000000 00000000 00000000 00000111----补码

// 7 >> 1
//对补码操作,向右移动一位,补0
//00000000 00000000 00000000 00000011–3
// 7 << 1
//对补码操作,向左移动一位,补0
//00000000 00000000 00000000 00001110–14

//负数-7
//10000000 00000000 00000000 00000111----原码
//11111111 11111111 11111111 11111000----反码(原码符号位不变,其他位按位取反)
//11111111 11111111 11111111 11111001----补码(反码+1)

//数据存储的是补码,所以位移操作符操作的是补码;
//右移操作符
算数操作符–右边丢弃,左边补原符号位
逻辑操作符–右边丢弃,左边补零

// -7 >> 1
// //符号位不变,向右移动一位,补0
//11111111 11111111 11111111 11111100----补码
//11111111 11111111 11111111 11111011----反码
//10000000 00000000 00000000 00000100----原码
//-4

// -7<< 1
//符号位不变,向左移动一位
//11111111 11111111 11111111 11110010----补码
//11111111 11111111 11111111 11110001----反码
//10000000 00000000 00000000 00001110----原码
// -14

#include<stdio.h>
int main()
{
	printf("%d\n", 7 << 1);//14
	printf("%d\n", 7 >> 1);//3
	printf("%d\n", -7 << 1);//-14
	printf("%d\n", -7 >> 1);//-4

	return 0;
}


位操作符

位操作符-
&按(2进制)位与----同时为1,才为1
|按(2进制)位或----只要有1,就为1,两个同时为0,才为0
^按(2进制)位异或----相同为0,不同为1

例:不创建临时变量,交换2个数

方法1:
在这里插入图片描述
方法2:
在这里插入图片描述
注:

  • 方法1当数据过大时,可能存在溢出的问题.
  • 方法2只适用于整数.

补充:
异或操作符支持交换律
a ^ a = 0;
0 ^ a = a;

例:求一个整数存储在在内存中的二进制的1的个数

求数据在内存中的存储形式为补码,
即为求二进制中1的个数

赋值操作符

> int a = 3; //初始化
> a = 1;//赋值
> int x = 0;
> int y = 20;
> a = x = y+1; //连续赋值

复合赋值操作符

操作符-
+=a+=1等同于a=a+1
-=a-=1等同于a=a-1
*=a*=1等同于a=a*1
/=a/=1等同于a=a/1
%=a%=1等同于a=a%1
>>=a>>=1等同于a=a>>1
<<=a<<=1等同于a=a<<1
|=a|=1等同于a=a|1
&=a&=1等同于a=a&1
^=a^=1等同于a=a^1

单目操作符

操作符-
!逻辑反操作—真变假,假变真
-负值
+正值
&取地址操作符
sizeof操作数的类型长度,单位字节
~按(2进制)取反
前置 后置
++前置 后置
*间接访问操作符/解引用操作符
()强制类型转换

只有一个操作符数
注:
C语言中,0表示假,非0表示真.
sizeof是操作符,不是函数
strlen是库函数,只能用来求字符串长度

a |= (1<<4); //第四位0变成1

a &= (~(1<<4)); //第四位1变成0

int a=(int) 3.14; //把3.14强制转换为int

关系操作符

关系操作符-
>大于
>=大于等于
<小于
<=小于等于
!=不等于
==等于

逻辑操作符

逻辑操作符
&&逻辑与同时为真,才为真
||逻辑或只要一个为真,即为真
  • && 只要左边为假,右边就不执行
  • || 只要左边为真,右边就不执行

条件操作符(三目操作符)

表达式1 ? 表达式2  : 表达式3 ;
  • 表达式1为真,则执行表达式2;
  • 表达式1为假,则执行表达式3.

逗号表达式

  • 从左往右依次执行,整个表达式的结果,是最后一个表达式的结果.

下标引用操作符

[ ]---下标引用操作符
arr[7]  --> *(arr+7) -->*(7+arr)-->7[arr]
//arr+7就是跳过7个元素,指向第8个元素

函数调用操作符

( )----函数调用操作符
Add();

结构体成员操作符

操作符-
.结构体成员操作符
->结构体指针成员操作符
struct Stu
{
	char name[20];
	int age;
	double score;
};

	struct Stu s={0};
	set_stu(&s);
	
void set_stu(struct Stu* ss)
{
	strcpy((*ss).name,"zhansan");
	(*ss).age=20;

	strcpy(ss->name,"zhansan");
	ss->age=20;
	ss->score=100;
}

表达式求值

  • 相邻操作符的优先级–>结合性
  • 相邻操作符,优先级高的,先执行,
    相邻操作符,优先级相同,取决于结合性

隐式类型转换

整形提升
  • 字符和短整型使用之前转换为普通整型
如何提升?
  • 按照变量的数据类型的符号位来提升.
  • 无符号变量提升时补0.
	char a = 5;
	//char 5的补码
	00000101
	//正数5,符号位为0,提升时补0
	00000000 00000000 00000000 00000101

	char b = 126;
	//char 126
	01111110
	//提升后:
	00000000 00000000 00000000 01111110
	
	int c = a + b;
	//提升后的a
	00000000 00000000 00000000 00000101
	//提升后的b
	00000000 00000000 00000000 01111110
	// a+b
	00000000 00000000 00000000 10000011
	//取8bit
	10000011
	//符号位为1,提升时,补1
	11111111 11111111 11111111 10000011--补码
	11111111 11111111 11111111 10000010--反码
	10000000 00000000 00000000 01111101--原码  
	a+b = -125;
  • 36
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

婧婧子♔♔♔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值