前言:
本章是着重介绍C语言里面的操作符,告诉大家各种操作符的介绍。
1.操作符的分类:
- 算数操作符
- 移位操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗哈表达式
- 下标引用,函数调用和结构成员
2.算数操作符
+ - *
加减乘操作符和数学里面的规则是一样的
/
除号操作符和数学里面不太一样
对于除号操作符来说,两边的操作数都是整数,它执行的是整数除法
如果想计算出小数,除号两端至少有一个操作数是浮点数。
% 取模(取余)
% 计算的是整除之后的余数
注:取模操作符两边的操作数只能是整数
3.移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符移的是二进制位,并且操作符的操作数只能是整数。
首先我们要理解原码,反码,补码。
按照一个数的正负,直接写出他的二进制表示形式得到的就是他的原码,第一个数字我们称它是符号位,当是正数时,符号位为0,当是负数时,符号位为1.
正数的原码反码补码是相同的
负数的原码反码补码是要经过计算
反码就是原码符号位不变,其他按位取反
补码就是反码+1
3.1 左移操作符 <<
移位规则:
左边抛弃,右边补0。
3.2 右移操作符
移位规则:
首先右移运算分为两种:
1.逻辑移位
左边用0填充,右边丢弃
2.算数移位
左边的用该值的符号位填充,右边丢弃
警告⚠ : 对于移位运算符,不要移动负数位,这个是标准未定义的。 例如:
int num = 10;
num>>-1;
4. 位操作符
& 按位与
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("%d", c);
return 0;
}
按位与的计算规则是先计算出两个数的补码再进行比较,对应的两个二进制位有0就为0,两个同时为1才为1。
| 按位或
按位或的计算规则是先计算出两个数的补码再进行比较,对应的两个二进制位有1就为1,两个同时为0才为0。
^ 按位异或
按位异或的计算规则是先计算出两个数的补码再进行比较,对应的两个二进制位相同为0,相异为1.
注:他们的操作数必须是整数。
5.赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
int weight = 120;//体重
weight = 89;//不满意就赋值
double salary = 10000.0;
salary = 20000.0;//使用赋值操作符赋值。
赋值操作符可以连续使用,比如:
int a = 10; int x = 0;
int y = 20;
a = x = y+1;//连续赋值
也可以拆成这样
x = y+1;
a = x;
复合赋值符
- +=
- -=
- *=
- /=
- %=
- >>=
- <<=
- &=
- |=
- ^=
这些运算符都可以写成复合的效果。 比如:
int x = 10;
x = x+10;
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。
6.弹幕操作符
6.1 单目操作符介绍
! 逻辑反操作
在C语言中0表示假,非0表示真。
! 可以让真变成假,让假变成真
- 负值
可以让正数变成负数,负数变成正数
+ 正值
几乎不用,都是省略掉的
& 取地址
取出一个对象他在内存里面的地址
sizeof 操作数的类型长度(以字节为单位)
是来计算大小,单位是字节
注:sizeof内部的表达式是不计算的
~ 对一个数的二进制按位取反
注:按位取反也只针对整数
* 间接访问操作符(解引用操作符)
通过地址访问指定的元素
-- 前置、后置--
++ 前置、后置++
后置++。先使用再++
前置++,先++再使用
(类型) 强制类型转换
7. 关系操作符
关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
注意:一个=叫赋值,两个==用于测试相等
8. 逻辑操作符
&& 逻辑与 在我们生活中就是并且的意思
|| 逻辑或 在我们生活中就是或者的意思
它们只关注真假
9. 条件操作符
exp1 ? exp2 : exp3
10. 逗号表达式
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
11. 下标引用、函数调用和结构成员
1. [ ] 下标引用操作符 操作数:一个数组名 + 一个索引值
int arr[10];
//创建数组 arr[9] = 10;
//实用下标引用操作符。 [ ]的两个操作数是arr和9。
2. ( ) 函数调用操作符 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
#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;
}
3. 访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;