1、算术操作符
+
-
*
/
%
对于
/
来说,如果想有得到一个小数,除数与被除数之间至少都有一个浮点数类型;取模操作符
%
左右两端必须都是整数。
int main() { double a = 6 / 5; //1.000000 double b = 6.0 / 5.0; //1.200000 printf("a:%lf\nb:%lf", a, b); int c = 7 % 3; printf("%d", c); return 0; }
2、移位操作符
<< >>
<<左移操作符:左边丢弃,右边补0;
>>右移操作符:
1.算术右移:右边丢弃,左边补原符号位;
2.逻辑右移:右边丢弃,左边补0;
对于移位运算符,不能移动负数位,这个是标准未定义的。
int main() { int a = 2; int b = a << 1; printf("%d", b); return 0; }
int main() { int a = 10; int b = a >> 1; printf("%d", b); return 0; }
int main() { int a = -1; int b = a >> 1; printf("%d", b); return 0; }
3、位操作符
& | ^
&按位与:按(2进制)位与,二进制位有0为0,全1为1;
|按位或:按(2进制)位或,二进制位有1为1,全0为0;
^按位异或:按(2进制)位异或,对应的二进制位进行异或,相同为0,不同为1。
int main() { int a = 3;//00000000 00000000 00000000 00000000 00000011 int b = 5;//00000000 00000000 00000000 00000000 00000101 //&按位与,有0为0,全1为1; //00000000 00000000 00000000 00000000 00000001 int c = a & b;//1 printf("%d\n", c); //|按位或,有1为1,全0为0; //00000000 00000000 00000000 00000000 00000111 int d = a | b;//7 printf("%d\n", d); //^按位异或,相同为0,不同为1。 //00000000 00000000 00000000 00000000 00000110 int e = a ^ b;//6 printf("%d\n", e); return 0; }
4、单目操作符
!
-
+
&
sieof()
~
--
++
*
(类型)
sizeof()
括号中的表达式不参与运算;单目操作符只有一个操作数。
int main() { int a = 10; printf("%p\n", &a);//& - 取地址操作符 int* pa = &a;//pa用来存放地址 - pa就是一个指针变量 *pa = 20;//* - 解引用操作符 - 间接访问操作符 printf("%d\n", a);//20 return 0; }
5、逻辑操作符
&&
||
&&
逻辑与,有假为假,全真为真;当&&
遇上假时,便不会再往下执行,直接返回假;
||
逻辑或,有真为真,全假为假;当||
遇上真时,便不会再往下执行,直接返回真。
6、条件操作符(三目操作符)
epx1 ? epx2 : exp3
如果
epx1
为真则返回epx2
,为假则返回epx3
。
7、下标引用、函数调用和结构成员
[]
()
.
->
[]
下标引用操作符,两个操作数:一个数组名,一个索引值;
()
函数调用操作符,任何函数调用都必须用函数调用操作符;
.
、->
结构成员访问操作符。
//创建一个学生类型 struct student { //成员变量 char name[20]; int age; double score; }; //创建一个书的类型 struct book { char name[20]; float price; char id[30]; }; int main() { //结构体的创建和初始化 struct student s = { "张三", 20, 85.5 }; //结构体变量.成员变量 printf("1:%s %d %lf\n", s.name, s.age, s.score); struct student* ps = &s; printf("2: %s %d %lf\n", (*ps).name, (*ps).age, (*ps).score); //结构体指针->成员变量名 printf("3: %s %d %lf\n", ps->name, ps->age, ps->score); return 0; }
8、部分操作符的应用
//不新建第3个变量的情况下,交换a,b的值 int main() { int a = 3; int b = 5; printf("a:%d b:%d\n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("a:%d b:%d", a, b); return 0; }
//求一个整数存储在内存中的二进制中1的个数 int main() { int a = 7; int b = 1; int i = 0; int ret = 0; for (i = 0; i < 31; i++) { int c = a & b; a = a >> 1; if (1 == c) { ret++; } } printf("a的二进制中有%d个1\n", ret); return 0; }
有部分操作符在前面已经写过了,还有些基础性的东西前面也有写:【学习笔记之菜Dog学C】初识操作符和原码、反码、补码