1.算术操作符
+:加法
-:减法
*:乘法
/:除法
%:求余(模)
注意:
①模(%)运算时,两个操作数必须为整数;其他的几个操作符可以用作于整数和浮点数。
int main()
{
int a = 10;
printf("%d\n",a%3.0);//error
return 0;
}
②除法(/)运算时,两个操作数只要有一个为浮点数,则为浮点数除法。操作数都为整数时,则为整数除法。
2.移位操作符
注意:
①内存里存的是二进制序列的补码,最高位是符号位,0表示正数,1表示负数;
②移位移的是二进制位;
③移位不能移负数位,例如a>>-1;
④移位操作符不用于浮点数;
⑤移位操作数如果不给自己赋值是不会改变自己的。a>>1;****a = a>>1;
(1)左移操作符:<<
左移一位有乘2的效果,一位是2的一次方
(2)右移操作符:>>
大部分编译器是算术移位。
3.位操作符
按位与:&
按位或:|
按位异或:^
(1)&
两个都为1则为1;只要有一个0则为0;
按位与的特点:
任何一个数字a跟1按位与,得到的结果如果为1,说明这个数字a最低位为1,若结果为0,说明最低位为0。
int main()
{
int a = 15;
a&1
//0000000000000000000000000000001111
//0000000000000000000000000000000001
//0000000000000000000000000000000001--1
printf("%d\n", a);
return 0;
}
(2)|
有一个1则为1。
(3)^
相同为0,相异为1。
int main()
{
int a = -1;
int b = 10;
int c = a^b;
//11111111111111111111111111111111——a的补码
//00000000000000000000000000001010——b的补码
//11111111111111111111111111110101——异或结果c(补码)
//11111111111111111111111111110100——减一
//10000000000000000000000000001011——取反得到原码
printf("%d\n", c);//-11
return 0;
}
按位异或特点:
①a与a异或=0;
②任何一个数与0异或等于其自身。
4.赋值操作符
(1) =
赋值操作符可以连续使用,比如:a = x = y+1;但不清晰爽朗。
写成以下形式更好:
x = y+1;
a = x;
(2)复合赋值符
①+= ②-= ③*= ④/= ⑤ %=⑥ <<= ⑦>>= ⑧&= ⑨|= ⑩^=
用法都如下:
a = a+10;
a += 10;
5.单目操作符
(1)逻辑反操作: !
真变假,假变真。
int main()
{
int flag = 10;
printf("%d\n", !flag);//!flag为假 输出0
return 0;
}
(2)负值: -
(3)正值: +
(4)取地址: &
①取变量地址
int main()
{
int a = 10;
printf("%p\n", &a);//%p打印地址
return 0;
}
②取数组地址
(数组名就是地址)
int main()
{
int arr[10] = {0};
printf("%p\n", arr);//数组名相当于首元素的地址
printf("%p\n", arr+1);//取出下一个元素的地址
printf("%p\n", &arr);//&数组名--取出的是数组的地址
printf("%p\n", &arr+1);//取出下一个数组的地址
return 0;
}
③函数地址
&函数名
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", &test);
return 0;
}
(5)操作数的类型长度: sizeof
①sizeof内部的表达式不参与运算,不计算。
int main()
{
short s = 10;
int a = 6;
printf("%d\n", sizeof(s=a+8));//2;a+8放到s这,就得按照s的类型
printf("%d\n", a);// 6
printf("%d\n", s);// 10;sizeof里面的表达式不计算
return 0;
}
int main()
{
int a = 10;//变量名去掉后,剩下的就是类型,int是a的类型
int arr[10] = {0};//int [10] 是arr的类型
printf("%d\n", sizeof a);//4
printf("%d\n", sizeof int);//error
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(arr));//40
printf("%d\n", sizeof(int [10]));//40
return 0;
}
(6)对一个数的二进制按位取反: ~
每位都取反,1变0,0变1
int main()
{
printf("%d\n", ~10);
//00000000000000000000000000001010 --10补码
//11111111111111111111111111110101--按位取反(补码)
//10000000000000000000000000001010--反码
//10000000000000000000000000001011--原码
return 0;
}
(7)前置、后置减减: –
前置:先加后用
后置:先用后加
(8)前置、后置加加: ++
(9)间接访问操作符(解引用): *
int main()
{
int a = 10;
int * p = &a;//这里的*是指针类型
*p = 20;//这个*是解引用操作符
return 0;
}
(10)强制类型转换: (类型)
注意:
①强制类型转换可以,但不推荐;
②括号是给类型带,不能给数字带。
int main()
{
int a = 3.14;//有警告
int a = (int)3.14;// √
int a = int(3.14);//error
return 0;
}
6.关系操作符
(1)>
(2)>=
(3)<
(4)<=
(5)!=
(6)==
注意 == 不能用来判断两个字符串是否相等,应使用strcmp();
7.逻辑操作符
(1)逻辑与: &&
只要两个操作数有一个为假则为假;同时为真才为真
注意:当第一个表达式为0时,后面的表达式就不算,不执行了
(2)逻辑或: | |
有一个为真则为真;两个同时为假才为假
注意:当第一个表达式为1时,后面的表达式就不算,不执行了
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);//1 2 3 4
return 0;
}
8.条件操作符
exp1 ? exp2 : exp3
当exp1为真时执行exp2;当exp1为假时执行exp3
9.逗号表达式
逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
int main()
{
int a = 1;
int b = 2;
int c = (a > b,a = b+10,a,b = a+1)
printf("%d\n",c);//13
return 0;
}
10.下标引用、函数调用和结构成员
(1)下标引用: [ ]
两个操作数;比如 arr [4],arr是一个,4是一个
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%d\n", arr[4]);//5
printf("%d\n", *(arr+4));//5
printf("%d\n", *(4+arr));//5
printf("%d\n", 4[arr]);//5
return 0;
}
(2)函数调用
函数名();
最少有一个操作数,即为它的函数名。
(3)结构成员
访问一个结构的成员;
①.结构体.成员名
struct Stu //是一个类型,不占用空间
{
//学生的属性
char name[20];
int age;
float score;
};
int main()
{
struct Stu s;//创建一个学生类型的变量,s占空间
//s.name = "zhangsan";//error,应该写成以下形式
strcpy(s.name, "zhangsan");//字符串拷贝
s.age = 20;
s.score = 55.0f;
printf("%s %d %f\n", s.name, s.age, s.score);
return 0;
}
②->结构体指针->成员名
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
struct Stu s;
struct Stu* ps = &s;
strcpy(s.name, "zhangsan");
s.age = 20;
s.score = 55.0f;
//printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score);
printf("%s %d %f\n", ps->name, ps->age, ps->score);
return 0;
}