运算符(五)


运算符(五)

分类

  • 算术操作符
  • 移位操作符
  • 位操作符
  • 赋值操作符
  • 单目操作符
  • 关系操作符
  • 逻辑操作符
  • 条件操作符
  • 逗号表达式
  • 其他操作符

算术操作符

+ - * / %
这几个操作符都是最基本的操作符,不做过多介绍,但要注意%只能用于整型。

移位操作符

>>(右移操作符) <<(左移操作符)
移位操作符移动的是二进制位

右移操作符

  1. 算术右移:需要考虑符号位,右边丢弃,左边补原符号位
  2. 逻辑右移,不需要考虑符号位,右边丢弃,左边补0

例如

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int a=16;
//a
//00000000000000000000000000010000
//a>>1
//00000000000000000000000000001000
printf("%d\n",a>>1);//打印结果为8
return 0;
}

左移操作符

左边丢弃。右边补0
例如

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main()
{
int a=6;
//a
//00000000000000000000000000000110
//a<<1
//00000000000000000000000000001100
printf("%d\n",a<<1);//12
return 0;
}

注意

  1. 移位运算符的操作数必须是整数
  2. 不要移动负数位

位操作符

&(按位与) |(按位或) ^(按位异或)
位操作符的操作数必须是整数
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
//&按二进制位与
#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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
//|按二进制位或
#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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//^按二进制位异或
//相同为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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//交换两个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
*/

赋值操作符

=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=
例如:

1
2
3
4
int a=10;
a+=2;//相当于a=a+2
a>>=1;//相当于a=a>>1
a&=1;//相当于a=a&1

单目操作符

只有一个操作数

1
2
3
4
5
6
7
8
9
10
!       //逻辑反操作  
- //负值
+ //正值
& //取地址
sizeof //操作数的类型长度,以字节为单位
~ //对一个数的二进制按位取反
-- //前置、后置--
++ //前置、后置++
* //间接访问操作符,解引用操作符
(类型) //强制类型转换

注:

  • &是取地址符,%p打印地址
  • ++,–的前置和后置
  • 数据在内存以补码形式存储,打印出来的是原码

例子:

1
2
3
4
5
6
7
8
9
//&,*p
#include <stdio.h>
int main()
{
int a=0;
int *p=&a;
printf("%p\n",p);//打印a的地址
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
//前置后置
#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
}

1
2
3
4
5
6
7
8
9
10
11
12
13
//取反
#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

逻辑与若是左边为假,则结果直接为假,右边不会再算
逻辑或若是左边为真,则结果直接为真,右边不会再算
例子:

1
2
3
4
5
6
7
8
9
//逻辑与
#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;
}
1
2
3
4
5
6
7
8
9
//逻辑或
#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
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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
逗号表达式,就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
例:

1
2
3
4
int a=1;
int b=2;
int c=(a>b,a=b+8,a,b=a+3);
printf("c=%d\n",c);//c=13

其他操作符

[]下标引用操作符

操作数:一个数组名+一个索引值
例:

1
2
3
int arr[10];//创建数组
arr[9]=10;//实用下标引用操作符
//两个操作数是arr和9

()函数调用操作符

操作数:接受一个或者多个操作数,第一个操作数是函数名,其余操作数为传递给函数的参数。
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#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;
}

访问一个结构的成员

1
2
.     结构体.成员名  
-> 结构体指针->成员名

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//结构体.成员名
#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
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//结构体指针->成员名
#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
*/

Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC