文章目录
操作符
一、算术操作符
+ - * / %
- 除了 % 操作符之外,其他操作符都可用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法;而只要有浮点数,就执行浮点数除法。
- % 操作符两个操作数必为整数。
二、移位操作符
<< 左移操作符
>> 右移操作符
int a = 1;
int b = a << 1; // 把a的二进制位向左移动一位。
// 左移:左边丢弃,右边补0.
int b = a >> 1; // 把a的二进制位向右移动一位。
// 右移:
// 1.算术右移(通常):右边丢弃,左边补原符号位.
// 2.逻辑右移:右边丢弃,左边补0.
int 类型有 4 个字节,占 32 个 bite 位。
a ----00000000000000000000000000000001
对于移位运算符,不能移动负数位 :num >> -1
·
正整数的原码,反码,补码完全相同。
三、位操作符
& //按位与
| //按位或
^ //按位异或
操作数必须是整数。
按二进制计算
int a = 3;
int b = 5;
printf("%d", a&b );
//按位与,相同为1,不同为0.
//00000000000000000000000000000011
//00000000000000000000000000000101
//00000000000000000000000000000001
a & b = 1;
printf("%d", a|b );
//按位或,都为0则0,否则为1。
//00000000000000000000000000000011
//00000000000000000000000000000101
//00000000000000000000000000000111
a | b = 7;
printf("%d", a^b );
//按位异或,相同为0,不同为1.
//00000000000000000000000000000011
//00000000000000000000000000000101
//00000000000000000000000000000110
a ^ b = 6;
练习:交换两个int变量的值,不使用第三个变量,即a=3,b=5; 交换后,a=5,b=3.
方法一:
int a=3;
int b=5;
a = a + b;
b = a - b;
a = a - b;
//数值太大时会溢出。
方法二:
int a=3;
int b=5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
0 ^ a = a;
a ^ a = 0;
四、赋值操作符
+= -= *= /= %= >>= <<= &= |= ^=
=
五、单目操作符
! 逻辑取反
- 负值
+ 正值
& 取地址
sizeof()操作数类型长度(字节为单位)
~ 对一个数的二进制按位取反
-- 自减
++ 自增
* 间接访问操作符
(int) 强制类型转换
sizeof() 括号中的表达式并不参加运算。
int a = 10;
int * pa = &a; // & -- 取地址操作符
// pa用来存放地址,pa就是一个指针变量
*pa = 20; // * 是解引用操作符,*pa就是a。
六、关系操作符
>
>=
<
<=
!=
==
七、逻辑操作符
&& 逻辑与
|| 逻辑或
例题:
//这串代码输出的结果为?
#include<stdio.h>
int main()
{
int i = 0,a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("c = %d\n",c);
printf("d = %d\n",d);
return 0;
}
i = a++ && b++;
//如果前面的 a++ 判断为假, 则后面的 b++ 不会再运算。
i = a++ || b++;
//如果前面为真,则后面不会执行运算,
八、条件操作符
表达式1 ? 表达式2 : 表达式3
//如果表达式1为真,则表达式2计算,表达式3不计算。
//如果表达式1为假,则表达式3计算,表达式2不计算。
九、逗号表达式
exp1, exp2, exp3, ...expn
int a = (a>b, a=10, a=b+10, a=29)
//逗号表达式,就是用逗号隔开的多个表达式,从左到右依次运算,整个表达式的结果就是最后一个表达式的结果。
十、下标引用、函数调用和结构成员
1. [] 下标引用操作符
int arr[10]; // 创建数组
arr[9] = 10; // 使用下标引用操作符
2. () 函数调用操作符
//函数定义
int Add(int a,int b)
{
return a+b;
}
int main()
{
int a=10,b=20;
//函数调用
int ret = Add(a,b); // () 为函数调用操作符
}
3. 访问结构成员
结构体是自定义类型。
. : 结构体 . 成员名
-> : 结构体指针 -> 成员名
// struct 定义一个自定义类型
// 书:书名,书号,定价。
struct Book
{
//成员变量
char name[20];
char id[20];
int price;
};
int main()
{
struct Book b = {"c语言","20211130",55}; //b 为一个结构体。
//结构体 . 成员名
printf("%s",b.name);
printf("%s",b.id);
printf("%d",b.price);
return 0;
}
//22222222222222222222222
struct Book * pb = &b;
printf("%s",*pb.name);
printf("%s",*pb.id);
printf("%d",*pb.price);
//33333333333333333333333
//结构体指针 -> 成员名
struct Book * pb = &b;
printf("%s",pb->name);
printf("%s",pb->id);
printf("%d",pb->price);