文章目录
- 操作符分类
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
文章内容
1.操作符分类
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
2.算术操作符
+ - * / %
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
除法
1.整数除法(除号的两端都是整数)
2.浮点数除法(除号的两端只要有一个小数就执行小数除法)
3.移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
3.1 左移操作符
移位规则:
左边抛弃、右边补0
3.2 右移操作符
移位规则:
首先右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error
4.位操作符
位操作符有:
& //按位与
| //按位或
^ //按位异或
注:他们的操作数必须是整数。
练习一下:
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}
一道变态的面试题:
不能创建临时变量(第三个变量),实现两个数的交换。(按位异或支持交换律 即a^a^b == a^b^a)
#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;
}
5.赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
这些运算符都可以写成复合的效果。比如:
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。
6.单目操作符
6.1 单目操作符介绍(单目操作符只有一个操作数)
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(& * )应用于指针
(类型) 强制类型转换
关于sizeof其实我们之前已经见过了,可以求变量(类型)所占空间的大小。
7.关系操作符
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
这些关系运算符比较简单,没什么可讲的,但是我们要注意一些运算符使用时候的陷阱。
警告:
在编程的过程中== 和=不小心写错,导致的错误。
注意:
在C语言中,关系操作符(如 ==
、!=
、<
、<=
、>
、>=
)有返回值,但这个返回值不是传统意义上的“返回给某个变量”的值,而是直接作为表达式的结果。这些操作符用于比较两个操作数,并根据比较的结果返回布尔值(在C语言中,这通常是通过返回整数 1
(真)或 0
(假)来实现的,尽管C语言标准本身并不直接支持布尔类型,但<stdbool.h>
头文件提供了bool
、true
和false
的定义,这些在C99及之后的版本中是可选的)。
然而,在C语言的实际使用中,你通常会看到这些关系操作符被用在条件语句(如if
语句)或循环语句(如while
或for
循环)中,以及作为逻辑操作符(如&&
、||
和!
)的操作数。在这些情况下,你并不直接“接收”这些操作符的返回值,而是根据它们的返回值来决定程序的流程。
8.逻辑操作符
逻辑操作符有哪些:
&& 逻辑与
|| 逻辑或
区分逻辑与和按位与
区分逻辑或和按位或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
逻辑与和或的特点:
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++; // &&左边为假 , 右边不再计算
//i = a++||++b||d++; // ||这个左边为真,右边不再计算
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}