C语言之操作符

本文详细介绍了C语言中的各种操作符,包括算术操作符如加减乘除和取模,移位操作符如左移和右移,以及位操作符如按位与、按位或、按位异或和按位取反。还讨论了赋值操作符、单目操作符如sizeof,以及关系、逻辑和条件操作符。文章强调了位操作在提高程序效率中的作用,并提供了实例来解释这些概念。
摘要由CSDN通过智能技术生成

书摘文案:”希望你能一直拥有温柔,感受风的软,海的凉,清澈的梦想。“
png?=500x

这里我们来了解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语言中的操作符介绍到这里了,如果文章中有什么疑惑可以在评论区提出,有什么错误也可以指出哦,谢谢。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值