:#@TOC
C语言操作符小结
通过老师的讲解还有我自己对这一部分的理解,我对这一部分做如下总结:
1.操作符分类
.算术操作符
.移位操作符
.位操作符
.赋值操作符
.单目操作符
.关系操作符
.逻辑操作符
.条件操作符
.逗号操作符
.下标引用,函数调用和结构成员
2.具体介绍
.算术操作符:+ - * /
除了%操作符之外,其他的几个可以用于证书和浮点数。
对于 / 操作符如果两个操作数都为整数,执行整数除法,而只要有浮点数执行就是浮点数除法。
% 操作符的两个操作数必须为整数,返回的是整除之后的余数。
.移位操作符:
<< 左移操作符 >> 右移操作符
左移操作符移位规则:
1.> 逻辑移位:左边抛弃,右边补0。
注意:整数左移一位有乘 2 的效果,左移两位乘4。
int num = 10;
00000000000000000000000000001010 //num在内存中的二进制
00000000000000000000000000010100 //num左移一位产生生的结果
num << //但实际上num在没被赋值的情况下,自身的值不会变化 int num = 10;
00000000000000000000000000001010 //num在内存中的二进制
00000000000000000000000000010100 //num左移一位产生生的结果
num << //但实际上num在没被赋值的情况下,自身的值不会变化
右移操作符的移位规则 :
1.> 逻辑移位: 左边用0填充,右边丢弃。
2.> 算术移位: 左边用该值得符号位填充。
注意:右移一位有除二的效果;负数的符号位为1。
例如: 求一个整数存储在内存中的二进制中1的个数。
#include<stdlib.h>
#include<stdlib.h>
int main()
{
int num = 0;
printf("请输入一个整数:\n");
scanf("%d",&num);
int i = 0;
int count = 0; //计数
while(num)//num只要不为0,就最少有一个1
{
count++;
num = num & (num-1); // 把num中的1变为0
}
printf("二进制中1的个数: %d", count);
system("pause");
return 0;
}
警告 : 对于移位运算符,不要移动负数位,这个是标准未定义的。
.位操作符:
& : 按位与,有0为0,全1为1。
| : 按位或,有1为1,全0为0。
^ :按位异或,相异为1,相同为0。
注意: 他们的操作数全为整数,都是对二进制数进行运算。
例如:不能创建临时变量(第三个变量),实现两个数交换。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf(" a= %d b= %d\n", a,b);
system("pause");
return 0;
}
.赋值操作符:
可以给自己重新赋值,也可以连续使用
复合赋值符:
+= , -=
*= , /=
%= , >>=
<<= , &=
|= , ^=
这些运算符都可以写成复合的效果,让代码更加简洁。
.单目操作符:
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位),既可以求变量,也可以求类型的大小。
~ 对一个数的二进制按位取反
--前置 先减减,再使用
后置-- 先使用,后减减
++前置 同上
后置++ 同上
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
int a = (int) 3.14
.关系操作符:
>
>=
<
<=
!=
==
.逻辑操作符:
&&-----逻辑与,表达式为假不继续算
||-----逻辑或,表达式为真不继续算
.条件操作符:
exp1 ? exp2 : exp3
if(a>5)
{
b = 3;
}
else
{
b = -3;
}
//转换成条件表达式为: a > 5 ? 3 : -3;
经典例题 :
int i = 0 , a = 0 , b = 2 , c = 3 , d = 4 ;
i = a ++&&++b&&d++;
// i = a +=||++b||d++;
printf("%d %d %d %d" , a ,b,c,d);
//第一个表达式的结果为1 2 3 4;第二个表达式的输出为:1 3 3 4 。
.逗号表达式:
exp1 , exp2 , exp3 , ... ,expn
1.定义:用逗号隔开表达式
2.结果:从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
int a = 1;
int b = 2;
int c = (a > b , a = b + 10 , a , b = a + 1); // c = 13
.下标引用,函数调用和结构成员
1.[]:操作数为一个数组名 + 一个索引值。
2.():函数调用操作符,接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员,分为两类: 结构体.成员名;结构体指针->成员名
struct stu
{
char name[10];
int age;
char id[12];
};
这只是定义了一个结构体,不会向内存申请空间。
struct stu s;
struct stu *p = &s;
strcpy((*p).name,"张三");
strcpy((*p).id,"201606060501");
*p.age = 18;
指针还有另外一种简洁的方式
strcpy(p->name,"张三");
strcpy(p->id,"201606060501");
p->age = 18;