C语言——操作符详解

目录

一、算术操作符

二、移位操作符

三、位操作符

四、赋值操作符

五、单目操作符

六、关系操作符

七、逻辑操作符

八、条件操作符

九、逗号表达式

十、下标引用、函数调用和结构成员

以上就是C语言中涉及到得操作符,我将用代码实例配合说明,小伙伴们在学习操作符的时候,一定要去编译器里动手实践一下,可以帮助大家更好的理解每一个操作符。

一、算术操作符

+        -        *        /        %

1、加法(+)

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	a = 1 + 2;//加法两边可以是常量
	a = b + c;//也可以是变量
	printf("%d", 1 + 2);//这里打印的是3,而不是整个表达式
	return 0;
}

2、减法(-)

#include <stdio.h>
int main()
{
	int a = 0;
	a = 5 - 3;//减法运算就是让减号左边的数减去右边的数
	printf("%d", a);//结果是屏幕上打印2
	return 0;
}

3、乘法(*)

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 0;
	b = a * a;//和数学中的乘法一样,但是在计算机中,乘号用*来表示
	printf("%d", b);//结果是1
	return 0;
}

4、除法(/)

例如:我们想在计算机中打印5除以3的值

首先你可能会这么写:

#include <stdio.h>
int main()
{
	int a = 0;
	a = 5 / 3;
	printf("%d", a);
	return 0;
}

是的,当我们运行程序后,发现屏幕上只打印了一个1,后面的小数部分丢失了!

原因是a的类型是整型,用来存放整数,自动将小数部分丢失,这一过程叫做截断。那么我们是否可以用一个浮点类型的变量来存放结果呢?

#include <stdio.h>
int main()
{
	float a = 0.0;
	a = 5 / 3;
	printf("%f", a);//注意打印flaot类型的数要用%f
	return 0;
}

在我们运行之后发现,结果是1.00000,依旧没有我们想要的小数的值

原因是,我们确实是创建了一个浮点类型的变量,但是编译器在执行5/3的时候,依旧是一个整形的表达式,在赋给a之前,它的小数部分依旧丢失了!

所以我们做如下改进:

#include <stdio.h>
int main()
{
	float a = 0.0;
	a = 5.0 / 3;//我们让其中的一个数,成为浮点数
	printf("%f", a);//注意打印flaot类型的数要用%f
	return 0;
}

这回我们得到了我们想要的结果!

所以我们要注意:对于(/)操作符来说,如果两个操作数都是整数,那么就执行整数除法,而只要两个操作数中有一个数是浮点数,那么就执行浮点数除法。

5、求模运算符(%)

对于求模运算符来说,其运算结果是,两个数做除法,取他们的余数,特别要注意:%操作符的操作数,必须是整数。

#include <stdio.h>
int main()
{
	int a = 0;
	a = 13 % 5;//读作13求模5,必须是整数
	printf("%d", a);//打印的结果13除以5的余数,也就是3
	return 0;
}

二、移位操作符

<<        >>

1、左移操作符(<<)

在移位操作中,移的位都是二进制位,所以我们如果拿到一个非二进制的数,我们要先把他转换成二进制数。

 如图就是左移的详细过程,先把10转化成32位二进制序列,移位规则就是:左移一位,左边丢弃,右边补一个0,我们可以用一个代码来验证结果。

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 0;
	b = a << 1;//左移一位
	printf("%d\n", b);
	printf("%d\n", a);
}

运行之后,发现第一行打印20,第二行打印10,所以我们可以知道,左移的确是将左边的位丢弃,右边补0,但是,对于被操作的a本身来说,它的值并不会被改变。

2、右移操作符(>>)

在了解右移操作符之前,我们要先了解一下原码,反码,补码的概念。

在计算机中,一个负数的存储是以它的补码的形式来存储的。(正整数的原、反、补都一样)

原码:直接写成二进制序列

反码:原码的符号位不变,其他位按位取反

补码:反码每一位+1,得到补码

例如:-1

原码:10000000000000000000000000000001    注:这里最左边的1,是符号位,正0,负1

反码:1111111111111111111111111111111111110

补码:1111111111111111111111111111111111111

右移运算可以分为两类,逻辑右移和算术右移

#include <stdio.h>
int main()
{
	int a = -1;
	int b = 0;
	//把a的二进制位向右移动一位
	b = a >> 1;
	printf("%d", b);
}

大家可以在自己的编译器里,编写这个代码,验证一下,它在你的编译器里是逻辑右移还是算术右移。

三、位操作符

&        |        ^

1、按位与(&)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = 0;
	c = a & b;//按(2进制位)位与
	//规则:对应位都是1,按位与为1,只要有一个不是1,那么按位与为0
	//a:00000000000000000000000000000011
	//b:00000000000000000000000000000101
  //a&b:00000000000000000000000000000001
	printf("%d", c);
	return 0;
}

2、按位或(|)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = 0;
	c = a | b;//按(2进制位)位或
	//规则:对应位只要有一个1,那么就按位或为1
	//a:00000000000000000000000000000011
	//b:00000000000000000000000000000101
  //a|b:00000000000000000000000000000111
	printf("%d", c);
	return 0;
}

3、按位异或(^)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = 0;
	c = a ^ b;//按(2进制位)位异或
	//规则:对应位,相同为0,相异为1
	//a:00000000000000000000000000000011
	//b:00000000000000000000000000000101
  //a|b:00000000000000000000000000000110
	printf("%d", c);
	return 0;
}

四、赋值操作符

=        +=        -=        *=        /=        %=        >>=        <<=        &=        |=        ^=

"="用来赋值

int a = 0;//把0赋值给a

其余的为复合赋值

例如:

x = x + 1;
x += 1;

上面这两种写法是完全等价的,复合赋值就是为了简洁,每一个符合赋值的运算符道理都和上面的一样。

五、单目操作符

!        -        +        &        sizeof        ~        --        ++        *        (类型)

1、逻辑反操作(!)

常用于判断中

int i = 0;
if(!i)      //!0即为真
{
    printf("nihao");
}

这行代码的意思是,如果i的逻辑反为真值,就执行if语句中的语句。

2、负值(-)

#include <stdio.h>
int main()
{
	int a = 3;
	a = -a;
	printf("%d", a);
	return 0;
}

3、正值(+)

#include <stdio.h>
int main()
{
	int a = 3;
	a = +a;//正数通常省略+
	printf("%d", a);
	return 0;
}

4、取地址(&)

用来取地址

#include <stdio.h>
int main()
{
	int a = 10;
	printf("%p\n", &a);//用来取出a在内存中的地址,打印地址用%p
	return 0;
}

5、sizeof(求操作数的类型长度,以字节为单位)

int main()
{
	int a = 3;
	printf("%d", sizeof(a));//计算int类型的长度
	return 0;
}

6、按位取反(~)

#include <stdio.h>
int main()
{
	int a = -1;
	a = ~a;
	//10000000000000000000000000000001  --原码
	//11111111111111111111111111111110  --反码
	//11111111111111111111111111111111	--补码
    //按位取反
	//11111111111111111111111111111111	--内存中的a
	//00000000000000000000000000000000	--取反之后
	printf("%d", a);
	return 0;
}

7、自减(--)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 0;
	int c = 0;
	b = a--;//后置--,先使用,再--
	c = --a;//前置--,先--,后使用
	printf("%d\n", b);//3
	printf("%d\n", c);//1
	return 0;
}

8、自增(++)

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 0;
	int c = 0;
	b = a++;//后置++,先使用,再++
	c = ++a;//前置++,先++,后使用
	printf("%d\n", b);//3
	printf("%d\n", c);//5
	return 0;
}

9、间接访问(*)

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//创建一个指针变量
	*pa = 20;//*--解引用操作符-间接访问操作符
	printf("%d\n", a);//20
	return 0;
}

10、强制类型转换((类型))

#include <stdio.h>
int main()
{
	int a = (int)3.14;//将double类型强制转换为整型
	printf("%d\n", a);
	return 0;
}

六、关系操作符

>         大于

>=       大于或等于       

<         小于       

<=       小于或等于       

!=        不等于       

==        等于

这些关系操作符与数学中的符号意思一样,通常用来进行判断

特别注意“==”和“=”不一样

七、逻辑操作符

&&        ||

1、逻辑与(&&)

用来表示并且

只有&&两边的表达式均为真,才表示真

例如:1&&3  为真

           1&&0   为假

2、逻辑或(||)

只要||一边的表达式为真,整个表达式就为真

例如:1||0    为真

八、条件操作符

表达式1?表达式2:表达式3

条件操作符又称为三目操作符

可以解读为,如果表达式1成立,则执行表达式2的值,否则执行表达式3的值

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int max = (a > b ? a : b);//用来找到两数的较大值
	printf("%d\n", max);
	return 0;
}

九、逗号表达式

表达式1,表达式2,表达式3,......表达式n

逗号表达式,顾名思义就是用逗号隔开的表达式

表达式的结果:从左向右依次执行,整个表达式的值是最后一个表达式的结果

#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = (a + b, b + 1, a++);//最后一个表达式的值
	printf("%d\n", c);//3
	return 0;
}

十、下标引用、函数调用和结构成员

1、下标引用([])

用于数组,操作数:一个是数组名,另一个是下标

#include <stdio.h>
int main()
{
	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	printf("%d", arr[4]);//[下标]用来访问数组中第5个元素
	return 0;
}

2、函数调用

#include <stdio.h>
void test()
{
	printf("nihao");
}
int main()
{
	test();//()作为函数调用的操作符
	return 0;
}

3、访问结构成员

.        结构体.成员名

#include <stdio.h>
struct Book
{
	char name[20];
	char id[10];
	int price;
};
int main()
{
	struct Book b = { "nihao","KN16798",10 };
	printf("%s\n", b.name);
	printf("%s\n", b.id);
	printf("%d\n", b.price);
	return 0;
}

->      结构体->成员名

#include <stdio.h>
struct Book
{
	char name[20];
	char id[10];
	int price;
};
int main()
{
	struct Book b = { "nihao","KN16798",10 };
	struct Book* pb = &b;

	printf("%s\n", pb->name);
	printf("%s\n", pb->id);
	printf("%d\n", pb->price);
	return 0;
}

以上就是C语言中涉及的操作符,有问题的小伙伴可以在评论区讨论。

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值