今天给大家带来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、结构体指针->成员
而->操作符则是可以,通过指针来间接访问结构体成员:
->一般用在函数内,目的是在函数内部对外部的结构体成员进行访问或修改。比如: