操作符
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员
算术操作符
+ - * / %
注意:
1.对于/操作符,若两个操作数均为整数,则执行整数除法;若有一个为浮点数,则执行浮点数除法
2.%的两个操作数必须为整数
移位操作符
<< 左移操作符
>> 右移操作符
左移操作符移位规则:
左边抛弃、右边补0
注意:
num<<1运算完之后num的值不变,还存在cpu中;
若想改变其值,需要进行赋值操作,即num<<=1,此时它存在内存中。
右移操作符移位规则:
1.逻辑移位 左边用0填充,右边丢弃
2.算术移位 左边用原值的符号位填充,右边丢弃
一般来讲,若右移的源操作数为无符号数,则逻辑移位;若为有符号数,则算术移位。
!!! 警告:对于移位运算符,不能移动负数位。例如:
int num = 10;
num>>-1;//error
位操作符
& //按位与
| //按位或
^ //按位异或
注意:他们的操作数必须为整数。
赋值操作符
赋值操作符可以连续使用,比如:
int a=0;
int x=10;
int y=20;
a=x=y+1;
这种方式最好不要使用,容易使别人误会。可以改成下面的形式:
x=y+1;
a=x;
这样写更清晰且易于调试。
复合赋值符:
+=
-=
*=
/=
%=
>>=
&=
|=
^=
单目运算符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
- - 前置、后置- -
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
注意:强制类型转换不是转化,没有修改目标转换的内容。
sizeof和数组:
#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
void test1(int arr[]) {//注意数组传参要降维为指针
printf("%d\n", sizeof(arr));//输出4
}
void test2(char ch[]) {
printf("%d\n", sizeof(ch));//输出4
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//输出40
printf("%d\n", sizeof(ch));//输出10
test1(arr);
test2(ch);
system("pause");
return 0;
}
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注意:编程时区别==和=的不同。
逻辑操作符
&& 逻辑与
|| 逻辑或
注意:区别逻辑与和按位与 and 逻辑或和按位或
360笔试题:
#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++ b && d++;//输出结果为1 2 3 4
//i=a++||++b||d++;//输出结果为1 3 3 4
printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);
system("pause");
return 0;
}
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1,exp2,exp3,…expN
逗号表达式,就是用逗号隔开的多个表达式。逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
下标引用、函数调用和结构成员
1.[ ] 下标引用操作符
操作数:一个数组名+一个索引值。
2.()函数调用操作符
可有一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3.访问一个结构的成员
.结构体.成员名
->结构体指针->成员名
如:stu.age=20;
pstu->=20;