【C语言笔记】C操作符详解


今天给大家带来C语言中操作符的详解

一、算术操作符

算术操作符就是和数学上一样的+ - * / % , 其用法和数学上的基本一致,值得就是除法操作符 / 和区域操作符 %:

#include <stdio.h>
int main() {
	printf("%d\n", 10 / 3); // 3
	printf("%f\n", 10 / 3.0); // 3.3333……
	printf("%f\n", 10.0 / 3); // 3.3333……
	printf("%f\n", 10.0 / 3.0); // 3.3333……
	return 0;
}

当操作符/的两个操作数都是整数时,执行的是整数除法,也即整除,只要有一个操作数是浮点数,执行的就是浮点数除法,也即数学上的除法

#include <stdio.h>
int main() {
	printf("%d\n", 10 % 3); // 1
	printf("%d\n", 10 % 3.0); // 报错
	printf("%d\n", 10.0 % 3.0); // 报错
	return 0;
}

而取余操作符的两个操作数只能是整数,不然就报错。

二、移位操作符

移位操作符操作的都是数据的二进制位,移位操作符的第一个操作数是要移的数,第二个操作数是要移动的位数。

1、左移操作符(<<)

#include <stdio.h>
int main() {
	printf("%d\n", 5 << 1); // 10
	// 具体步骤如下
	// 5的二进制:
	// 00000000 00000000 00000000 00000101
	// 移位后就变成了:
	// 00000000 00000000 00000000 00001010
	return 0;
}

其实也可以看出,对于二进制位的左移,也可以看成是乘上2的几次方,左移多少位就是乘上2的几次方。

2、右移操作符(>>)

#include <stdio.h>
int main() {
	printf("%d\n", 4 >> 1); // 2
	// 具体步骤如下
	// 4的二进制:
	// 00000000 00000000 00000000 00000100
	// 移位后就变成了:
	// 00000000 00000000 00000000 00000010
	printf("%d\n", 9 >> 1); // 4
	// 具体步骤如下
	// 9的二进制:
	// 00000000 00000000 00000000 00001001
	// 移位后就变成了:
	// 00000000 00000000 00000000 00000100
	return 0;
}

也可以看出,右移多少位也可以看做是除以2的几次方。

三、位操作符

位操作数操作的也是数据的二进制序列

1、按位与(&)

按位与的使用规则是:对应位,都是1,则按位于为1,只要有一个不是1,按位与为0:

#include <stdio.h>
int main() {
	int a = 7;
	int b = 5;
	int c = a & b;
	printf("%d\n", c); // 5
	// 具体步骤:
	// a: 00000000 00000000 00000000 00000111
	// b: 00000000 00000000 00000000 00000111
	// c: 00000000 00000000 00000000 00000101
	return 0;
}

2、按位或(|)

按位或的使用规则是:对应位,只要有一个是1,则对应位为1,否则就为0:

#include <stdio.h>
int main() {
	int a = 9;
	int b = 6;
	int c = a | b;
	printf("%d\n", c); // 15 
	// 具体步骤:
	// a: 00000000 00000000 00000000 00001001
	// b: 00000000 00000000 00000000 00000110
	// c: 00000000 00000000 00000000 00001111
	return 0;
}

3、按位异或(^)

按位异或的使用规则是,对应位,如果相同,则按位异或为0,不同则为1:

#include <stdio.h>
int main() {
	int a = 3;
	int b = 7;
	int c = a ^ b;
	printf("%d\n", c); // 4
	// 具体步骤:
	// a: 00000000 00000000 00000000 00000011
	// b: 00000000 00000000 00000000 00000111
	// c: 00000000 00000000 00000000 00000100
	return 0;
}

四、赋值操作符

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

#include <stdio.h>
int main() {
	int a = 7; // = 表示把7赋值给变量a
	printf("%d\n", a); // 7
	// += 表示先让a + 1,再将结果赋值给本身
	printf("%d\n", a += 1); // 8
	printf("%d\n", a); // 8
	return 0;
}

其中=是将一个常量值赋给一个变量,或者是将一个变量里存储的值赋给另一个变量,其他的+= *= 这些都是想让变量本身进行运算,再将运算结果赋值给变量本身。

五、单目操作符

单目操作符指的是操作数只有一个的操作符,其常常出现在判断语句中(if、while……)

1、逻辑反操作(!)

逻辑反操作,即把真的变成假的,把假的变成真的:

#include <stdio.h>
int main() {
	int a = 0; // C语言中0为假,非0为真
	if (!a) {
		printf("hello world!\n"); // 成功打印
	}
	return 0;
}

其常常出现在判断语句中(if、while……)

2、负值(-)

负值操作符就是把一个整数变成一个负数,也即取相反数:

#include <stdio.h>
int main() {
	int a = 5;
	int b = -a;
	printf("%d\n", b); // -5
	return 0;
}

3、正值(+)

正值平时一般都省略:

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

4、取地址(&)

取地址操作符就是取得某个变量在内存中存储的地址:

#include <stdio.h>
int main() {
	int a = 5;
	// 打印地址用%p
	printf("%p\n", &a); // 00D6F974
	// 是一个16进制数字
	return 0;
}

