C语言操作符详解

操作符分类

算术操作符		+ - * / %
移位操作符		>>  <<
位操作符		| & ^
赋值操作符		=
单目操作符		! & ...
关系操作符		> >= < <= != ==
逻辑操作符		&&  ||
条件操作符		exp1 ? exp2 : exp3
逗号表达式		exp1, exp2, exp3, …expN
下标引用		[]
函数调用		()

算术操作符

+ - * / % --就是加减乘除和取模。要注意取模得到的是余数,除了 % 取模运算符外,其它操作符都能对整数和浮点数进行运算。

移位操作符

移位操作符移动的都是二进制位。

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

左移操作符

左移操作符就是向左移动,右边补0,比如 3 ,二进制的有效位是 00000011,左移之后的结果就是 00000110 是 6。代码如下:

int main()
{
	int a = 3;
	int b = a << 1;
	printf("%d\n", b);  	//6
	return 0;
}

左移之后,数值变成了原来的二倍,我们可以多试几组数据,尝试得到一个结论:

int main()
{
	int a = 5;
	int b = a << 1;
	printf("%d\n", b);		//10
	return 0;
}

通过上面两个例子,我们可以得出一个结论:向左移一位,就会把结果乘 2 ,继续推断可知,左移 n 位,就是把结果乘 2^n 。

右移操作符

右移操作符的移位方式是算术右移,就是左边用原值的符号位填充,右边丢弃。

int main()
{
	int a = 80;
	int b = a >> 1;
	printf("%d\n", b);		//40
	return 0;
}
int main()
{
	int a = 80;
	int b = a >> 3;
	printf("%d\n", b);		//10
	return 0;
}

经过上面这两个代码,我们依然可以验证我们的结论:右移 n 位,就是把结果除 2^n 。

位操作符

位操作符包括 &(按位与) |(按位或) ^ (按位异或),操作的也是二进制位。

按位与 &

两个数对应的二进制位都是 1 ,那么按位与的结果也是 1 ,有一个为 0 ,结果为 0 。这里拿 3 和 5 举例。3 对应的的二进制的有效位是 00000011 ,5 对应的二进制的有效位是 00000101 ,所以按位与的结果就是 1 。

int main()
{
	int a = 3;
	int b = 5;
	int c = a & b;
	printf("%d\n", c);		 //1 
	return 0;
}

在这里插入图片描述
再结合图片,就能很好理解了。

按位或 |

按位或也是对两个数的二进制位进行操作,两个数对应的二进制位,只要有一个 1 ,结果就为 1 。继续拿 3 和 5 举例。3 的有效二进制位是 00000011,5 的二进制的有效位是 00000101,按位或之后就是 00000111 是 7 。

int main()
{
	int a = 3;
	int b = 5;
	int c = a | b;
	printf("%d\n", c);		 //7
	return 0;
}

在这里插入图片描述
从图片上面就很好理解了。

按位异或 ^

按位异或就是两个数对应的二进制位相同则为 0 ,相异则为 1 。继续拿 3 和 5 举例,00000011,00000101,所以结果就是 00000110,结果是 6 。

在这里插入图片描述

赋值操作符

赋值操作符有如下

+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=

这些操作符的效果都类似于下面这样:

int x = 10;
x = x+10;
x += 10;		 += 的意思和 + 是一样的 所以这个式子和上面的式子是一样的

单目操作符

单目操作符就是符号两边的操作数只有一个。

!           逻辑反操作
-           负值
+           正值
&           取地址
sizeof      操作数的类型长度(以字节为单位)
~           对一个数的二进制按位取反
--          前置、后置--
++          前置、后置++
*           间接访问操作符(解引用操作符)
(类型)      强制类型转换

逻辑反操作:比如原来为真,逻辑反操作之后就为假了。原来为假的话,逻辑反操作之后就是 1 ,0 表示假,一切的非 0 表示真。

int main()
{
	int a = 3;
	int b = !a;
	int c = !b;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	return 0;
}

在这里插入图片描述
要注意两个 + 不能使负数变为正数。

sizeof 和 数组

sizeof 作为一个操作符,是求元素所占字节大小的,sizeof(数组名),求的是整个数组的大小,与 strlen 不同的是,strlen 算的是有几个字符,而 sizeof 算的是所有的大小,不关注内容,只关注大小。

int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int len = strlen(arr);
	printf("%d\n", sz);				//7	
	printf("%d\n", len);			//6
	return 0;
}

sizeof 等于 7 是因为字符串结束的标志是 ‘\0’ 所以求出来是 7,而字符串只有 6 个,所以 strlen 是 6。

关系操作符

关系操作符就是常见的比较大小的操作符。

>
>=
<
<=
!=  	 用于测试“不相等”
==    	 用于测试“相等”

逻辑操作符

逻辑操作符有 &&(逻辑与) ||(逻辑或)

逻辑与:就是符号两边都为真,结果才为真。
逻辑或:就是符号两边有一个为真,结果就为真。

int main()
{
	int a = 3;
	int b = 5;
	int c = 0;
	if (a > 0 && b > 0)
	{
		printf("逻辑与操作符\n");
	}
	if (a > 0 || c > 0)
	{
		printf("逻辑或操作符\n");
	}
	return 0;
}

在这里插入图片描述
通过图片可知结果都输出了,可以更方便的理解。

条件操作符

条件操作符 exp1 ? exp2 : exp3 又叫三目操作符。当表达式 1 成立的话,就执行表达式 2 ,表达式 1 为假的话,就执行表达式 3 。

int main()
{
	int a = 3;
	int b = 5;
	int c = a > b ? a : b;
	printf("%d\n", c);			//5
	return 0;
}

因为 a > b 判断为假,所以执行表达式 3 ,c 的值就等于 b 了,所以 c j就是 5 。

逗号表达式

exp1, exp2, exp3, …expN 多个表达式用逗号隔开,从左到右执行。最后一个表达式的结果是整个表达式的结果。

int main()
{
	int a = 3;
	int c = (a + 1, a + 1, a + 1, a + 1, a + 1);
	printf("%d\n", c);			//4
	return 0;
}

这里输出的是 4 因为逗号表达式的最后一个式子是 a+1 所以结果是 4 。因为 a 的值并没有被改变,所以是 4 。如果把逗号表达式都变成 a += 1 这样的结果就是 8 ,因为每次都把 a 的值改变了。

下标引用和函数调用

下标引用操作符 []

用于数组当中,因为数组是通过下标来访问的。数组的下标是从 0 开始的。

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d\n", arr[9]);			//10
	return 0;
}

因为下标是从 0 开始访问的,所以输出的就是 10 。

函数调用操作符()

函数调用操作符就是还有传多个参数,也可以不传参数。

void test2(int x)
{
	printf("%d\n", x);
}
void test1()
{
	int a = 5;
	test2(a);
}
int main()
{
	test1();
	return 0;
}

从 main 函数开始,先调用 test1 函数,没有传参数,再从 test1 函数里面调用 test2 然后传参,test2 函数用 x 来接收,并且打印出来。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lockey-s

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

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

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

打赏作者

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

抵扣说明:

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

余额充值