操作符
一、算数操作符
+ - * / %
1. 除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. %操作符的两个操作数必须为整数。返回的是整除之后的余数。
二、移位操作符
1.左移操作符 << (x<<1等同于x*2)
移位规则:左边抛弃,右边补零
2.右移操作符 >> (x<<1等同于x/2)
移位规则:左边抛弃,右边补零
右移运算分两种:(1)逻辑移位左边用0填充,右边丢弃(2) 算术移位左边用原该值的符号位填充,右边丢弃
注意:对于移位运算符,不要移动负数位,这个标准是未定义的
int num = 15; num >> -1; //error
三、位操作符
& //按位与 0011&1100==0000
| //按位或 0011|1100==1111
^ //按位异或 0011^1100==1111
四、赋值操作符
=
五、复合赋值符
+= -= *= /= %= >> = << = & = |= ^=
六、单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置
后置--
++ 前置
后置 ++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
这里讲解sizeof
int main()
{
int a = 0;
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof a);
printf("%d\n", sizeof int);//错误的表达
return 0;
}
sizeof和数组
1. sizeof(数组名)--数组名表示整个数组sizeof(数组名)求取的是整个数组的大小,单位是字节。
2. &数组名---数组名也表示整个数组,所以&数组名,取出的是整个数组的地址
3. 除此之外,所有遇到的数组名都是首元素的地址
4.sizeof()内部表达式不参与运算
七、关系操作符
>
>=
<
<=
!= 用于测试“不相等
== 用于测试“相等”
八、逻辑操作符
&& 逻辑与
|| 逻辑或
1&2----->0
1&&2---->1
1|2----->3
1||2---->1
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++&&++b&&d++;//(1)
//i = a++||++b||d++;(2)
printf("a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
system("pause");
return 0;
}
结果(1) 1 2 3 4对于逻辑与,前面为假后面不用算
结果(2) 1 3 3 4对于逻辑或,前面为真后面不用算
九、条件操作符
exp1?exp2:exp3
十、逗号表达式
exp1,exp2,:exp3,……,expN
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
十一、下标引用、函数调用和结构成员
1.[]
操作数:一个数组名,加一个索引值
2.()
函数调用操作符
接受一个或多个操作数:第一个是数组名,剩余的十传递给函数的参数
3.访问一个结构体成员
两种访问成员的形式
#include <string.h>
#include <stdio.h>
#include<Windows.h>
struct Stu
{
char name[20];
short int age;
char id[15];
char sex[6];
};
void test(struct Stu* ps)
{
strcpy(ps->name, "王五");
ps->age = 40;
//(*ps).name
strcpy((*ps).name, "李四");
(*ps).age = 30;
}
int main()
{
struct Stu s;
test(&s);
printf("%s\n", s.name);
printf("%d\n", s.age);
strcpy(s.name, "张三");
s.age = 20;
strcpy(s.sex, "男");
printf("%s\n", s.name);
printf("%d\n", s.age);
printf("%s\n", s.sex);
return 0;
}