C语言中的操作符(干货满满)

目录

1.算术操作符

2.移位操作符

3.位操作符

4.赋值操作符

5.单目操作符

6.关系操作符

7.逻辑操作符

8.条件操作符

9.逗号操作符

10.下标引用,函数调用,结构成员


1.算术操作符

+        -        *        /        %

          1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
          2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
        3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。   

2.移位操作符

这里的移位要注意的是,移动的是二进制位的补码,数据在内存中存储是以补码的形式存放的,以原码的形式展示
原码:直接按照数据写出的二进制
反码:原码的符号位不变,其他位按位取反
补码:反码+1得到补码
注意:正整数的原反补码都是一致的,只有负数需要计算,最高位是符号位,0代表整数,1代表负数

15正整数:
原码:0000000000000000000000001111
反码:0000000000000000000000001111
补码:0000000000000000000000001111

-15负数:
原码:1000000000000000000000001111
反码:1111111111111111111111110000
补码:1111111111111111111111110001

<< 左移操作符     左边丢弃,右边补0

>> 右移操作符     右边丢弃,逻辑移位下:左边补0;算术移位下:左边补原符号位  vs2022下是算术移位

注:移位可以自定义,不限于1

//左移
int main()
{
	int a = 10;			
	//0000000000000000000000001010 正数原反补相同
	int b = a << 1;//左边丢弃一位,右边补0
	//0000000000000000000000010100  
	printf("%d %d\n", a, b);  //b = 20

	int c = -15;
	//1000000000000000000000001111	原码
	//1111111111111111111111110000	反码
	//1111111111111111111111110001	补码
	int d = c << 1;//右边补0
	//1111111111111111111111100010 移动后的补码
	//1111111111111111111111100001 反码
	//1000000000000000000000011110	原码
	printf("%d %d", c, d);//-30   以原码的值打印,存储用补码
	return 0;
}
//右移
int main()
{
	int a = 10;
	//0000000000000000000000001010 正数原反补相同
	int b = a >> 1;//右边丢弃一位,左边补符号位
	//0000000000000000000000000101
	printf("%d %d\n", a, b);  //b = 5

	int c = -15;
	//1000000000000000000000001111	原码
	//1111111111111111111111110000	反码
	//1111111111111111111111110001	补码
	int d = c >> 1;//右边丢弃,左边补符号位
	//1111111111111111111111111000 移动后的补码
	//1111111111111111111111110111 反码
	//1000000000000000000000001000	原码
	printf("%d %d", c, d);//- 8  以原码的值打印,存储用补码
	return 0;
}

3.位操作符

位操作符的操作对象是:二进制中的补码

&        按位与,两个数的对应位中一个为0,结果为就是0,两个对应位都是1,结果位才是1

|         按位或,两个数的对应位中一个为1,结果位就是1,两个对应位都是0,结果位才是0

^        按位异或,,两个数的对应位相同,结果位就是0,不同则为1

int main()
{
	//正数原反补相同
	int a = 10;
	//0000000000000000000000001010
	int b = 15;
	//0000000000000000000000001111
	int num1 = a & b;//有0为0,两个都是1才为1
	//0000000000000000000000001010   10
	int num2 = a | b;//有1为1,两个都是0才为0
	//0000000000000000000000001111	15
	int num3 = a ^ b;//相同位0,相异为1
	//0000000000000000000000000101	5

	printf("%d %d %d\n", num1, num2, num3);//10 15 5
	return 0;
}

4.赋值操作符

赋值操作符,将右边的值,赋给左边

=    

复合赋值操作符,先进行运算再赋值

+=  -=  *=  /=  %=  >>=  <<=  &=  |=  ^=
int a = 10;
a = a+10;//复合赋值
a+=10;//这样写更加简便,其他复合赋值同理

5.单目操作符

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof       操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--           前置、后置 --
++           前置、后置 ++
*           间接访问操作符 ( 解引用操作符 )
( 类型 )       强制类型转换
int main()
{
	int  y= -10;//负数
	int* p = NULL;
	printf("%d\n", !2);//真改为假  0
	printf("%d\n", !0);//假改为真  1
	p = &y;//取y的地址赋给p,p指向y的地址
	printf("%d\n", *(p));//对p指向的地址解引用,得到指向空间的内容   -10
	//sizeof不是函数 
	printf("%d\n", sizeof(int));//但是如果求的是类型的大小,就一定要带上括号,否则编译器会报错
	printf("%d\n", sizeof y);//函数需要带(),这里sizeof不需要

	int a = 5;
	int b = a++;//先使用再+1,先把a原来的值赋给b,然后a自增
	int c = ++a;//先+1,再使用,a的值先自增,然后再赋给c

	int q = 15;
	int w = q--;//先使用再-1,先把q原来的值赋给w,然后q自减
	int e = --q;//先-1,再使用,q的值先自减,然后再赋给c

	int n = 5;
	n = ~n;//对n的二进制位中的补码按位取反  -6
	printf("%d\n", n);

	int m = (int)3.1546;//3.15146是一个浮点数,将它类型转化为整型,赋给m
	printf("%d\n", m);//3
	return 0;
}

6.关系操作符

>         大于
>=       大于等于
<         小于
<=       小于等于
!=        用于测试“ 不相等
==       用于测试 相等
注意:== 和 = 要区分开来

7.逻辑操作符

&&     逻辑与        条件两边必须都为真,才成立
||         逻辑或        条件两边只要有一方为真,就成立
int main()
{
	int a = 4;
	int b = 5;
	if (a > 4 && b > 4)//两边都为真才打印
		printf("hello\n");
	if (a > 4 || b > 4)//只要有一边为真,就会打印
		printf("world\n");
	return 0;
}
//扩展
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++; //a先为0,使用后再++,条件左边就为假,只要为假,后面就不再执行
    //i = a++||++b||d++;///a先为0,使用后再++,条件左边为假,右边为真,剩下的不再执行
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

8.条件操作符

exp1 ? exp2 : exp3
exp1为真,表达式的结果为exp2,exp1为假,表达式的结果是exp3
	int a = 8;
	int b = 10;
	int c = a > b ? a : b;//a>b为假,表达式结果是b
	printf("%d\n", c);//10

9.逗号操作符

exp1, exp2, exp3, …expN
逗号表达式的结果是最后一个表达式的结果
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//13

10.下标引用,函数调用,结构成员

[ ]          下标引用操作符
( )          函数调用操作符
. ->         访问一个结构的成员      . 结构体.成员名    ->结构体指针->成员名
//下标引用
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
//[] 的两个操作数是arr和9。

//函数调用
void test1()
{
	printf("hello ");
}
void test2(const char* str)
{
	printf("%s\n", str);
}
int main()
{
	test1();//()函数直接调用
	test2("world");//()函数传参调用
	return 0;
}

//访问结构体成员
struct Su
{
	int a;
	char name[20];
};
int main()
{
	struct Su s = { 18,"mingwang" };
	struct Su* c = &s;//结构体指针
	printf("%d %s\n", s.a, s.name);//结构体.访问成员
	printf("%d %s\n", c->a, c->name);//结构体指针->访问成员
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值