C语言的操作符分为:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号操作符、下标引用,函数调用和结构成员。
一、算术操作符
+ - * / %
1.除了%,其他均可以作用于整数和浮点数
2./:两个都是整数,整数除法,有浮点数就是浮点数除法
3.%要求两个操作数都是整数,返回整除后的余数
二、移位操作符(以二进制位)
1.<<左移操作符:左边抛弃、右边补零
2.>>右移操作符:分为两种 算术右移,右边抛弃,左边补原符号位(正数符号位是0,负数符号位是1)一般是算术右移。
逻辑右移,右边抛弃,左边补零
使用:
int a=6;
int b=a<<1;
整数的二进制表示有原码、反码和补码,计算机以补码形式储存到内存。
正数原反补相同,用原码表示一个负数,符号位不变,其他位按位取反得到反码,反码+1得到补码(原码得到补码的快捷方法:从右到左,遇到的0不变,第一个1不变,这个1左边的所有位按位取反,但符号位不变)
⚠:对于移位运算符,不要移动负数位,是标准未定义的如
Num=10,num>>-1//error
三、位操作符(按二进制位)
& 按位与 | 按位或 ^按位异或
&有0则0,都1则1,负数用补码表示
int a=2;
int b=3;
int c=a&b;
| 有1则1,全0则0
^相同为0,相异为1
它们的操作数都是整数
//例题:不创建临时变量实现两个数交换。
#include<stdio.h>
int main(){
int a=10;
int b=20;
a=a^b;
b=a^b;
a=a^b;
printf("a=%d b=%d\n",a,b);
return 0;
}
//法二:加减法
a=a+b;
b=a-b;
a=a-b;
//缺点:a+b可能会溢出
//求一个整数存储在内存中的二进制中1的个数
#include<stdio.h>
int main(){
//法一
int num=10;
int count=0;//计数
while(num){
if(num%2==1)
count++;
num=num/2;
}
}
return 0;
//法二
int num=0;
int count=0;
scanf("%d",&num);
int i=0;
for(i=0;i<32;i++){
if(i==((num>>i)&1))
count ++;
}
}
四、赋值操作符=
可以在一条语句中连续赋值(不建议)
五、复合操作符
+= -= *= /= %= >>= <<= &= |= ^=
六、单目操作符
!逻辑反操作 -负值 +正值 &取地址 sizeof操作数类型长度(以字节为单位) ~对一个数的二进制按位取反 --前置后置-- ++前置后置++ *间接访问操作符(解引用操作符) ()强制类型转换
int a=10;
int* p=&a;
*p=20;//指针
sizeof(a)==sizeof(int)//变量的()可以省略,类型的 ()不能省略
sizeof(p)==sizeof(int*)
int arr[10]={0};
sizeof(arr)==sizeof(int [10])
int a=10;
short s=0;
sizeof(s=a+5)//2
最后s值不变,还是0,sizeof()里的式子不参与运算。
int a=0;//0是整数
//00000000000000000000000000000000
//11111111111111111111111111111111补码
//11111111111111111111111111111110反码
//10000000000000000000000000000001原码
//输出原码-1
printf("%d\n",~a);
++a,先++,后使用,a++,先使用,后++,--同理
七、关系操作符
> >= < <= != ==(不要写成=)
八、逻辑操作符
&&逻辑与全真为真,有假为假 ||逻辑或有真为真,全假为假
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b&&d++//a++是0,为假,右边就不再算了
//a=1,b=2,c=3,d=4
//若改a=1,结果为1335
//若该为||,结果为2234,a++为真,后面就不算了
九、条件操作符
exp1 ? exp2:exp3
如果exp1为真,表达式的结果为exp2的结果;如果exp1为假,表达式的结果为exp3的结果。
功能等同于if-else。
十、逗号操作符
用逗号隔开多个表达式,从左向右执行,前一个表达式会对后面的表达式产生影响,整个表达式的结果是最后一个表达式的结果(不能只算最后一个结果,最后的结果是整个表达式共同完成的)。
十一、下标引用、函数调用和结构成员
1.[]下标引用操作符 操作数:一个数组名+一个下标值
int arr[10];
arr[9]=10;//[]的两个操作数是arr和9
2.()函数调用操作符 一个或多个操作数:第一个操作数是函数名,剩余的操作数是传递给函数的参数。
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
struct Stu
{
char name[20];
int age;
char id[20];
};
int main(){
int a=10;
struct Stu s1={"张三",20,"123456789"};
printf("%s\n",s1.name);
printf("%d\n",s1.age);
printf("%s\n",s1.id);
return 0;
}
struct Stu
{
char name[20];
int age;
char id[20];
};
int main(){
int a=10;
struct Stu s1={"张三",20,"123456789"};
struct Stu* ps=&s1;
printf("%s\n",(*ps).name);//ps->name
printf("%d\n",(*ps).age);//ps->age
补充:注释 //注释该行
/* */中间注释掉,可以多行,visual studio中有快捷键
增加可读性,删除不需要的代码
标签:10,int,C语言,++,num,操作符,sizeof From: https://blog.51cto.com/u_15901728/5927827