目录

算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下表引用、函数调用和结构成员
+ - * / %
加 减 乘 除 取余
用法:
1、除了%之外,其他几个操作符能用作整数和浮点数。%只能用于整数
2、对于/操作符,如果两个操作数都是整数,那就是整数运算。如果有浮点数,那就是进行浮点数除法。
3、%得到的是整除之后的余数。 例如:5%2的值为1。
<< 左移操作符 >> 右移操作符
左移操作符的移位规则:左边的抛弃、右边的空位由0补足。

右移操作符的移位规则分为两种:
1、逻辑移位:左边空位用0补足,右边的直接丢弃。
2、算术移位:左边用符号补足,右边的直接丢弃。
警告:对于移位运算符,不要移动负数位,这个是标准未定义的。

& --按位与 | --按位或 ^ --按位异或
按位与是两个二进制代码如果对应位上的数字都为1,那么得1,否就得0。
按位或是两个二进制代码如果对应位上的数字有一个为1,那么得1,否则得0。
按位异或是两个二进制代码如果互不相同,那么得1,否则得0。

这道题中b最后和a的数值是互换了,因为a^a^b=b , b^b^a=a。两个相同的数字异或是0
我们通常用=号来给变量赋值。
复合赋值符:
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
值得一提的是,++和--符分为前置和后置,前置是先使用后操作,后置是先操作后使用。
例如:
int a=10;
int b=a++;
printf("%d %d\n",a,b);这其中打印的b的值为10,而a为11
就是因为在先使用了a赋值给b再实现自增。
强制类型转换()的使用方法:

这样得到的a是3
>
>=
<
<=
!= 用于测试“不相等
== 用于测试“相等
注意:很多人在比较的时候容易将“==”打成“=”,这样就由比较变成赋值了,是一个比较容易犯的错误。
&& --逻辑与 || --逻辑或
360曾经的一道笔试题

输出的结果是1 2 3 4和 1 3 3 4
因为逻辑与在从左向右判断的时候碰到假项后就不再执行。
逻辑后则是再判断的时候碰到真项之后就不再判断。
exp1 ? exp2 : exp3
如果表达式1成立那么实现表达式2,否则实现表达式3。
exp1, exp2, exp3, …expN
从左向右执行
1、下标引用操作符 [ ]
操作数:一个数组名 + 一个索引值
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
[ ]的两个操作数是arr和9。数组名传的是第一个下标,所以

上面两行打印效果相同,都是打印了同一个地址

上面的效果也相同,都是打印了同一个元素。
函数操作符()
在函数名之后
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //实用()作为函数调用操作符。
test2("hello bit.");//实用()作为函数调用操作符。
return 0;
}结构成员访问
. 结构体.成员名
-> 结构体指针->成员名
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score; };
void set_age1(struct Stu stu) {
stu.age = 18; }
void set_age2(struct Stu* pStu) {
pStu->age = 18;//结构成员访问
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0; }