目录
1. 算术操作符:+ 、-、*、/、%
👀算术操作符中 +、 -、 * 、/ 都是比较熟悉的,主要是 %(取模) 对少部分人来说不太熟悉 。% 得和 / 一起理解, / 计算的是两个数相除之后的商,而 % 计算的则是两数相除之后的余数
例子:
int main(){
int a= 8;
int b= 2;
printf("%d\n",a/b); 4 // 8 / 2 = 4
printf("%d\n",a%b); 0 // 8 % 2 = 4....0
return 0;
}
/ 和 %应用
- 水仙花数
int is_flower_number(int i) {
int temp = i;
int count = 1;
int sum = 0;
//判断该数有几位
while (temp / 10) {
count++;
temp /= 10;
}
temp = i;
//判断是否符合水仙花树的条件
while (temp) {
sum += pow(temp % 10, count);
temp /= 10;
}
return sum == i;
}
int main() {
int i = 0;
//生成0~100000之间的数
for (i = 0; i <= 100000; i++) {
//判断该数是否为水仙花数
if (is_flower_number(i)) {
printf("%d ", i);
}
}
return 0;
}
- 将一个正整数的每一位按顺序或者逆序打印
//顺序打印
void Print2(int n) {
if (n > 9)
Print(n / 10);
printf("%d ", n % 10);
}
//逆序打印
void Print1(int n) {
printf("%d ", n % 10);
if (n > 9)
Print(n / 10);
}
int main(){
int n=0;
scanf("%d",&n);
Print2(n);
Print1(n);
return 0;
}
3. 移位操作符
>>: 右移操作符
<<: 左移操作符
注:移位操作符的操作数只能是正整数,对于负数则是标准未定义!
移位规则:
- 左移操作符
- 左边抛弃、右边补0
例子
//代码实现
#include <stdio.h>
int main()
{
int num = 10;
int n = num<<1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
运行结果
分析:
- 右移操作符
- 逻辑左移:左边用0填充,右边丢弃
- 算术右移:左边用符号位补充,右边丢弃
//代码实现
#include <stdio.h>
int main(){
int num = -1;
int n = num>>1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
运行结果
分析
警告⚠️:对于移位运算符,不要移动负数位,这个是标准未定义的。
4. 位操作符
- &(按位与):二进制对应位两个都为1则为1,否则为0。
- | (按位或):二进制对应位两个都为0则为0,否则为1。
- ^(按位异或):二进制对应位相同则为0,不同则为1。
- ~(按位取反):二进制位对应的0变1,1变0。
注:他们的操作数必须是整数
//代码实现
#include <stdio.h>
int main(){
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 & num2);
printf("%d\n", num1 | num2);
printf("%d\n", num1 ^ num2);
printf("%d\n", ~0);
return 0;
}
运行结果
5. 赋值操作符
=、+=、-=、/=、*=、%=、>>=、<<=
a += b ---> a = a + b
a -= b ---> a = a - b
a /= b ---> a = a / b
a *= b ---> a = a * b
a %= b ---> a = a % b
a >>= b ---> a = a >> b
a <<= b ---> a = a << b
6. 单目操作符
!、++、--、&、*、+、-、~ 、sizeof、(类型)
单⽬操作符的特点是只有⼀个操作数
符号 | ! | ++ | – | * | + | - | ~ | sizeof | (类型) |
---|---|---|---|---|---|---|---|---|---|
含义 | 逻辑取反 | 前置、后置++ | 前置、后置– | 间接访问操作符(解引用操作符) | 正值 | 负值 | 二进制位取反 | 操作数的类型长度(以字节为单位) | 强制类型转换 |
7. 关系操作符
>、 <、 >=、 <=、 ==、 !=
8. 逻辑操作符
- &&(逻辑与/短路与):两边为真即为真,否则为假。
- ||(逻辑或/短路或): 两边为假才为假,否则为真。
9. 条件操作符
exp1 ? exp2 : exp3
若exp1为真则执行exp2,否则执行exp2
//代码实现
int main(){
int a = 3;
int b = 5;
int c = (a > b) ? a : b;
printf("%d\n", c);
}
运行结果
10. 逗号表达式
1 exp1, exp2, exp3, …expN
逗号表达式,就是⽤逗号隔开的多个表达式,,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
例子:
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1); //13
11. 下标访问操作符[ ]、函数调用操作符( )
- 下标访问操作符[ ]
操作数:⼀个数组名 + ⼀个索引值
- 函数调用操作符( )
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
12. 结构成员访问操作符
C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类
型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要
名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问
题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。
- 结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数
使用方式:结构体变量.成员名
- 结构体成员的间接访问
有时候我们得到的不是⼀个结构体变量,⽽是得到了⼀个指向结构体的指针。
使⽤⽅式:结构体指针->成员名