C语言——操作符介绍

        C语言中有许多不同类型的操作符,它们用于执行各种操作,包括算术运算、关系运算、逻辑运算、赋值操作以及位操作等。以下是一些常见的C语言操作符。

一、算数操作符

作用:执行数学运算。

+:加法

-:减法

*:乘法

/:除法

%:取模(取余数)

例子:

除法运算中,若被除数和除数都为int,则商也为int。若被除数和除数有一个为浮点型,则商为浮点型。

取模运算中,需要两个数同为int,且模的正负看被除数的符号。

二、赋值操作符

        在C语言中,赋值操作符用于将一个值赋给一个变量。赋值操作符允许你更新或修改变量的值,而且它们也返回赋值后的值。以下是C语言中常见的赋值操作符:

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

用法如下:

//a=a+b;
//a+=b;

三、单目操作符

单目操作符包含以下:!、 ++ -- & * + - ~ sizeof ( 类型 )

!逻辑反操作

int main()
{
	int a = 5;
	if (!a)
		printf("yeah");
	else
		printf("oh");
	return 0;
}

输出结果:oh,说明!a为0

++ --递增、递减

& *

&:取地址操作符 

*:解引用操作符(间接访问操作符)

&和*用于指针当中

int main()
{
	int a = 10;
	int* pa = &a;    
    //*pa是解引用操作符(间接访问操作符)通过pa中存放的地址,找到指向的空间(内容)

	return 0;
}

sizeof()

不是函数,是单目操作符

计算的结果类型是size_t,size_t是一种无符号的整数,打印时用%zd

计算结果(返回值)的单位是字节

sizeof用于数组
int main()
{
	int arr[10];
	printf("%d\n", sizeof(arr));//40 - 计算整个数组的大小,字节单位
	printf("%d\n", sizeof(arr[0]));//4 - 计算数组中元素的大小,字节单位

	printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 - 数组元素个数
}

~

按补码二进制位取反

(类型)

:用于强制类转换

int a = (int)3.14;
printf("%d", a);//3

四、关系操作符

<   >   <=   >=   ==   !=

返回的结果为0或1

五、逻辑操作符

&&逻辑与

||逻辑或

!逻辑取反

短路现象

&&——左0,右不用算了

int i = 0, a = 1, b = 2, c = 3, d = 4;

i = a++ && ++b && d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
//a=2
//b=3
//c=3
//d=5

||——左1,右不用算了

int i = 0, a = 1, b = 2, c = 3, d = 4;

i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
//a=2
//b=2
//c=3
//d=4

六、条件操作符

exp1?exp2:exp3(三目操作符)

exp1真——执行exp2

exp1假——执行exp3

int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("%d", a > b ? a : b);
}

输出结果:a、b之间较大的数

若输入为5 9,则输出为9

七、位移操作符

<<  左移操作符

>>  右移操作符

注:位移操作符只能是整数,移动的是二进制位数,这里涉及到了整数的二级制表现形式(即原码、反码和补码)。

原码、反码和补码

1.正整数的原码、反码、补码是一样的

2.负整数的原码、反码、补码需要计算

1个整型占4个字节,即32bit位

符号位   

int a=15;

原码:

正数:符号位是0

负数:符号位是1

举个例子简单说明一下:

int main()
{
	int a = 15;
	//00000000000000000000000000001111 - 原码
	//00000000000000000000000000001111 - 反码
	//00000000000000000000000000001111 - 补码

	int b = -15;
	//10000000000000000000000000001111 - 原码
	//11111111111111111111111111110000 - 反码(原码符号不变,按位取反)
	//11111111111111111111111111110001 - 补码(反码+1)

	//整数在内存中存储的是补码
	//计算的时候也是使用补码计算
	return 0;
}

知道了什么是二进制的原码、反码和补码后就可以进行位移操作了。

右移>>

算术右移(右边丢弃,左边补原来的符号位)

逻辑右移(右边丢弃,左边直接补0)

C语言中没有明确规定是算术右移还是逻辑右移,一般编译器上采用的是算术右移

左移<<

:左边丢弃,右边补0

八、位操作符

& 按位与

int main()
{
	int a = 3;
	//00000000000000000000000000000011 - 补码
	int b = -5;
	//10000000000000000000000000000101 - 原码
	//11111111111111111111111111111010 - 反码
	//11111111111111111111111111111011 - 补码
	int c = a & b;
	//& 有0则为0,同时为1,才是1
	//00000000000000000000000000000011 - 补码(正数即原码)

	printf("%d\n", c);//3

	return 0;
}

| 按位或

int main()
{
	int a = 3;
	//00000000000000000000000000000011 - 补码
	int b = -5;
	//10000000000000000000000000000101 - 原码
	//11111111111111111111111111111010 - 反码
	//11111111111111111111111111111011 - 补码
	int c = a | b;
	//| 有1则为1,同时为0,才是0
	//11111111111111111111111111111011 - 补码
	//11111111111111111111111111111010 - 反码
	//10000000000000000000000000000101 - 原码
	
	printf("%d\n", c);//-5

	return 0;
}

^ 按位异或

int main()
{
	int a = 3;
	//00000000000000000000000000000011 - 补码
	int b = -5;
	//10000000000000000000000000000101 - 原码
	//11111111111111111111111111111010 - 反码
	//11111111111111111111111111111011 - 补码
	int c = a ^ b;
	//^ 相同为0,相异为1
	//11111111111111111111111111111000 - 补码
	//11111111111111111111111111110111 - 反码
	//10000000000000000000000000001000 - 原码

	printf("%d\n", c);//-8

	return 0;
}

异或支持交换律

九、逗号表达式

exp1,exp2,exp3,...expN

逗号表达式,就是用逗号隔开的多个表达式,(从左向右执行)整个表达式的最后结果为最后一个表达式的结果

int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);

printf("a=%d\nb=%d\nc=%d\n",a, b, c);

输出结果:a=12

                  b=13

                  c=13

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

数组下标引用:[]

int arr[10] = { 1,2,3,4,5 };
printf("%d", arr[3]);//4

操作数是:arr和3

函数调用:()

int len = strlen("abc");//()函数调用操作符
printf("%d\n", len);

操作数是:strlen和“abc”

访问结构成员:.  ->

struct Book
{
	char name[30];
	char author[30];
	float price;
};

int main()
{
	struct Book b1 = { "C","谭",66.6f };//书
	struct Book b2 = { "数据结构","张",88.8f };//书

	printf("%s %s %f\n", b1.name, b1.author, b1.price);
    //谭 C 66.599998
}

结构体变量.成员名

struct Book
{
	char name[30];
	char author[30];
	float price;
};

void Price(struct Book* p)
{
	printf("%s %s %f\n", p->author, p->name, p->price);
}

int main()
{
	struct Book b1 = { "C","谭",66.6f };//书
	struct Book b2 = { "数据结构","张",88.8f };//书

	Price(&b1);//谭 C 66.599998
	Price(&b2);//张 数据结构 88.800003
}

结构指针->成员名

附:操作符优先级表(来自书本)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值