《C语言操作符总结》
1.算数操作符( + - * / %)
(1)加减不用说啦,其实在“-”执行的也是“+”
(2) “%”的两个操作数必须是整数,返回的是整除之后的余数
(3)“/”的两个操作数只要有一个是浮点数,则执行的就是浮点数除法
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
注意:aba=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;