目录
1.操作符种类
1.1 算术操作符
1.2 移位操作符
1.3 位操作符
1.4 赋值操作符
1.5 单目操作符
1.6 关系操作符
1.7 逻辑操作符
1.8 条件操作符
1.9 逗号表达式
1.10 下标引用
1.11 函数调用
1.12 访问结构成员
1.操作符种类
1.1
算术操作符
+ | - | * | / | % |
---|---|---|---|---|
加 | 减 | 乘 | 除 | 取余 |
温馨提醒:
① 除去 " % " 操作符 之外的 其他操作符 均可用于 整数 和 浮点数 的运算。
② " / " 操作符 的 两个操作数 都为 整数 ,执行 整数除法 。而只要有 浮点数 执行的就是 浮点数除 法。
③ " % " 操作符 的 两个操作数 必须为整数,返回的 值 是整除之后的 余数 。
例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define two 2
#define five 5
int main()
{
printf("add = %d\n", five + two);// 5 + 2 =7
printf("sum = %d\n", five - two);// 5 - 2 =3
printf("mul = %d\n", five * two);// 5 × 2 =10
printf("div = %d\n", five / two);// 5 ÷ 2 = 2余1
printf("rem = %d\n", five % two);// 5 ÷ 2 余 1,所以为1
return 0;
}
输出结果:
1.2
移位操作符
<< | >> |
---|---|
左移操作符 | 右移操作符 |
温馨提醒:
① 左移操作符 移位规则:左边 抛弃 、右边 补0。
例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
unsigned int num = 0x80000001;// 二进制:1000 0000 0000 0000 0000 0000 0000 0001
int change = 0;
printf("%d\n", sizeof(int));// int型占用4个字节
printf("%x\n", num);// 二进制:1000 0000 0000 0000 0000 0000 0000 0001
printf("%x\n", num << 1);// 二进制(左移一位):0000 0000 0000 0000 0000 0000 0000 0010
return 0;
}
输出结果:
② 右移操作符 移位规则:
逻辑移位 左边用 0 填充,右边 抛弃。
算术移位 左边用原该值的 符号位 填充,右边 抛弃。
逻辑移位:
1111 1111 1111 1111 1111 1111 1111 1111 |
---|
下面是向右位移一位的结果 |
0111 1111 1111 1111 1111 1111 1111 1111 |
算术移位:
假设以下为 -1 的补码 |
---|
“1”(符号位)111 1111 1111 1111 1111 1111 1111 1111(该位丢弃) |
下面是向右位移一位的结果 |
“1”(用原该值的符号位填充)111 1111 1111 1111 1111 1111 1111 1111 |
温馨提醒:移位运算符不要移动负数位!例:
int num = 10;
num >> -1;// 这种用法错误
1.3
位操作符
& | >> | >> |
---|---|---|
按位与 | 按位或 | 按位异或 |
“有0则0” | “有1则1” | “相同0相异1” |
温馨提醒:他们的操作数必须是整数!例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num1 = 2;// 0010
int num2 = 4;// 0100
printf("%d\n", num1 & num2);// 0010 & 0100 = 0000
printf("%d\n", num1 | num2);// 0010 & 0100 = 0110
printf("%d\n", num1 ^ num2);// 0010 & 0100 = 0110
return 0;
}
输出结果:
1.4
赋值操作符
+= | -= | *= | /= | %= | >>= | <<= | &= | |= | ^= |
---|
例:
int weight = 120;// 体重
weight = 89;// 重新赋值
double salary = 10000.0;// 浮点型
salary = 20000.0;// 使用赋值操作符赋值
1.5
单目操作符
! | - | + | & | ~ | - - | ++ | * | (类型) |
---|---|---|---|---|---|---|---|---|
逻辑反操作 | 负值 | 正值 | 取地址 | 对一个数的二进制按位取反 | 前置、后置- - | 前置、后置++ | 间接访问操作符(解引用操作符) | 强制类型转换 |
1.6
关系操作符
> | >= | < | <= | != | == |
---|---|---|---|---|---|
大于 | 大于等于 | 小于 | 小于等于 | 测试“不等” | 测试“相等” |
" == " 和 " = "不一样!前者是判断是否相等,后者是赋值
1.7
逻辑操作符
① && 逻辑与,都为正结果为真
② || 逻辑或,都为假结果为假
1 & 2----->0
1 && 2---->1
1 | 2----->3
1 || 2---->1
1.8
条件操作符
exp1 ? exp2 : exp3 |
---|
例:
if (a > 5)
b = 3;
else
b = -3;
// 相当于以下:
b = (a > 5 ? 3 :-3);
1.9
逗号表达式
exp1, exp2, exp3, …expN |
---|
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果,例:
// 代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);// 逗号表达式
// c是多少?c = 13
// 代码2
if (a =b + 1, c=a / 2, d > 0)
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
// 业务处理
a = get_val();
count_val(a);
}
// 如果使用逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
// 业务处理
}
1.10
下标引用
[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
例:
int arr[10];// 创建数组
arr[9] = 10;// 实用下标引用操作符。
// []的两个操作数是arr和9。
1.11
函数调用
( ) 函数调用操作
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
例:
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); // 实用()作为函数调用操作符。
test2("hello bit.");// 实用()作为函数调用操作符。
return 0;
}
1.12
访问结构成员
. 结构体.成员名
-> 结构体指针->成员名
例:
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;
};
void set_age1(struct Stu stu)
{
stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//结构成员访问
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//结构成员访问
stu.age = 20;//结构成员访问
set_age1(stu);
pStu->age = 20;//结构成员访问
set_age2(pStu);
return 0;
}