一、算数操作符
+ - * / %
1、除了%操作符之外,其他的几个操作符可以作用于整数和浮点数
2、对于两个操作数都为整数的/运算,执行整数除法。只要有一个操作数为浮点数就执行浮点数除法
3、%运算要求操作数都是整数
二、移位操作符
1、<<:左移操作符
左边抛弃、右边补0
2、>>:右移操作符
(1)算数移位
左边补0,右边抛弃
(2)逻辑移位
左边补该值的符号位,右边抛弃
面试题:求一个整数存储在内存中二进制中1的个数?
#include<stdio.h>
int main()
{
int num = 10;
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("num的二进制中1的个数:%d\n", count);
system("pause");
return 0;
}
#include<stdio.h>
int main()
{
int num = 10;
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (((num>>1)&1) == 1)
count++;
num = num / 2;
}
printf("num的二进制中1的个数:%d\n", count);
system("pause");
return 0;
}
三、位操作符
&:按位与
|:按位或
^:按位异或
面试题:不创建临时变量,实现两个数的交换
四、赋值运算符
=:可以别人给你赋值,也可以自己给自己赋值
五、复合运算符
+= -= *= /= %= >>= <<= &= |= ^=
六、单目操作符
!:逻辑反操作
-:负值
&:区地址
sizeof:操作数的类型长度(以字节为单位)
void test1(int arr[])
{
printf("%d\n", sizeof(arr));
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(ch));
test1(arr);
test2(ch);
system("pause");
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/553962333011a3ea84c654089980549c.png)
~:对一个数的二进制按位取反
--:前置--(先--后使用)、后置--(先使用后--)
++:前置++(先++后使用)、后置++(先使用后++)
*:间接访问操作符(解引用操作符)
(类型):强制类型转换
七、关系操作符
>:大于
>=:大于或等于
<:小于
<=:小于或等于
!=:不等于(测试不相等)
==:等于(测试相等)
注意:==(等于)和=(赋值)之间的区别和使用
八、逻辑操作符
&&:逻辑与
||:逻辑或
笔试题
九、条件操作符
exp1?exp2:exp3:如果语句1为真则执行语句2,否则执行语句3
if (a > 5)
{
a = 3;
}
else
{
a = 6;
}
a = (a > 5) ? (3) : (6);
十、逗号表达式
exp1,exp2,exp3,....,expN:从左到右一次执行,表达式的结果是最后一个表达式的结果
十一、下标引用、函数调用和结构成员
1、[]:操作数——一个数组名+一个索引值
arr[3]
2、():操作数——函数名+传递给函数的参数
void test(int x,int y)
3、访问一个结构的成员
.结构体.成员名
->结构体指针->成员名
struct Stu
{
char name[10];
int age;
char sex[5];
};
int main()
{
struct Stu stu;
strcpy(stu.name, "小明");
stu.age = 20;
struct Stu *pstu = &stu;
strcpy(pstu->sex,"男");
}
十二、表达式求值
表达式求值的顺序由操作符的优先级和结合性决定
1、隐式类型转换(整型提升):运算中将缺省整型类型的操作符转换成整型,再计算,运算完后,将结果截断在存储
隐式类型转换会有精度丢失
2、算数转换:两个操作符的类型不一样,编译器会将其中一个操作符的类型转换成另一个的类型再进行计算
long double
double
float
unsigned long int
long int
unsigned int
int
从上往下进行转换
影响表达式求值的因素:
(1)操作符的优先级
(2)操作符的结合性
(3)是否控制求值顺序