书摘文案:”希望你能一直拥有温柔,感受风的软,海的凉,清澈的梦想。“
目录标题
这里我们来了解C语言中各种操作符
算术操作符,移位操作符
位操作符,赋值操作符
单目操作符,关系操作符
逻辑操作符,条件操作符
逗号表达式,
下标引用、函数调用和结构成员
1.算术操作符
一元操作符(操作符两侧只有一个操作数)
二元操作符(操作符两侧有两个操作数)
操作符 | 含义 |
---|---|
+ | 用于加法运算,使其两侧的值相加。 |
- | 用于减法运算,使其两侧的值相减。 |
* | 用于乘法运算,使其两侧的值相乘。 |
/ | 用于除法运算,使其两侧的值相除。 |
% | 用于取模运算,结果为余数 |
重点来讲解一下 / 和 % 两个操作符。
1. / 操作符: 左右两侧的操作数若都为正数时,结果也为正数,左右两侧的操作数只要有一个是浮点数时,结果为浮点数。
例如3/2=1,两边都为正数,将小数点后的位数舍去,不会进行四舍五入结果。,
例如3.0/2=1.5,两边有一个浮点数,结果为浮点数。(实际上计算机并不能计算浮点数除以整数,编译器会将两个操作符转化成相同类型。
2.%操作符: 这个操作符用于整数运算, 结果是两个操作数相除得到的余数。
2.移位操作符
数据在内存中的存储
在认识移位操作符之前我们先简单的认识一下,数据在内存中怎么存储的。
任何数据在计算机中,都必须被转化成为二进制(计算机只认识二进制)
二进制的表示类型:
二进制中最高位为符号位,后面的位数是表示真正数值。
二进制的表示形式
原码,反码,补码。
运算规则:
原码 = 一个数转换直接转化成二进制。
反码 = 原码的符号位不变,其他位按位取反。
补码 = 反码的二进制位加1.
整数:原码=反码=补码
举个栗子:
正数1(4字节32位):
原码:00000000000000000000000000000001
反码:00000000000000000000000000000001
补码:00000000000000000000000000000001
负数1:
原码:00000000000000000000000000000001
反码: 0111111111111111111111111111111111110
补码: 0111111111111111111111111111111111111
而在计算机中我们真正存储的是补码.
真正认识
简单了解数据在计算机中的存储后,我们就会对移位操作符有着更深的了解.
既然是移位操作符,我们移动的就是数据的二进制中的位.,(对于编程可以提高效率)
注意:移位操作符只能用于整数
负数及浮点数不被标准所定义.
左移操作符<<
移动规则:左边抛弃、右边补0
举个栗子:
int num=10;
num=num<<1;
右移操作符>>
移动规则:
1.逻辑移位:左边用0填充,右边丢弃
2. 算术移位:左边用原该值的符号位填充,右边丢弃
两个移动规则取决于编译器.
举个栗子:
int num=-1;
num=num>>1;
注意:移位操作符不可以移动负位数以及移动很大的位数,这是一种标准未定义行为。.
3.位操作符
顾名思义与移位操作符是移动位的.
&->按位与操作符
移动规则:有0为0,全为1为1
| ->按位或操作符
移动规则:有1为1, 全为0为0
交换两个变量,异或是支持交换律的。
^ ->按位异或操作符
移动规则:相同为0,相异为1
异或操作符是支持交换律的。
~ ->按位取反操作符
对于一个数的二进制按位取反
练习一下:交换两个整数
我们通常使用创建临时变量的做法,现在用位操作符来实现一下。
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
printf("交换前a=%d b=%d\n",a,b);
a = a^b;
b = a^b;
a = a^b;
printf("交换后a=%d b=%d\n",a,b);
return 0;
b = a^b^b = a;
a = a^a^b = b;
}
结果:
过程:
4.赋值操作符
赋值操作符 | 含义 |
---|---|
= | 把右边操作数的值赋给左边操作数 |
+= | 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<<=2等于a=a<<2 |
>>= | a>>2等于a=a>>2 |
&= | a&=2等于a=a&2 |
^= | a ^ =2等于a=a^2 |
== | 判断是否相等 |
!= | 不相等 |
5.单目操作符
操作数只有一个
单目操作符 | 含义 |
---|---|
! | 逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 |
- | 负值 |
+ | 正值 |
& | 取出地址 |
sizeof | 计算操作数的类型字节长度 |
%= | a%b等于a=a%b |
~ | 对于一个数的二进制数按位取反 |
- - | 自增运算符 |
++ | 自减操作符 |
* | 间接引用操作符 |
== | 判断是否相等 |
5.1关于sizeof操作符
sizeof:返回一个对象或者类型所占的内存字节数,返回值类型为size_t(unsigned int)。
sizeof(类型);
sizeof 对象;
使用sizeof时。
int a = 0;
sizeof(a);
sizeof(int);
sizeof a;//这里就表示sizeof不是函数。
//3种都行,但是sizeof int 不可以。
6.关系操作符
关系操作符 | 含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不相等 |
== | 相等 |
7.逻辑操作符
&& 逻辑与:只要有一个条件为假,结果为假,条件全为真才为真。多个条件时,依次判断真假,遇到假时后面条件不进行判断,直接为假。
|| 逻辑或:只要有一个条件为真,结果为真,条件全为假才为假。多个条件时,依次判断真假,遇到真时后面条件不进行判断,直接为真。
为真返回1,为假返回0。(这是与& | 这两个位操作符的区别)
例子
判断闰年:
#include<stdio.h>
int main()
{
int y = 0;
scanf("%d", &y);
//1. 能被4整除,并且不能被100整除
//2. 能被400整除是闰年
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
{
printf("闰年\n");
}
else
{
printf("不是闰年\n");
}
return 0;
}
8.条件操作符
exp1?exp2:exp3
对表达式exp1进行判断,若判断为真则执行表达式exp2,若判断为假则执行表达式exp3。例如:
#include<stdio.h>
int main()
{
int a = 1;
int b = 0;
b = a > 5 ? 3 : -3;
printf("变量 b 的值为:%d\n", b);
return 0;
}
//运行结果是:变量b的值位:-3
9.逗号操作符
exp1, exp2, exp3, …exp
运算过程为:从左往右逐个计算表达式,计算结果为最后一个表达式。
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
10.下标引用、函数调用和结构成员
[ ]下标引用操作符
#include<stdio.h>
int main()
{
int arr[5] = { 1,2,3,4,5 };
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
printf("%d ", i[arr]);
//这种方法也可以,[]只是操作数,和+-一样。
}
}
()函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数的传递给函数的参数。
#include<stdio.h>
void print1()
{
printf("hehe\n");
}
void print2(const char* str)
{
printf("%s", str);
}
int main()
{
print1();
print2("hehe");
return 0;
}
运行结果:
结构体成员访问操作符. ->
.操作符 结构体.成员名
->操作符 结构体指针->成员名
#include<stdio.h>
#include<string.h>
struct stu
{
char name[20];
int age;
};
void set_stu(struct stu* t)
{
strcpy(t->name, "张三");字符串拷贝
t->age = 18;
}
void print_stu(struct stu t)
{
printf("%s %d", t.name, t.age);
}
int main()
{
struct stu s1 ;
set_stu(&s1);
print_stu(s1);
return 0;
}
结语:关于C语言中的操作符介绍到这里了,如果文章中有什么疑惑可以在评论区提出,有什么错误也可以指出哦,谢谢。