5、求操作数的类型长度(sizeof)

刚接触C语言时大家可能都会以为sizeof是一个函数,因为后面有个(),但实际上它是一个操作符,它的作用是求得某个操作数类型的长度:

#include <stdio.h>
int main() {
	int a = 5;
	// a是int类型变量,一个int占4个字节
	printf("%d\n", sizeof(a)); // 4
	// 当然sizeof内部也可以直接放类型
	printf("%d\n", sizeof(int)); // 4
	printf("%d\n", sizeof(short)); // 2
	printf("%d\n", sizeof(char)); // 1
	printf("%d\n", sizeof(float)); // 4
	printf("%d\n", sizeof(double)); // 8
	return 0;
}

6、按位取反(~)

按位取反操作的也是数据的二进制序列,针对每个二进制位如果是1就变成0,是0就变成1:

#include <stdio.h>
int main() {
	int a = -1;
	printf("%d\n", ~a); // 0
	// 这里的结果为什么是0呢?
	// 对于负整数,内存中存储的是它的补码
	// -1的原码:10000000 00000000 00000000 00000001 
	// -1的反码:11111111 11111111 11111111 11111110 
	// -1的补码:11111111 11111111 11111111 11111111 
	// 对-1的补码按位取反就变成了:00000000 00000000 00000000 00000000
	return 0;
}

7、自减(–)和自增(++)

自减和自增类似于-=和+=,只不过自减和自增加和减都是1,常常用在循环中对循环变量进行调整,比如我们想要在屏幕上打印1到10:
在这里插入图片描述
而且++和–也有前置和后置之分:

#include <stdio.h>
int main() {
	int a = 3;
	int b = 4;
	// 前置--,先--,后使用
	printf("%d\n", --a); // 2
	// 后置--,先使用,后--
	printf("%d\n", b--); // 4
	// --和++的逻辑是一样的
	return 0;
}

8、间接访问操作符(*)

间接访问操作符其实就是对指针解引用,通过指针找到所指向的变量:

#include <stdio.h>
int main() {
	int a = 3;
	int* p = &a; // 创建一个指针变量,并将a的地址保存进去
	printf("%d\n", *p); // 通过指针p找到了a
	return 0;
}

9、强制类型转换((类型))

强制类型转换,就是强行讲一个类型转换成另一个类型,不考虑数据丢失:

#include <stdio.h>
int main() {
	int a = (int)3.0; // 将double类型强制换成int类型
	printf("%d\n", a); // 3
	printf("%d\n", sizeof((int)3.0)); // 4  
	// 一个double类型数据占8个字节,这里只打印了4,说明发生了强制类型转换
	return 0;
}

六、关系操作符

>  大于
>= 大于或等于
<  小于
<= 小于或等于
!= 不等于
== 等于

这些关系操作符与数学中的功能相同,一般用于判断语句。

七、逻辑操作符

1、逻辑与(&&)

意思是并且,即只有两边都为真时,结果才为真:
在这里插入图片描述
可以看到屏幕上只打印了haha

2、逻辑或(&&)

意思是或者,即两边只要有一个为真,结果就为真:
在这里插入图片描述
可以看到hehe和haha都打印了

八、条件操作符

exp1 ? exp2 : exp3

条件操作符也称为三目操作符,如果exp1结果为真,则整条语句的结果为exp2的结果,否则就为exp3的结果:

#include <stdio.h>
int main() {
	int a = 0;
	int b = 1;
	int c = 3;
	c = a > b ? 4 : 5;
	printf("%d\n", c); // 5
	return 0;
}

九、逗号表达式

exp1, exp2, exp3……expn

逗号表达式中用逗号分隔开的表达式都要执行,但整个表达式的结果只取决于最后一个 表达式:

#include <stdio.h>
int main() {
	int a = 3;
	int b = 4;
	int c = 5;
	int d = (a + b, b + c, c + a);
	printf("%d\n", d); // 8
	return 0;
}

十、下标引用、函数调用、结构体成员访问

1、下标引用操作符([])

下标引用操作符主要运用于数组和指针,运用于数组即表示访问数组下标为几的成员:
在这里插入图片描述
且下标引用操作符的操作数的顺序是可以随意的,也就是说arr[i]和i[arr]是一样的:
在这里插入图片描述

2、函数调用操作符(())

函数调用操作符()的操作数至少有一个,那就是函数名,置于括号内部的操作数,则根据函数的参数而定,函数有多少个参数就有多少个操作数:

#include <stdio.h>
// 定义一个函数,求两个数中的较大值
int max(int x, int y) {
	return x > y ? x : y;
}
int main() {
	int a = 3;
	int b = 5;
	int m = max(a, b); // max函数有两个参数,这里就有两个操作数
	printf("%d\n", m); // 5
	return 0;
}

3、结构体成员访问操作符(. ->)

3.1、结构体.成员

在这里插入图片描述

3.2、结构体指针->成员

而->操作符则是可以,通过指针来间接访问结构体成员:
在这里插入图片描述
->一般用在函数内,目的是在函数内部对外部的结构体成员进行访问或修改。比如:
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林先生-1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值