C语言操作符[算数操作符,赋值操作符,单目操作符,移位操作符]

简介: C语言操作符[算数操作符,赋值操作符,单目操作符,移位操作符]

操作符:

算术操作符
+   -  *  /  %

1:除了%操作符之外,其他几个操作符可以作用于整数和浮点数。

2:对于/操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数,执行的就是浮点除法。

3:%操作符的两个操作数必须为整数,返回的是整除之后的余数。

int a = 5/2;
  printf("%d\n", a);
  double b = 5 / 2.0;
  printf("%f\n", b);
2
2.500000

a进行的是两个整数相除,因此并不会的到小数,要想得到小数,只需要把除数或者被除数改为浮点数即可。

移位操作符

移位操作符(移动的是二进制位,他们的操作数必须是整数),(右移一位有除二的效果):

右移操作符>>:

1:算数右移(主要针对负数符号位这里会有所不同):二进制最右边丢弃,左边补原符号位

2:逻辑右移(不分正负数):右边丢弃,左边补零

左移操作符<<

左边丢弃,右边补0

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

例如:

Int num=10;
Num>>-1;//error

8位二进制数11001101分别右移一位

逻辑右移就是:[0]1100110

算术右移就是:[1]1100110

整数存储到内存的是补码:

1000000000000000000000000000000000001(-1的原码)

1111111111111111111111111111111111110(反码,符号位不变,其余位置将0变成1)

1111111111111111111111111111111111111(补码,末位置加1)

位操作符:

(他们的操作数必须是整数,同样是对二进制进行操作)


1:& 按位与 :两个数的二进制位同时为1,则该位是1,否则是0,如果有负数进行参与,则应先算出该负数的补码,整数并不参加此次运算,由于正数的补码反码原码是相同的;


2: |按位或 :两个数的二进制只要有一个为一,则该位为1


3:^按位异或(两个数的二进制位,相同为0,相异为1)


例题:不创建临时变量实现两个数的交换


方法一:(但这种方法只能用于比较小的整数值,,如果想实现非常大的整数进行交换,就可能会溢出,因此这种方法并不具有普遍性)

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

方法二:(这种方法并不会产生溢出现象,但是它的可读性和执行能力较差)

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

判断一个数的二进制中包含几个1:

#include<stdio.h>
int main()
{
​ int num = 0;
​ int count = 0;
​ scanf_s("%d", &num);
​ while (num)
​ {
​   if (num % 2 == 1)
​     count++;
​   num = num / 2;
​ }
​ printf("%d\n", count);
​ return 0;
}
-1
0

但这个代码是有问题的,如果我们输入的数字是复数的话,得到的值是0,显然不符合我们的规则。

按位与的方法:

#include<stdio.h>
int main()
{
​ int num = 0;
​ int count = 0;
​ scanf_s("%d", &num);
​ int i = 0;
​ for (i = 0; i < 32; i++)
​ {
​   if (1 == ((num >> i) & 1))#不停的向右移动,1的二进制码始终是000000000000000000000001
​     count++;
​ }
​ printf("%d\n", count);
​ return 0;
}
-1
32

赋值操作符:

当我们不满意前面的某个变量时,可通过赋值运算符对该变量的值进行修改。

单个赋值:

举例:

int a = 100;
​ a = 30;
​ printf("%d", a);
30

连续赋值:

int a = 10, b = 23, x, y;
​ y = x = a + b;
​ printf("%d\n", y);
​ printf("%d\n", x);
33
33

小tips:赋值运算符是一个等号,而比较运算符是两个等号。

复合赋值符:

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

这种操作符在一定程度上可以简化代码量

举例:

a=a+2;
​   a+=2;
​   a=a>>1;
​   a>>=1;

这两种赋值的结果都是相通的,只是在形式上不太一样。

单目操作符:

!:逻辑反操作 (真变假,假变真)

-:负值

+:正值

& :取地址 (一般和指针配合使用)


sizeof :操作数的类型长度 (计算变量所占内存空间的大小,单位是字节)


sizeof(变量类型或变量名),后面如果是变量类型则括号不能省略,但如果是变量名括号可以省略。


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


– :前置,后置–


++ :前置,后置++


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


(类型):强制类型转换


常见类型的字节大小:int:4个字节 char:1个字节 *p:4个字节 数组:数组元素个数×对应类型的大小

相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
74 0
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
160 1
|
2月前
|
存储 编译器 C语言
【C语言基础考研向】07逻辑运算符与赋值运算符
本文介绍了C语言中的逻辑运算符与逻辑表达式、赋值运算符以及求字节运算符`sizeof`。逻辑运算符包括`!`(逻辑非)、`&&`(逻辑与)和`||`(逻辑或),其优先级规则与数学运算符类似。通过示例展示了如何用这些运算符判断闰年及逻辑非的运算方向。此外,文章还解释了左值与右值的概念及其在赋值运算中的应用,并介绍了复合赋值运算符的使用方法,如加后赋值`+=`和乘后赋值`*=`。最后,通过`sizeof`运算符示例展示了如何获取变量的字节大小。
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
170 0
|
3月前
|
C语言
C语言结构体赋值的四种方式
本文总结了C语言结构体的四种赋值方式,并通过示例代码和编译运行结果展示了每种方式的特点和效果。
230 6
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6
|
19天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
25天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7