操作符详解--2022/5/8学习笔记

本文详细介绍了C语言中的算数、移位、位、赋值、单目、关系、逻辑、条件、逗号等操作符的用法,包括它们的规则、特点和实例。此外,还探讨了下标引用、函数调用、结构成员的使用以及表达式求值的注意事项。文章以学习笔记的形式,提供了一些练习题目和解答。

22/5/8学习笔记(Part 8)

算数操作符 + - * / %

  1. 除%以外,其他四个操作符可用于整数和浮点数。
  2. 算数操作符 / 的用法:分子/分母。如果 / 两边都是整数则执行整数除法,得到的也是整数,只要有浮点数则执行浮点数除法。
int a = 6.00int b = 2int c = a / b;
printf(%d\n”, c);//得到的是3.00
  1. 算术操作符 % 的意义:整除后取余。%操作符的两个操作数必须为整数

移位操作符 >> <<

移位操作符只能是整数。不能移动负数位。
移位操作符
移动的是数据存储二进制形式中的比特位

1 .<<左移操作符
规则:左边抛弃,右边补0。

2 .>>右移操作符
规则之一:逻辑移位:左边填0,右边丢弃。
规则之二:算术移位:左边填充符号位(若数值类型为unsigned int类型,则填0),右边丢弃。

即使已用移位操作符操作,但实际上没有对数值赋值的话,数值自身的值不会发生变化。

int a = 10;
a>>5;
printf("%d\n", a);//得到10
a<<6;
printf("%d\n", a);//得到10
int b = a>>3;
printf("%d\n", b);//得到1
int c = a<<9;
printf("%d\n", c);//得到5120

位操作符 &(按位与) 、 | (按位或) 、 ^(按位异或)

位操作符的操作数都必须是整数
&按位与:两个位都为1时,结果才为1。即:有0则为0。
| 按位或:两个位都为0时,结果才为0。即:有1则为1。
^ 按位异或:两个位相同为0,相异为1。

赋值操作符

=、+=、-=、*=、/=、&=、^=、l=、>>=、<<=
其中x = x + 20,也可以写成 x += 20,其他同理。
注: == 是判断,=是赋值。

单目操作符

在这里插入图片描述
前置++:x= ++a; 先加减,再使用a。
后置++:x= a++; 先使用a,再加减。

关系操作符

.> 、>=、<、<=、!=(测试不相等)、==(测试相等)

逻辑操作符

&& 逻辑与
| | 逻辑或
1.要分清楚与位操作符:& 和 | 的区别。
2. | | 逻辑或:遇真则停。
3. && 逻辑与:遇假则停。
在这里插入图片描述

条件操作符

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

逗号表达式

表达式1, 表达式2, 表达式3,…表达式n
从左向右依次执行,整个表达式的结果是逗号表达式中最后一个表达式的结果。

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

[ ] 下标引用:主要是在数组中实现,例如有一个int arr[10],需要调用第7个元素时,可以写:arr[6]。
( )函数调用:接收一个或者多个操作数。
. 的用法:结构体.成员名。
->的用法:结构体指针 -> 成员名。(在使用指针时常用到)

表达式求值

在这里插入图片描述
1.旨在各个不同的类型同时出现在表达式后,需要将其类型长度补充整齐而后进行加减运算。其中整型提升是按照变量的数据类型的符号位来提升的,负补1,正补0,无符号补0。算数转换也指的是其中低位的操作数需转换为另一个操作数的类型。以下为其层次体系:
longdouble
double
float
unsigned long int
long int
unsigned int
int
算数转换需要合理。

2.复杂表达式需要注意运算时候的优先级(谁优先于谁)、结合性(从左到右还是从右到左)和是否控制求值顺序。

3.如果写出的表达式不能通过操作符的属性确定唯一的计算路径,那么这个表达式就是存在问题的。

⭐题目

1.如何判断系统是逻辑右移还是算数右移?
2.不能创建临时变量(第三个变量),实现两个数的交换。

⭐答案

1.思维:用-1进行右移操作,-1在二进制中存储数据为32位-1(补码形式),若是进行逻辑右移,左边补0,得到的则为一个正数;若是进行算数右移,左边补符号位,得到的仍然是-1。

int main()
{
  int a = -1;
  int b = a >> 1;
  if(a == b)
  {
    printf("算术右移\n");
  }
  else
    printf("逻辑右移\n");
  
  return 0;
}

2.该题中要了解到&、| 、^ 的特殊用法。
此题主要运用^ 的特殊用法:任何数异或自己=把自己置0。
代码如下:

int main()
{
  int a = 10;
  int b = 20;
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  printf("a = %d b = %d\n", a, b);
  return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值