操作符的分类:
- 算术操作符
- 移位操作
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员
- 操作符的属性
1.算术操作符:
+ - * / %
注意:%只能用于整数,返回的是整除之后的余数
2.移位操作
<< 左移操作符
>> 右移操作符
移位规则:
左移操作符:左边抛弃,右边补0
右移操作符:(1)逻辑位移 左边用0填充 ,右边丢弃
(2)算术位移 左边用该原值的符号位填充,右边丢弃
注意:不可用移位操作符移动负数位
3.位操作符
& 按位与
| 按位或
^ 按位异或
示例代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;
int b = 2;
printf("%d\n",a&b);
printf("%d\n",a|b);
printf("%d\n",a^b);
system("pause");
return 0;
}
4.赋值操作符
=
int i = 1234;
int j = 10;
int z = 0;
i = j = z+1;//连续赋值
复合赋值符:
+=
*=
/=
%=
>>=
<<=
&=
|=
^=
例如:
int i = 5;
i = i+10;
i += 10;//复合赋值
5.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
示例代码:
int main()
{
int a= -15;
int *p = NULL;
printf("%d\n",!2);
printf("%d\n",!0);
a = -a;
p = &a;
printf("%d\n",a);
printf("%d\n",*p);
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof a);
/*printf("%d",sizeof int);*/ //错误的写法
system("pause");
return 0;
}
6.关系操作符
>
>=
<
<=
!= 用于测试不相等
== 用于测试相等
注意:在编程中==和=不小心写错,会导致错误
7.逻辑操作符
&& 逻辑与
|| 逻辑或
示例代码:
int main()
{
int a=0,b=2,c=3,d=4;
int i = a++ && ++b && d++;
printf(" a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
system("pause");
return 0;
}
int main()
{
int a=1,b=2,c=3,d=4;
int i = a++ && ++b && d++;
printf(" a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
system("pause");
return 0;
}
int main()
{
int a=1,b=2,c=3,d=4;
int i = a++ || ++b || d++;
printf(" a=%d\n b=%d\n c=%d\n d=%d\n",a,b,c,d);
system("pause");
return 0;
}
8.条件操作符
exp1 ? exp2 : exp3
示例代码:
int main()
{
int a=6,b=9;
b= a>3 ? 2:4;
printf("%d\n",b); //2
system("pause");
return 0;
}
9.逗号表达式
exp1,exp2,exp3,...expn
就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
示例代码:
int main()
{
int a = 1;
int b = 9;
int c =(a>b,a=b+10,a,b=a+1); //20
printf("%d\n",c);
system("pause");
return 0;
}
10.下标引用、函数调用和结构成员
(1) [ ]下标引用操作符
操作数:一个数组名+一个索引值
int arr[10]; //创建数组
arr[9] = 10; //实用下标引用操作符
(2) ( )函数调用操作符 接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
示例代码:
#include<stdio.h>
#include<stdlib.h>
void test1()
{
printf("Mercylin ");
}
void test2(const char *str)
{
printf("%s\n",str);
}
int main()
{
test1(); //实用( )作为函数调用的操作符
test2("Jackson");
system("pause");
return 0;
}
(3) 访问一个结构的成员
. 结构体.成员名
-> 结构体指正->成员名
示例代码:
#include<stdio.h>
#include<stdlib.h>
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4},1958};
void print1(struct S s) //结构体传参
{
printf("%d\n",s.num);
}
void print2(struct S* ps) //结构体地址传参
{
printf("%d\n",ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
system("pause");
return 0;
}
11.操作符的属性:
复杂表达式的求值有三个影响属性:
(1)操作符的优先级
(2)操作符的结合性
(3)是否控制求值顺序
注意:如果写出的表达式不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在问题的。