1.算数操作符
+
-
*
/ // 5 / 2 = 2
% // 5 % 2 = 1
注:
1.除%操作符之外,其他的几个操作符均可作用与整数和浮点数,但需要注意结果打印的格式和精度缺失。
2.对于/操作符,如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符
左移操作符 <<
移位规则:左边抛弃、右边补零
int num = 10; //00000000000000000000000000001010 num在内存中的二进制
num = num >> 1; //00000000000000000000000000010100 num左移一位的结果
右移操作符 >>
1.算数移位(常用)
移位规则:左边用原该值的符号位填充、右边丢弃
2.逻辑移位
移位规则:左边用0补充、右边丢弃
int num = -1; //11111111111111111111111111111111 内存中-1的补码
//算数右移 11111111111111111111111111111111 左边用原该值的符号位填充
//逻辑右移 01111111111111111111111111111111 左边用0补充
3.位操作符
& //按位与 两数补码同位比较,同为1为,其余为0
| //按位或 两数补码同位比较,有1就取1,都为0才取0
^ //按位异或 两数补码同位比较,相同取0,不同取1
注:操作数必须是整数
#include <stdio.h>
int main()
{
int num1 = 1; //00000000000000000000000000000001
int num2 = 2; //00000000000000000000000000000010
num1&num2; //00000000000000000000000000000000
num1|num2; //00000000000000000000000000000011
num1^num2; //00000000000000000000000000000011
}
例:求一个整数存储在内存中的二进制中1的个数
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0; //计数
for (i = 0; i < 32; i++)
{
if (((num >> i) & 1) == 1)
count++;
}
printf("二进制中1的个数 = %d\n", count);
return0;
}
4.赋值
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
a += 1,即a = a + 1
5.单目操作符
! //逻辑反操作 对非0的数反为0,对0取反为1
- //负值
+ //正值
& //取地址
sizeof //操作数的类型长度(以字节为单位)
~ //对一个数的二进制按位取反
-- //前置、后置--
++ //前置、后置++
* //间接访问操作符(解引用操作符)
(类型) //强制类型转换
sizeof和数组
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr)); //4
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch)); //4
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr)); //40
printf("%d\n", sizeof(ch)); //10
test1(arr);
test2(ch);
return 0;
}
++和- -运算符
前置++、- -
int a = 10;
int x = ++a; //x = 11 先对a进行自增,然后使用a
int y = --a; //y = 10 先对a进行自减,然后使用a
后置++、- -
int a = 10;
int x = a++; //x = 10 a = 11 先使用a,然后对a进行自增
int y = a--; //y = 11 a = 10 先使用a,然后对a进行自减
解引用操作符
int a = 10;
int p = &a; //定义指针p
p = 20; //解引用操作
6.关系操作符
>
>=
<
<=
!= //用于测试“不相等”
== //用于测试“相等”
注:在编程的过程中==和=写错,导致错误
7.逻辑操作符
&& //逻辑与
|| //逻辑或
注:逻辑与中,一旦出现0,则为0,后面的不再计算
逻辑与和按位与、逻辑或和按位或
1&2 ------> 0
1&&2 -----> 1
1|2 ------>3
1||2 ----->1
8.条件操作符
exp1 ? exp2 : exp3
a > 5 ? b = 3 : b = -3
9.逗号表达式
exp1, exp2, exp3, ...expn
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
int a = 1;
int b = 2;
int c = (a > b, a = a+10, a, b = a + 1); //逗号表达式
10.下标引用、函数调用和结构成员
1.[ ]
操作数:一个数组名 + 一个索引值
扫描二维码关注公众号,回复:
127576 查看本文章
int arr[10]; //创建数组
arr[9] = 10; //使用下标引用操作符
//[]的两个操作数是arr和9
2.( )
函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
#include <stdio.h>
void test1()
{
printf("哈哈\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //使用()作为函数调用操作符
test2("hello"); //使用()作为函数调用操作符
return 0;
}
3.访问一个结构成员
.结构体.成员名
->结构体指针->成员名
struct Stu
{
char name[10];
int age;
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu; //结构体成员访问
stu.age = 20; //结构体成员访问
pStu->age = 20; //结构体成员访问
return 0;
}
11.表达式求值
隐式类型转换
c的整型算数计算总是至少以缺省整型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换被称为“整型提升”。
算术转换
寻常算术转换
long double
double
float
uunsiged long int
long int
unsigned int
int
如果某个操作数的类型在上面的列表中排名较低,那么首先要转换为另一个操作数的类型后执行运算。
float f = 3.14;
int num = f; //隐式转换,会有精度丢失