C语言操作符

算术操作符
算术运算符: + - * / %

算术运算符在是使用中较为简单常见,但是在使用的过程中需要注意以下几点:
1、%操作符只能操作整数,而其他运算符既能用于整数也可用于浮点数。
2、%操作符操作数必须是整数。其返回整除之后的余数。
3、对于/运算符,如果操作数数整数则执行整数除法,如果操作数是浮点数则执行浮点数除法。

移位操作符
<< 左移操作符
	逻辑左移/算术左移:左边抛弃,右边补0>> 右移操作符
	逻辑右移:左边补0,右边丢弃;
	算术右移:左边用原值符号位补,右边丢弃;

左移:
在这里插入图片描述
右移:
在这里插入图片描述
移位运算符在使用时也需要注意以下几点:
1、C语言中移位操作符实现的是逻辑左移和算术右移,但是算术左移和逻辑左移的效果相同,算术右移和逻辑右移的效果不同,要实现逻辑右移可将操作数强制类型转化为无符号数
2、移位操作符只可用来处理整数(int)类型.
3、像char、byte、short等按位操作时,会转换成int之后操作,只有右端5位有效,因为int类型值只有32位,2的5次方等于32。long操作后结果仍然为long,但只有右端低6位有效。因为long类型值只有64位,2的6次方等于64。

4、对于移位运算符,请不要操作移动负数位,因为标准未定义,后果未知

位操作符
&    : 按位与  1&1=1,1&0=0,0&0=0
| 	 : 按位或  1|0=1,1|1=1,0|0=0
^    : 按位异或  1^1=0,1^0=1,0^0=1  

注意:位操作符的操作数必须是整数
一般按位与异或,比较容易考察。下面有一道题:

//不能创建临时变量(第三个变量),实现两个数的交换
#include<stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    a = a^b;
    b = a^b;
    a = a^b;
    printf("a = %d b = %d\n",a,b);
	return 0;	
}

//求一个整数存储在内存中的二进制中1的个数。
#include<stdio.h>
int main()
{
	int num = 10;
	int count = 0;
	for(int i = 0; i < 32; i++){
		if((num>>1)&1)==1)
		count++}
	printf("二进制中1的个数:%d\n",count);
	return 0;
}
赋值操作符
=: 赋值操作,连续赋值
符合赋值符:+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=

int a = 10;
a = 20;//赋值操作

int x,y=0;
x=y=a;//连续赋值

int x = 10;
x = x + 10;
x += 10;//复合赋值
单目操作符
:逻辑反操作
-:负值
+:正值
&:取地址
sizeof:操作数的类型长度
~:对一个数的二进制按位取反
--:前置、后置--
++:前置、后置++
*:间接访问操作符(解引用操作符)
(类型):强制类型转换
//部分单目操作符使用
void test()
{
	int a = -10;
	int *p = NULL;
	printf("%d\n", !2);//输出0
	printf("%d\n", !0);//输出1
	a = -a;
	p = &a;
	printf("%d\n", sizeof(a));//输出4
	printf("%d\n", sizeof(int));//输出4
	printf("%d\n", sizeof a);//输出4
}

//sizeof与数组之间的关系
void test1(int arr[])
{
	printf("%d\n", sizeof(arr));//(2)输出4
}
void test2(char ch[])
{
	printf("%d\n", sizeof(ch));//(4)输出4
}
int main()
{
	int arr[10] = {0};
	char ch[10] = {0};
	printf("%d\n", sizeof(arr));//(1)输出40
	printf("%d\n", sizeof(ch));//(3)输出10
	test1(arr);
	test2(ch);
	return 0;
}
//注意:在前面讲数组已经提到单目操作符sizeof计算操作数类型所占空间大小的,但是在数组这里却存在例外:
//当传入数组名时计算得到确是整个数组所占空间的大小就像(1)(3)。但是你可能回问为什么(2)(4)
//输出为4呢?,那是因为当我们将数组作为参数传给函数时,其实就相当于传的是数组的第一个元素的地址
//也就是数组的首地址是一个指针类型的形参,在函数内面通过sizeof计算其实就相当于计算该指针类型
//形参所占空间大小,而在32位向下指针大小统一为4字节,所以都输出4。

//++和--运算符
void test()
{
	//前置++和--
	int a = 10;
	//前置++,现进行自增,然后再使用
	int x1 = ++a;//x1=11,a=11
	//前置--,现进行自减,然后在使用
	int y1 = --a;//y1=10,a=10
	
	//后置++和--
	int b = 10;
	//后置++,现使用,在进行自增
	int x2 = a++;//x2=10,b=11;
	//后置--,先使用,在进行自减
	int y2 = a--;//y2 = 11,b=10
}
关系操作符
> :大于   
>=:大于等于   
< :小于 
<=:小于等于 
!=:判断测试 不等于   
==:判断测试 等于

关系操作符都比较简单,但是在使用时要注意不要写错,例如:== 和 = 就有很大的差别呢!!!

逻辑操作符
&&: 逻辑与
||: 逻辑或

这里逻辑操作符和位操作符很容易混淆:

//逻辑操作
1&&2 = 1
1||2 = 1

//位操作
1&2 = 0
1|2 = 3


void test()
{
	int i = 0,a = 0,b = 2,c = 3,d = 4;
	i = a++ && ++b && d++;
	printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
	//输出:a = 1, b = 2 ,c = 3,d = 4;
}
因为有这样的输出是因为:  
1) && (逻辑与)(三种)
① 当逻辑与左边为false(),则不再进行逻辑与右边的判断,结果为false()
② 当逻辑与左边为true()则进行右边判断,右边为false(),结果为false()
③ 当逻辑与左边为true()则进行右边判断,右边也为true(),则结果为true()
2) || (逻辑或)(三种)
① 当逻辑或左边为false(),继续逻辑或右边的判断,如果也为false(),结果为false()
② 当逻辑或左边为false(),继续逻辑或右边的判断,如果为true(),结果为true()
③ 当逻辑或左边为true(),则不再进行逻辑或右边的判断,结果为true()
正式由于上面的原因,因为是后置++所以先使用a判断,此时a=0;左边为false,变不在判断结果为假了,所以后面的b,c,d都没有变化。

注意:&&:全true才true,||:全false才false。

条件表达式(三目运算符)
exp1 ? exp2 : exp3

合理的运用三目运算符和以示代码简洁,

//普通写法
if(a > 5)
	b = 3;
else
	b = -3;

//三目运算符写法
a > 5 ? b = 3 : b=-3;

以上便是对C语言的操作符进行介绍,如有错误请不吝赐教…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值