操作符的分类
1 算术操作符
C提供了所有常用的算术操作符:
+ - * / %
注:(1)除了%操作符外,其余几个操作符都是既适用于浮点型类型又适用于整数类型;
(2)当/操作符的两个操作数都是整数时,它执行整除运算,在其他情况下则执行浮点数除法;
(3)%操作符的两个操作数必须为整数。返回的是整除之后的余数。
2 移位操作符
移二进制序列,移位是正数位
(1)<< 左移操作符
移位规则:左边丢弃,右边补0;
注:a<<1; //此操作a没有被赋值,自身的值不会变化
a = a<<1; //a被赋值,值发生改变
>> 右移操作符
移位规则:逻辑移位:左边用0填充,右边丢弃
算术移位:左边用原先该值的符号位填充,右边丢弃
由编译器决定选择逻辑右移还是算术右移。
3 位操作符
操作数必须是整数
按位与 &
A&B | 0 | 1 |
0 | 0 | 0 |
1 | 0 | 1 |
按位或 |
A|B | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 1 |
按位异或 ^
A^B | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
例子:int a = 1,b = 2;
//001 a
//010 b
a&b = 0; //000
a|b = 3; //011
a^b = 3; //011
4 赋值操作符
(1)结合性:从右至左
例如:a = x = y + 3相当于 a = (x = y + 3)
(2)复合赋值符:+= -= *= /= %= <<= >>= &= ^= |=
例如:x = x + 3相当于x += 3
5 单目操作符
! | 逻辑反操作 | 产生一个整型结果,0或1 |
- | 负值 |
|
+ | 正值 |
|
& | 取地址符 |
|
~ | 对一个数的二进制按位取反 | 原先为1的位变为0,原先为0的位变为1 |
sizeof | 操作符的类型长度(单位是字节) | 产生操作数的地址 |
-- | 前置、后置-- |
|
++ | 前置、后置++ |
|
* | 间接访问操作符(解引用操作符) | 用于访问指针所指向的值 |
(类型) | 强制类型转化 |
|
注:(1)&arr表示整个数组的地址;sizeof(arr)表示整个数组的长度,单位是字节。
int arr[10] = {0};
printf("%d\n", sizeof(arr)); //40 打印整个数组的长度
printf("%d\n", sizeof(arr+0)); //4 打印数组首元素的长度
(2)数组传参传首元素地址,数组传参时不能在函数内求数组个数。
viod test(int arr[])
{
int i = 0;
for(i=0; i<5; i++)
{
printf("%d\n",arr[i]);
}
}
int main()
{
int arr[5]={1,2,3,4,5}
test(arr);
return 0;
}
(3)打印类型的长度必带括号,如printf(“%d\n”,sizeof int)这条语句没有给int加(),所以是错误的写法。
int a = 10;
printf("%d\n", sizeof(a)); //打印a的长度
printf("%d\n", sizeof(int)); //打印int型的长度
printf("%d\n", sizeofa); //打印a类型的长度
//前面三个printf语句是相同的
printf("%d\n", sizeofint); // error 打印类型的长度必须给类型带上括号
(4)前置++和--:先++(--),后使用;后置++和--:先使用,后++(--)。
关于单目操作符一些例子:
int a = 10;
int *pa = &a;
int **ppa = &pa; //二级指针
int ***pppa =&ppa; //三级指针
int arr[10] = {0};
printf("%p\n", arr); //打印首元素地址
printf("%p\n", &arr[0]); //打印首元素地址
printf("%p\n", &arr); //打印整个数组的地址
int a = 0;
int s = 2;
printf("%d\n", sizeof(s=a+3)); //输出结果是2;此语句中“s=a+3”并没有实现赋值的功能
printf("%d\n", s); // 输出结果是2
int a = 10;
int *pa = &a;
*pa = 20; //此语句中的*是间接访问操作符
6 关系操作符
> >= < <= != ==
7 逻辑操作符
&& 逻辑与(一假即假)
|| 逻辑或(一真即真)
8 条件操作符
(表达式1) ? (表达式2) : (表达式3)
注:如果表达式1成立,则执行表达式2;否则,执行表达式3。
例子:求两个数中的较大值
int a = 10;
int b = 0;
int max = a>b?a:b;
9 逗号表达式
(表达式1),(表达式2),(表达式3),(表达式4),……,(表达式n)
注:逗号表达式从左向右执行。整个表达式的结果是最后一个表达式的结果。
10 下标引用、函数调用和结构成员
(1) 下标引用操作符 [] 操作数:一个数组名+一个索引值
(2) 函数调用操作符 () 操作数:函数名+传递给函数的参数
(3) 访问一个结构的成员 . 结构体.成员名 -> 结构体指针->成员名