个人博客网址:https://ljsblog.com
运算符(五)
分类
- 算术操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 其他操作符
算术操作符
+ - * / %
这几个操作符都是最基本的操作符,不做过多介绍,但要注意%只能用于整型。
移位操作符
>>(右移操作符) <<(左移操作符)
移位操作符移动的是二进制位
右移操作符
- 算术右移:需要考虑符号位,右边丢弃,左边补原符号位
- 逻辑右移,不需要考虑符号位,右边丢弃,左边补0
例如:
#include <stdio.h>
int main()
{
int a=16;
//a
//00000000000000000000000000010000
//a>>1
//00000000000000000000000000001000
printf("%d\n",a>>1);//打印结果为8
return 0;
}
左移操作符
左边丢弃。右边补0
例如:
#include <stdio.h>
int main()
{
int a=6;
//a
//00000000000000000000000000000110
//a<<1
//00000000000000000000000000001100
printf("%d\n",a<<1);//12
return 0;
}
注意:
- 移位运算符的操作数必须是整数
- 不要移动负数位
位操作符
&(按位与) |(按位或) ^(按位异或)
位操作符的操作数必须是整数
例:
//&按二进制位与
#include <stdio.h>
int main()
{
int a=4;
int b=6;
int c=a&b;
//00000000000000000000000000000100
//00000000000000000000000000000110
//00000000000000000000000000000100
printf("%d\n",c);//4
return 0;
}
//|按二进制位或
#include <stdio.h>
int main()
{
int a=4;
int b=6;
int c=a|b;
//00000000000000000000000000000100
//00000000000000000000000000000110
//00000000000000000000000000000110
printf("%d\n",c);//6
return 0;
}
//^按二进制位异或
//相同为0,不同为1
#include <stdio.h>
int main()
{
int a=4;
int b=6;
int c=a^b;
//00000000000000000000000000000100
//00000000000000000000000000000110
//00000000000000000000000000000010
printf("%d\n",c);//2
return 0;
}
//交换两个int变量,不能使用第三个变量
#include <stdio.h>
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
a=a^b;
b=a^b;
a=a^b;
printf("a=%d,b=%d\n",a,b);
return 0;
}
/*
36 96
a=96,b=36
*/
赋值操作符
=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=
例如:
int a=10;
a+=2;//相当于a=a+2
a>>=1;//相当于a=a>>1
a&=1;//相当于a=a&1
单目操作符
只有一个操作数
! //逻辑反操作
- //负值
+ //正值
& //取地址
sizeof //操作数的类型长度,以字节为单位
~ //对一个数的二进制按位取反
-- //前置、后置--
++ //前置、后置++
* //间接访问操作符,解引用操作符
(类型) //强制类型转换
注:
- &是取地址符,%p打印地址
- ++,–的前置和后置
- 数据在内存以补码形式存储,打印出来的是原码
例子:
//&,*p
#include <stdio.h>
int main()
{
int a=0;
int *p=&a;
printf("%p\n",p);//打印a的地址
return 0;
}
//前置后置
#include <stdio.h>
int main()
{
int a=10,b=10;
printf("%d\n",a++);//打印结果为10
printf("%d\n",++a);//打印结果为12
printf("%d\n",b--);//打印结果为10
printf("%d\n",--b);//打印结果为8
}
//取反
#include <stdio.h>
int main()
{
int a=0;
//00000000000000000000000000000000
//按位取反后
//11111111111111111111111111111111 -补码
//11111111111111111111111111111110 -反码
//10000000000000000000000000000001 -原码 -1
printf("%d\n",~a);//打印结果为-1
return 0;
}
关系操作符
这几个操作都是最基本的操作符,不多做介绍,但要注意别把=和==混淆。
== >= <= < >
逻辑操作符
&&(逻辑与) ||(逻辑或)
注意区分逻辑与和按位与,逻辑或和按位或
1&2—>0 1&&2—>1
1|2—>3 1||2—>1
逻辑与若是左边为假,则结果直接为假,右边不会再算
逻辑或若是左边为真,则结果直接为真,右边不会再算
例子:
//逻辑与
#include <stdio.h>
int main()
{
int a=0,b=1,c=2,i;
i= a++ && ++b && ++c;
printf("a=%d,b=%d,c=%d\n",a,b,c);//结果为a=1,b=1,c=2
return 0;
}
//逻辑或
#include <stdio.h>
int main()
{
int a=1,b=2,c=3,i;
i= a++ || ++b || ++c;
printf("a=%d,b=%d,c=%d\n",a,b,c);//结果为a=2,b=2,c=3
return 0;
}
条件操作符
格式:表达式1?表达式2:表达式3
表达式1为真,则执行表达式2,表达式1为假,则执行表达式3
例:
#include <stdio.h>
int main()
{
int a=3,b=0;
b=a>5?-3:3;
/*
b=a>5?-3:3;
等同于
if(a>5)
{
b=-3;
}
else
{
b=3;
}
*/
printf("b=%d\n",b);//结果为3
return 0;
}
逗号表达式
格式:表达式1,表达式2,表达式3,…表达式n
逗号表达式,就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
例:
int a=1;
int b=2;
int c=(a>b,a=b+8,a,b=a+3);
printf("c=%d\n",c);//c=13
其他操作符
[]下标引用操作符
操作数:一个数组名+一个索引值
例:
int arr[10];//创建数组
arr[9]=10;//实用下标引用操作符
//两个操作数是arr和9
()函数调用操作符
操作数:接受一个或者多个操作数,第一个操作数是函数名,其余操作数为传递给函数的参数。
例:
#include <stdio.h>
int max(int x,int y)
{
return (x>y?x:y);
}
int main()
{
int a=0;
//调用函数时的()就是函数调用操作符
a=max(10,20);
printf("%d",a);//20
return 0;
}
访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
例:
//结构体.成员名
#include <stdio.h>
//创建一个结构体类型 struct Stu
struct Stu
{
char name[20];
int age;
char id[15];
};
int main()
{
//使用struct Stu这个类型创建一个结构体变量s1并初始化
struct Stu s1={"张三",21,"6666666"};
printf("%s\n",s1.name);
printf("%d\n",s1.age);
printf("%s\n",s1.id);
return 0;
}
/*打印结果
张三
21
6666666
*/
//结构体指针->成员名
#include <stdio.h>
//创建一个结构体类型 struct Stu
struct Stu
{
char name[20];
int age;
char id[15];
};
int main()
{
struct Stu s1={"张三",21,"6666666"};
struct Stu* p=&s1;
printf("%s\n",p->name);
printf("%d\n",p->age);
printf("%s\n",p->id);
return 0;
}
/*打印结果
张三
21
6666666
*/