深入了解C语言操作符(运算符)

目录

算术操作符

移位操作符(移的是二进制位)

左移操作符

右移操作符

位操作符(二进制位)

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号表达式

下标引用、函数调用和结构成员

1.[  ]    下标引用操作符

2.()函数调用操作符

3. 访问一个结构的成员

算术操作符

+     -     *     /     %

1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

2.对于 / 操作符如果两个操作数都是整数运算时执行整数除法,则运算结果为整型数据(即若为小数时,只取整数部分),而只要有浮点数执行的就是浮点数除法,运算结果为浮点型数据。

3.%操作符的两个操作数必须为整数,运算结果是整除之后的余数。

移位操作符(移的是二进制位)

<<  左移操作符

>>  右移操作符

1.移位操作符的操作符只能是整数。

左移操作符

移位规则:左边抛弃、右边补0

#include <stdio.h>
int main()
{
	int x , y = 0;
	
	scanf("%d", &x); //18
	//00000000 00000000 00000000 00010010  x在内存中的二进制
   // 0000000 00000000 00000000 000100100  x左移一位产生的结果
	//36                                   对应的十进制数字
	y = x << 1;
	printf("%d", y);
	return 0;
}

右移操作符

移位规则:

1.算术右移:右边丢弃,左边补原符号位

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

(通常见到的都是算术右移,大家可以在自己编译器上试一下看是哪种右移方式)

#include <stdio.h>
int main()
{
	int x , y = 0;
	
	scanf("%d", &x); //-18
	//00000000 00000000 00000000 00010010  x在内存中的二进制
   // 100000000 00000000 00000000 0001001  x右移一位产生的结果 算术右移 负数符号位为1
	//-9                                   对应的十进制数字
   // 000000000 00000000 00000000 0001001  逻辑右移 右边丢弃,左边补0
	//9                                    对应的十进制数字
	y = x >> 1;
	printf("%d", y);
	//我的这个编译器输出结果为-9,该编译器右移方式是算术右移
	return 0;
}

位操作符(二进制位)

&  按位与  (有假即假,有0即0,全1为1)

|  按位或    (有真即真,有1即1,全0为0)

^  按位异或  (对应二进制位相同,异或结果为0;对应的二进制位相异,异或结果为1)

1.他们的操作数必须是整数。

#include <stdio.h>
int main()
{
	int a = 21;
	int b = 5;
	//a   00000000 00000000 00000000 00010101
	//b   00000000 00000000 00000000 00000101
	//a&b 00000000 00000000 00000000 00000101   5

	//a   00000000 00000000 00000000 00010101
	//b   00000000 00000000 00000000 00000101
	//a|b 00000000 00000000 00000000 00010101   21

	//a   00000000 00000000 00000000 00010101
	//b   00000000 00000000 00000000 00000101
	//a^b 00000000 00000000 00000000 00010000   16

	int c, d, e;
	c = a & b;
	d = a | b;
	e = a ^ b;
	printf("a&b=%d\n", c);
	printf("a|b=%d\n", d);
	printf("a^b=%d\n", e);
	return 0;
}

相关例题:

1.不引入第三个变量,实现两个整数的交换

#include <stdio.h>
int main()
{
	int a = 21;
	int b = 5;
	
	printf("交换前:a=%d b=%d\n", a, b);
	//a   00000000 00000000 00000000 00010101
	//b   00000000 00000000 00000000 00000101
	//a^b 00000000 00000000 00000000 00010000   16  c
	
	//c   00000000 00000000 00000000 00010000
	//b   00000000 00000000 00000000 00000101
	//c^b 00000000 00000000 00000000 00010101   21  a

	//c   00000000 00000000 00000000 00010000
	//a   00000000 00000000 00000000 00010101
	//c^a 00000000 00000000 00000000 00000101   5   b

	a = a ^ b;  //c
	b = a ^ b;  //a
	a = a ^ b;  //b
	
	printf("交换后:a=%d b=%d\n", a, b);
	return 0;
}

2.编写代码实现:求一个整数存储在内存中的二进制中1的个数

整数存储在内存中的二进制中1的个数,也就是所对应补码的1的个数

#include <stdio.h>
int main()
{
	int num=0;
	int count = 0;

	scanf("%d", &num);//26
	//00000000 00000000 00000000 00011010
	int i = 0;
	//32个bit位
	//num&1==1  则最后一位数为1;num&1==0  则最后一位数为0;
	for (i = 0; i < 32; i++)
	{
		//num = num >> i;  这样写不行,这样改变了num 的数,下一次for循环时的num就不是原来输入的数字了
		if (((num>>i) & 1) == 1)
		{
			count++;
		}
	}
	printf("%d\n", count);//3
	return 0;
}

赋值操作符

=

复合赋值符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=

这些很容易理解,就不过多阐述了。

单目操作符

!        逻辑反操作

-          负值

+         正值

&         取地址

sizeof  操作数的类型长度(以字节为单位)   即变量空间的大小

~         对一个数的二进制按位取反

--         前置、后置--
++       前置、后置++
*          间接访问操作符(解引用操作符)
(类型)  强制类型转换

1.前置++,-- 

   a++(--):先使用a的值之后,再对a进行++(--);

   ++(--)a:先对a进行++(--)之后,再使用++(--)之后的a;

2.!  逻辑反操作

  例:43

         !(43)=0;

         !0=1;

关系操作符

>

>=

<

<=

!=

==

逻辑操作符

&&    逻辑与

||       逻辑或

1.区分逻辑与和按位(二进制位)与

1&2  -------->  0

00000001&00000010  -------->  00000000      

1&&2  -------->  1

2.区分逻辑或和按位(二进制位)或

1|2  -------->  3

00000001|00000010  -------->  00000011

1||2  -------->  1

3.逻辑运算的短路特性: (表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达  式2“被短路” (表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”.

#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	//i = a++ && ++b && d++;  //有0即0   
	//此处只运行了a++=0(直接可以得到最终的结果0,所以后边的++b,d++都未运行)
	// a=1
	i = a++||++b||d++;    //有1即1
	//a++=0,++b=3;程序只进行到这里,有非0数,则最终结果必为1;后边直接不用计算
	//a=1,b=3
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	return 0;
}

条件操作符

exp1 ? exp2 : exp3

1.exp1成立,取exp2,否则取exp3。

逗号表达式

exp1,exp2,exp3,...expN

逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	int c = (a > b, a = b + 10, a, b = a + 1);
	//(0,12,12,13)
	printf("%d\n", c);//13
	return 0;
}

下标引用、函数调用和结构成员

1.[  ]    下标引用操作符

操作数:一个数组名+一个索引值

int arr[10];

arr[9]=10;

[  ]的两个操作数是arr和9

2.()函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

3. 访问一个结构的成员

.             结构体.成员名

->          结构体指针->成员名

两个相邻的操作符先运算哪个,取决于他们的优先级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值