操作符(C语言)

目录

1.算术操作符

1.1 符号

1.2 代码演示

1.3 运行结果 

2.移位操作符

2.1 符号

2.1 左移操作数

2.1.1 代码演示

2.2.2 运算结果

2.2.3 结果分析

 2.3 右移操作符

2.3.1 移位规则

2.3.2 代码演示

2.3.3 运算结果

2.3.4 结果分析

3.位操作符

3.1 符号

3.2 代码演示

3.3 运算结果

4.赋值操作符

4.1 符号

4.2 代码演示

5.单目操作符

5.1 符号

5.2 代码演示

 6.关系操作符

6.1 符号

6.2 代码演示 

7.逻辑操作符

7.1 符号

7.2 代码演示

8.条件操作符

8.1 符号

8.2 代码演示

9.逗号表达式

9.1 符号

9.2 代码演示

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

10.1 下标引用

10.2 函数调用

10.3 结构成员


1.算术操作符

1.1 符号

+、-、*、/

+:可用于整数和浮点数的加法

-:可用于整数和浮点数的减法

*:可用于整数和浮点数的乘法

/:可用于整数和浮点数的除法

%:只能用于整数的取余

1.2 代码演示

#include <stdio.h>

int main()
{
	int a = 5;
	int b = -2;
	printf("a + b = %d\n", a + b);
	printf("a - b = %d\n", a - b);
	printf("a * b = %d\n", a * b);
	printf("a / b = %d\n", a / b);
	printf("a %% b = %d\n", a % b);//在打印%时,在%前加上%,表示后面的%用于打印
	return 0;
}

1.3 运行结果 

注:

1.在使用/时,只要出现一个浮点数,则为浮点数的除法;当除号两端都为整数时,则为整数除法

 2.在除法中,除数不能为0

3.在使用%时,%两边的操作数必须都为整数

4. 两个异号的数取余后结果取决于分子的符号。

2.移位操作符

2.1 符号

<<、>>

<<:左移操作符,用于将整数左移指定位数

>>:右移操作符,用于将整数右移指定位数

移位操作符移动的是二进制位

移位操作符的操作数只能是整数

2.1 左移操作数

移位规则:左边舍弃,右边补0

2.1.1 代码演示

#include <stdio.h>

int main()
{
	int a = 1;
	int b = -1;
	int c = a << 2;
	int d = b << 2;
	printf("a << 2 = %d b << 2 = %d\n", c, d);
	return 0;
}

2.2.2 运算结果

2.2.3 结果分析

整数的二进制有三种表现形式,分别是原码、补码和反码

在移位时,移动的是整数的补码

对于正整数,其原码、反码、补码相同

对于负整数,其原码、反码、补码不同,需通过计算得到

 2.3 右移操作符

2.3.1 移位规则

右移运算分为两种

1.逻辑移位

左边补0,右边舍弃

2.算术移位

左边以原该值符号位填充,右边舍弃

注:对于使用逻辑移位还是算术移位,无规定,一般使用的是算术右移 

2.3.2 代码演示

#include <stdio.h>

int main()
{
	int a = 10;
	int b = -10;
	int c = a >> 2;
	int d = b >> 2;
	printf("a >> 2 = %d b >> 2 = %d\n", c, d);
	return 0;
}

2.3.3 运算结果

2.3.4 结果分析

注:

1.在VS中,使用的是算术位移,即在左边用原该值符号位填充

2.对于移动运算符,不要移动负数位,这个是标准未定义的

3.移位操作不改变原值

3.位操作符

3.1 符号

&、|、^

&:按位与(有0则为0)

|:按位或(有1则为1)

^:按位异或(相同为0,相异为1)

3.2 代码演示

#include <stdio.h>

int main()
{
	int a = 10;//1010
	int b = 2; //0010
	printf("a & b = %d\na |b = %d\na ^ b = %d\n", a & b, a | b, a ^ b);
	return 0;
}

3.3 运算结果

注:

1.位操作符的操作数必须为整数

2.计算机中存储的是二进制的补码,所以进行的是补码运算,运算后,再转换为原码

3.在有负数时,其补码参与运算,若结果符号位为0,则为正整数,直接写出原码(与补码相同);若符号位为1,则为负整数,需经过运算得到原码(可将a的值改为-10,分别与b进行&、|、^运算,并分析结果)

4.赋值操作符

4.1 符号

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

=:简单赋值操作,将=右边的值赋值给左边

+= -= *= /= %= >>= <<= &= |= ^=:复合赋值

4.2 代码演示

#include <stdio.h>

int main()
{
	int a = 10;
	a += 2;//将a+2后再将a+2的值赋值给a,等价于a = a +2
	printf("a = %d\n", a);//a = 12
	int b = 10;
	b >>= 2;//将b右移2位后再将得到的值赋值给b
	printf("b = %d", b);//b = 2
	//其他赋值操作符的用法是相同的,在这里就不一一列举了,
	//可以自行练习,体会赋值操作符的使用
	return 0;
}

5.单目操作符

5.1 符号

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

!:逻辑反操作

-:负值

+:正值

&:取地址

sizeof:计算操作数的类型长度(以字节为单位)

~:对一个数的二进制按位取反

--:前置、后置--

++:前置、后置++

*:解引用操作符

(类型):强制类型转换

5.2 代码演示

!(逻辑反操作)

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 20;
	//0为假,非0为真
	printf("!a = %d\n!b = %d", !a, !b);//!a = 1 !b = 0 
	return 0;
}

 +(正值)、-(负值)

