[C语言]操作符

目录

算术操作符

位移操作符

位操作符

赋值操作符

单目操作符

关系操作符

逻辑操作符

条件操作符

逗号操作符

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


算数操作符:+、-、*、/、%

注意:%的两个数都为整数,返回的是整除之后的余数

           /的两个数都为整数型,则返回的为整数型,当有一个为浮点型,则返回的为浮点型

移位操作符:>>、<<(不要移动负数位)

<<(左移操作符):把二进制位向左移动一位。左边丢弃,右边补零

>>(右移操作符):把二进制位向右移动一位。

1、算术右移:右边丢弃,左边补原符号(0为正1为负)

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

思考下代码:

int main()
{
	int a = -1;
	int b = a >> 1;
	printf("%d",b);
	getchar();
	getchar();
	return 0;
}

整数的二进制形式存在:原码,反码(符号位不变,其余按位取反),补码(反码+1)

对于正整数来说这三个相同

负数在内存中存放的是二进制的补码

执行代码我们可以发现打印出来b的值为-1,所以上面执行的右移操作符是算数右移

(二进制)位操作符:与&、或|、非^(异或-->相同为0,相异为1)

笔试例题:交换两个int变量的值,不能使用第三个变量。

如下:

int main()
{
	int a = 5;
	int b = 3;
	a = a + b;
	b = a - b;//原来的a
	a = a - b;//原来的b
	printf("a=%d,b=%d", a, b);
	getchar();
	getchar();
	return 0;
}

但是上面代码存在:数值太大会溢出的问题。a^a=0,0^a=a

因此我们可以用异或解决,如下:a = a^b;
                                                      b = a^b;
                                                      a = a^b;

代码练习:打印出一个二进制位中含1的个数

思路:与1进行与,如果结果是1,则该数字二进制的最后一位是1,反之是0。二进制右移,以此判断。

代码如下:

int a = 0;
	scanf("%d", &a);
	int count=0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if (((a >> i) & 1) == 1)
			count++;
	}
	printf("%d", count);

赋值操作符:+=、-=、>>=、<<=、%=、.....

单目操作符(只有一个操作符):!、+、-(负)、sizeof、~(所有二进制按位取反)……

注意:对于sizeof  sizeof(int)不能去掉(),但是sizeof(a)可以写成sizeof a,这证明了sizeof是一个操作符。

sizeof-计算所占内存大小(包含\0),而strlen是一个求字符串长度的函数,找\0之前的字符个数

        int * pa=&a;--->*代表了pa是一个指针变量,

        *pa=20;*是一个间接访问操作符(*pa就是a)指针变量是专门用来存地址的

       ()--> 强制转换符     eg:int a=(int)3.14;

关系操作符:>=、!=、==、<……

注意:比较两个字符串相等不能用==要用strcmp(引入#include<string.h>)

逻辑操作符:&&逻辑与、||逻辑或(判断真假)

笔试例题:判断下面代码:

	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++&&++b&&d++;
	printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);

答案是:1 2 3 4

那么为什么呢?因为a++是0时 i就已经是0了,所以后面的++b,d++就不算了。

那假如把&&换成||呢?答案是:1 3 3 4同样,在++b时 i就已经时1了,后面就不用执行了。

条件操作符(三目操作符): 表达式1?表达式2 :表达式3   ;

表达式1为真,进行表达式2.反之,进行表达式3。

逗号操作符(逗号表达式):表达式1,表达式2,表达式3……

从左到右计算,整个表达式的结果为最后一个表达式的结果。

下标引用、函数调用和成员结构操作符:

arr[4]-->[]为操作符,arr、4为操作数,缺一不可。

无参函数的调用test()-->()为操作符,test为操作数,若为有参函数,则参数也为操作数。

结构成员访问的操作符:.  ->

结构体:用struct 定义新的结构体类型

第一种结构体.成员 如下:

 第二种结构体指针->成员是将结构体变量的地址放在一个指针中,操作如下:

 整型提升:按照数据类型的符号位进行提升

什么时候提升?---达不到int的大小(short(2)、char(1))

eg:char a=-1;//(char 8个比特位)11111111

     提升后为:11111111111111111111111111111111

     unsigned char a=1;//00000001

     提升后为:00000000000000000000000000000001

 例题如下(截图转自比特鹏哥):

 本节结束……^-^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>