操作符:算数操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号操作符,条件操作符,逗号操作符,下表引用、函数调用和结构成员
1.算数操作符 + - * / %
(1) %的两个操作数必须是整数,返回的是整除之后的余数
(2)/的两个操作数只要有一个是浮点数,则执行的就是浮点数除法
2.移位操作符 <<左移操作符 >>右移操作符
移位规则: 左移: 左边抛弃,右边补0
右移:分为逻辑右移和算数右移
逻辑右移:左边补0,右边丢弃
算数右移:左边用原值的符号位填充,右边丢弃 (一般用的是算数右移)
注意:不能移动负数位
对于二进制,一个数左移一位,这个数变为原来的2倍,左移2位,变为原来的4倍,以此类推,左移n位,扩大2^n倍;
右移一位,此数变为原来的1/2倍,右移n位,变为原来1/2^n.
-1右移还是-1
3.位操作符
&(按位与) \ (按位或 ) ^(按位异或)
&:全1为1,二者有一个为0则为0
\ : 有一个为1则为1,二者全为0则
^:相同为1,不同为0
注意:a^b^a=b
4.赋值操作符
=
5.复合赋值符
+= -= *= /= %= >>= <<= &= |= =
a+=2,相当于a=a+2; a-=2,相当于a=a-2;后面几个操作符的用法相同
6.单目操作符
!(逻辑反,返回值是1或0) -(负值) +(正值) & (取地址) sizeof(操作数类型的长度)
~(对二进制数按位去反) --(前置、后置--) ++
(前置、后置++)
*(间接访问操作符) (类型)(强制类型转换) 数组取地址的相关问题:
printf("%p",&arr); //数组的地址
printf("%p",&arr[0]);//数组首元素的地址
printf("%p",arr);//数组首元素的地址
关
于sizeof的问题:
(1)sizeof(数组名)------数组名表示整个数组
此时 sizeof(数组名) 求取的是整个数组的大小,单位是字节
(2)&数组名--------数组名也表示整个数组
此时 &数组名 求取的是整个数组的地址
(3)除此之外,所有遇到的数组名都是首元素的地址
int a;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(int));//这两种是一样的
printf("%d\n",sizeof a);//这样是可以的,因为sizeof不是函数
printf("%d\n",sizeof int);//这样不可以
sizeof( )里的表达式是不参与运算的,比如
int a=3,s=5;
printf("%d\n",sizeof(s=a+4));//输出4
printf("%d\n",a);//输出3
printf("%d\n",s);//输出5,上面那个sizeof括号里的表达式不参与运算
对于++和--:
后置++:先使用原来的值,后自增 后置--:先使用原来的值,后自减 前置++:先自增,后使用 前置--:先自减,后使用
int i=1;
int ret=(++i)+(++i)+(++i);//不同编译器下的结果不同
7.关系操作符
> >= <= != ==
8.逻辑操作符 && ||
&&的时候,前面为假,后面不做判断 || 的时候,前面为真,后面不做判断
9.条件操作符 exp 1 ? exp2 : exp3
exp 1如果成立,则执行exp 2,否则执行exp 3
10.逗号表达式 exp 1,exp 2,exp 3,exp 4 ........ exp N
从左向右依次执行,整个表达式的结果是最后一个表达式的结果
11.下标引用、函数调用和结构成员
1. [ ] 引用数组中的元素时用,比如:a[1], a[2].........
2. ( ) 函数调用操作符 比如: test1();
3. 访问结构的成员
#include<stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
}
int main()
{
struct Stu stu;
struct Stu* pStu=&stu;;
stu.age=20;
strcpy(s.name,"张三");//访问结构体成员,结构体的名字访问时,后面是点.
pStu->age=20;
strcpy(pStu->name,"张三");//结构体的指针访问时,后面是->
return 0;
}
11.表达式求值
有些表达式的操作数在求值得过程中可能需要转换为其它类型
char a,b,c;
...
a=b+c;//b和c相加时被转化为整形,这种方法称为“整形提升”,加完后的结果被截断,存在a里
//整形提升,补的是符号位
float f = 3.14;
int num = f;//隐士转换,会有精度丢失