C语言操作符
目录
C语言操作符
1.位操作符
2.赋值操作符
3. 单目操作符
4.关系操作符
5.逻辑操作符
6.条件操作符
7.逗号操作符
8.下标引用,函数调用操作符
9.访问结构成员操作符
1.位操作符
*注意:位操作符是针对补码进行操作的
a.按位与
符号:&
规则:有假则假
按位与指两个数的二进制位进行比较,不同为0,相同为1.例如十进制3与5,3&5的结果为应为10进制数字1. -3&-5的结果应为十进制-7.附上二进制计算过程和验证代码①如下:
①.计算过程:
3和5:
3的二进制补码为:00000000000000000000000000000011
5的二进制补码为:00000000000000000000000000000101
3&5的二进制补码:00000000000000000000000000000001,对应十进制应为1
-3和-5:
-3的二进制补码为:111111111111111111111111111111111101
-5的二进制补码为:111111111111111111111111111111111011
-3&-5的二进制补码为:111111111111111111111111111111111001,对应的十进制数应为-7.
验证代码:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = -3; int b = -5; int c = a & b;//注意对象,补码 printf("%dn", c); return 0; }
b.按位或
符号:|
规则:有真则真
按位或是指将两个数的二进制位进行比较,只要有1则为1,否则为0. 3|5的结果为应为10进制数字7. -3|-5的结果应为十进制-1.附上二进制计算过程和验证代码②如下:
②计算过程:
3和5:
3的二进制补码为:00000000000000000000000000000011
5的二进制补码为:00000000000000000000000000000101
3&5的二进制补码:00000000000000000000000000000111,对应十进制应为7
-3和-5:
-3的二进制补码为:111111111111111111111111111111111101
-5的二进制补码为:111111111111111111111111111111111011
-3&-5的二进制补码为:111111111111111111111111111111111111,对应的十进制数应为-1.
验证代码:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = -3; int b = -5; int c = a | b;//针对补码 printf("%dn", c); return 0; }
c.按位异或
符号:^
规则:同假异真
按位异或是指将两个数的二进制位进行比较,相同为0,不同为1 .十进制数字 3^5的结果为应为10进制数字6. -3^-5的结果应为十进制6.附上二进制计算过程和验证代码③如下:
②计算过程:
3和5:
3的二进制补码为:00000000000000000000000000000011
5的二进制补码为:00000000000000000000000000000101
3^5的二进制补码:00000000000000000000000000000110,对应十进制应为6
-3和-5:
-3的二进制补码为:111111111111111111111111111111111101
-5的二进制补码为:111111111111111111111111111111111011
-3^-5的二进制补码为:00000000000000000000000000000110,对应的十进制数应为6
验证代码③:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = -3; int b = -5; int c = a ^ b;//补码符号位发生变化 printf("%dn", c); return 0; }
2.赋值操作符
a.赋值操作符
符号:=
注意事项:区分“==”判断运算符
例子:例如a=5是将5的值赋值给变量a,而a==5是判断a与5是否相等
3. 单目操作符
下面对主要的单目操作符进行介绍:
a.逻辑反操作:
符号:!
以下列代码进行解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 1; if (a) { printf("加油n"); } if (!a) { printf("一起加油n"); } return 0; } 将变量a初始化为1,那么if(a)为真,则程序的执行结果为“加油”。if(!a)为假,那么不执行这if里的语句。逻辑反“!”即将真转化为假,假转换为真。如果将上面a的值初始化为0,那么程序的执行结果应该为”一起加油“。
b. 取地址操作符/(简介访问操作符)解引用操作符
符号:&/*
以下列代码进行解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 10; int* p = &a; *p = 20; printf("%dn", a); return 0; } &a将a变量的地址取出存放在指针变量p中,*p即指将通过p中存放的地址找到变量a,*p=20相当于a=20。
c.操作数的类型长度
注意事项:计算变量类型的长度,以字节为单位。
符号:sizeof
以代码进行解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 10; char c = '8'; int* p = &a; int arr[10] = { 0 }; printf("%dn", sizeof(a));//打印整型a的字节长度,结果为4 printf("%dn", sizeof(int));//或者 printf("%dn", sizeof a );但是当sizeof后是变量类型时括号不可以省略,结果也为4 printf("%dn", sizeof(c));//结果为1 printf("%dn", sizeof(char));//结果为1 printf("%dn", sizeof(p));//指针变量,结果为4 printf("%dn", sizeof(int*));结果为4 printf("%dn", sizeof(arr));//结果为40,10个元素,每个元素4个字节 printf("%dn", sizeof(int [10]));//结果为40 return 0; }
d.对一个数的二进制位取反
符号:~
即对一个数的二进制位取反,包括符号位,注意操作对象是补码。例如:~(-3)=2,下面是计算过程:
原码:10000000000000000000000000000011
反码:11111111111111111111111111111100
补码: 11111111111111111111111111111101
按位取反后:00000000000000000000000000000010,对应的十进制数为:2
验证代码:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = -3; printf("%dn", (~a)); return 0; }
e. 自增,自减运算符
符号:++,--
注意:前置后置的区别
直接上代码:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 10; printf("%dn", a);//打印结果为10 printf("%dn", a++);//后置++,先使用,再++ 打印结果为10,a的值变为11 printf("%dn", ++a);//前置++,先++,再使用 打印结果为12 printf("%dn", a);//经过a++,++a,打印结果为12 return 0; }
f.强制类型转换
符号:(类型)
直接看代码:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { double a = 3.1415; int b = (int)a;//(int)将double类型的3.1415转换为整型3赋值给整型变量b printf("%dn", b); return 0; }
4.关系操作符
注意:判断相等是“==”
5.逻辑操作符
a.逻辑与
符号:&&
两者比较,同为真,才为真
代码解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 3; int b = 5; int c = a && b;//a=3为真,b=5也为真,于是c也为真,即返回1 printf("%dn", c); return 0; } 若将a/b中任意一者或者都改为0,那么a&&b为假输出结果为0
b.逻辑或
符号:||
两者比较,一方为真则为真
代码解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 1; int b = 0; int c = a || b;//a为真,b为假。但是a||b为真,于是输出1 printf("%dn", c); return 0; } 若将a的值也改为0,那么二者均为假,a||b也为假,输出0
6.条件操作符
符号:exp1?exp2:exp3(三目操作符)
即条件1成立,表达式2即为表达式1的值,否则为表达式2的值
代码解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 0; int b = 0; int c = (a > b ? 4 : 6);//很显然a>b为假,于是6即为表达式的值 printf("%dn", c); return 0; }
7.逗号操作符
符号如上:
规则:从左到右依次计算表达式的值,最后一个表达式的值为整个表达式的值。
代码解释:
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #includeint main() { int a = 10; while (a -= 2, a -= 1,a>0)//最后一个表达式的值为整个表达式的值,于是这个循环应当共进行3次,第一次,a=7;第二次,a=4;第三次,a=1;第4次,a<0结束循环 { printf("加油n"); } return 0; }
8.下标引用,函数调用操作符
符号:下标引用操作符:[ ],函数调用操作符:()
规则:略
注意:操作数。
例如:arr[4],下标引用操作符"[ ]"的操作数为数组和’4‘;get_xb(a,b)函数调用操作符“()”的操作数为函数get_xb,a,b。
9.访问结构成员操作符
符号:.和->
使用:结构体变量.成员名 结构体指针变量->成员名
代码解释:
①.结构体变量.成员名
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include//创建一个结构体变量 struct stu { //描述结构体变量的成员变量 char name[25]; int age; char num[20]; }; int main() { struct stu s1 = { "小明",19,"2109060606" }; printf("%sn", s1.name); return 0; } ②.结构体指针变量->成员名
#define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #include//创建一个结构体变量 struct stu { //描述结构体变量的成员变量 char name[25]; int age; char num[20]; }; int main() { struct stu s1 = { "小明",19,"2109060606" }; struct stu* ps = &s1;//创建一个struct stu型的指针变量来存放该类型变量s1的地址 printf("%sn", ps->name);//访问时,结构体指针变量->成员名 return 0; }