int main()
{
	int a = 5;
	printf("%d %d\n", +a, -a);//5 -5
    return 0;
}

 &(取地址)、*(解引用)

#include <stdio.h>

int main()
{
	int a = 10;
	int *pa = &a;//取出a的地址,并将a的地址保存在指针变量pa中
	*pa = 20;//通过解引用,找到a,并将a的值修改为20
	printf("%d", a);//20
	return 0;
}

sizeof()

#include <stdio.h>

int main()
{
	int a = 1;
	int arr[10] = { 0 };
	printf("%d\n", sizeof a);//4,在求变量的长度时可以省略括号
	printf("%d\n", sizeof(int));//4
	printf("%d\n", sizeof(arr));//40,一个int类型长度为4,十个则为40
	printf("%d\n", sizeof(&a));//4或8,在32位系统下为4,在64位系统下为8
	return 0;
}

注:

1.sizeof是操作符,关键字,而不是函数

2.sizeof求类型的长度时()不能省略,在求变量的长度时可以省略

~(按位取反)

#include <stdio.h>

int main()
{
	int a = 1;//    00000000000000000000000000000001
	int b = ~a;//~a 11111111111111111111111111111110
			//反码:11111111111111111111111111111101
			//补码:10000000000000000000000000000010
	printf("%d", b);//-2
	return 0;
}

 ++、--

前置++(--)是先++(--),再使用

后置++(--)是先使用,再++(--)

#include <stdio.h>

int main()
{
	int a = 2;
	int b = ++a;//先++,a的值为3,再将a的值赋值给b,因此b = 3
	int c = a++;//先将a的值赋值给c,再++,这时a的值为4
	printf("a = %d b = %d c = %d", a, b, c);//a = 4 b = 3 c = 3
	return 0;
}

注:在使用++、--时,变量本身会改变

():强制类型转换

#include <stdio.h>

int main()
{
	int a = (int)2.5;//将2.5强制转换为int类型
	printf("%d", a);//2
	return 0;
}

 6.关系操作符

6.1 符号

<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、==(判断相等)、!=(不相等)

6.2 代码演示 

int main()
{
	int a = 1;
	if (a > 0)
	{
		printf("正数\n");
	}
	else if (0 == a)
	{
		printf("0\n");
	}
	else
	{
		printf("负数\n");
	}
	//其他的关系操作符的用法是相同的,这里就不一一列举了
	return 0;
}

注:

1.在使用时,要注意,==是判断相等的关系操作符,=是赋值操作符

2.在判断字符串是否相同时,不使用==进行比较,而是使用strcmp函数进行比较 

3.在使用时可以通过将常量前置来避免错误,如 1==a,当写成1 = a时,编译器会报错,我们能够及时发现错误

7.逻辑操作符

7.1 符号

&&、||

&&:逻辑与,当&&两边结果都为真时,结果才为真

||:逻辑或,当||有一边结果为真时,结果为真

7.2 代码演示

#include <stdio.h>

int main()
{
	int a = 1;
	int b = -1;
	if (a > 0 && b > 0)
	{
		printf("a、b都为正数\n");
	}
	else if (a > 0 || b > 0)
	{
		printf("a、b至少有一个为正数\n");
	}
	return 0;
}

注:&&和||为"短路"运算,即当||左边判断为真时,结果为真,右边则不再执行,&&左边判断为假时,结果为假,右边则不再执行

例如

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	if (++a > 0 || ++b > 0)//当++a > 0结果为真时,则不再执行后面 ++b > 0的判断
	{
		printf("%d %d\n", a, b);//1 0
	}
	return 0;
}

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	if (a++ > 0 && ++b > 0)//a++ > 0的结果为假,则不再执行后面的判断
	{
		printf("%d %d\n", a, b);
	}
	return 0;
}

8.条件操作符

8.1 符号

exp1 ? exp2 : exp3

若exp1为真,则返回exp2,否则返回exp3

8.2 代码演示

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;
	int c = 0;
	c = a > b ? a : b;
	//类似于
	/*if (a > b)
	{
		c = a;
	}
	else
	{
		c = b;
	}*/
	printf("%d", c);//2
	return 0;
}

9.逗号表达式

9.1 符号

exp1, exp2, exp3, ..., expN

逗号表达式,即用逗号隔开的表达式,从左向右依次执行,表达式的结果为最后一个表达式的结果

9.2 代码演示

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 1;
	//a++,a的值变为2,b++,b的值变为2,++a,a的值变为3,并将a的值赋值给c
	int c = (a++, b++, ++a);
	printf("a = %d b = %d c = %d\n", a, b, c);//a = 3 b = 2 c = 3
	return 0;
}

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

10.1 下标引用

符号:[]

有两个操作数,分别为数组名和索引值

#include <stdio.h>

int main()
{
	int arr[5] = { 0 };
	arr[0] = 1;//[]下标引用操作符,操作数为arr和0,将arr[0]的值改为1
	return 0;
}

10.2 函数调用

符号()

有一个或多个操作数,即函数名和参数(至少有一个——函数名)

#include <stdio.h>

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int a = 1;
	int b = 10;
	int c = Add(a, b);//()函数调用操作符
	printf("c = %d\n", c);//c = 11
	return 0;
}

10.3 结构成员

符号:

. ->

. :结构体对象.成员名

->:结构体指针->成员名

#include <stdio.h>

struct stu
{
	char name[10];
	int age;
	double score;
};

int main()
{
	struct stu stu1 = { "001",18,90.5 };
	struct stu* ps = &stu1;
	printf("%s\n", stu1.name);
	printf("%s", ps->name);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠枬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值