“探索C语言操作符的神秘世界:从入门到精通的全方位解析“

简介: “探索C语言操作符的神秘世界:从入门到精通的全方位解析“

各位少年,我是博主那一脸阳光,今天来分享深度解析C语言操作符,C语言操作符能帮我们解决很多逻辑性的问题,减少很多代码量,就好比数学的各种符号,我们现在深度解剖一下他们。

前言

在追求爱情的道路上,拥有吸引人的外表与内在气质固然重要,它们如同璀璨星辰,为你的个人魅力增光添彩。然而,真诚的情感交流和恰到好处的方式方法,更是搭建心桥、拉近彼此距离的关键所在。这些小手段并非是欺骗或伪装,而是用心去了解对方的需求,用行动表达自己的诚意,通过细微之处展现关爱与尊重。

比如,学会倾听,理解她的内心世界;适时给予鼓励和支持,让她感受到你的力量和温暖;或者是在日常生活中制造些微小而甜蜜的惊喜,让她看见你独特的浪漫与体贴。这些“小手段”,实则是情感智慧的体现,它们将帮助你在赢得芳心的旅程中,既能展现出真实的自我,又能以最适宜的方式打动她的心扉。

C语言操作符分类

操作符的分类

• 算术操作符: + 、- 、* 、/ 、%

• 移位操作符: << >>

• 位操作符: `& | ^

• `赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^=
• 单⽬操作符: !、++、–、&、
、+、-、~ 、sizeof、(类型)

• 关系操作符: > 、>= 、< 、<= 、 == 、 !=

• 逻辑操作符: && 、||

• 条件操作符: ? :

• 逗号表达式: ,

• 下标引⽤: []

• 函数调⽤: ()

• 结构成员访问: . 、->

⼆进制和进制转换

其实我们经常能听到2进制、8进制、10进制、16进制这样的讲法,那是什么意思呢?其实2进制、8进

制、10进制、16进制是数值的不同表⽰形式⽽已。

⽐如:数值15的各种进制的表⽰形式:

15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F

我们重点介绍⼀下⼆进制:

⾸先我们还是得从10进制讲起,其实10进制是我们⽣活中经常使⽤的,我们已经形成了很多尝试:

• 10进制中满10进1

• 10进制的数字每⼀位都是0~9的数字组成

其实⼆进制也是⼀样的

• 2进制中满2进1

• 2进制的数字每⼀位都是0~1的数字组成

那么 1101 就是⼆进制的数字了。

2进制转10进制

其实10进制的123表⽰的值是⼀百⼆⼗三,为什么是这个值呢?其实10进制的每⼀位是权重的,10进

制的数字从右向左是个位、⼗位、百位…,分别每⼀位的权重是 10 , 10 , 10 …

2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是: 2 , 2 , 2 … 0 1 2

如果是2进制的1101.

8进制的数字每⼀位是07的,07的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆

进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀

个8进制位,剩余不够3个2进制位的直接换算。

如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。

2进制转8进制

8进制的数字每⼀位是07的,07的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆

进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀

个8进制位,剩余不够3个2进制位的直接换算。

如:2进制的01101011,换成8进制:0153,0开头的数字,会被当做8进制。

原码、反码、补码

整数的2进制表⽰⽅法有三种,即原码、反码和补码

有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号

位,剩余的都是数值位。

符号位都是⽤0表⽰“正”,⽤1表⽰“负”。

正整数的原、反、补码都相同。

负整数的三种表⽰⽅法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

反码得到原码也是可以使⽤:取反,+1的操作。

对于整形来说:数据存放内存中其实存放的是补码

为什么呢?

在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀

处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算

过程是相同的,不需要额外的硬件电路。

移位操作符

<<左移操作符,把某个整数必须是整数左移一位以后计算后的结果,请看下面代码演示过程

int main()
 {
 inr m=10;
 int n=m<<1;
 printf("n=%d\n",n);
 printf("m=%d\n",n);
  return 0;
    }

右移操作符

移位规则:⾸先右移运算分两种:

  1. 逻辑右移:左边⽤0填充,右边丢弃
  2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
3. #include <stdio.h>
int main()
{
 int num = 10;
 int n = num>>1;
 printf("n= %d\n", n);
 printf("num= %d\n", num);
 return 0;
}

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

例如:

int num = 10;
num>>-1;//error

位操作符 & | ^ ~

& //按位与
| //按位或
^ //按位异或
~ //按位取反```

``他们的操作数必须是整数。

直接上代码:

#include <stdio.h>
int main()
{
 int num1 = -3;
 int num2 = 5;
 printf("%d\n", num1 & num2);
 printf("%d\n", num1 | num2);
 printf("%d\n", num1 ^ num2);
 printf("%d\n", ~0);
 return 0;
 }

⼀道变态的⾯试题:

不能创建临时变量(第三个变量),实现两个数的交换。

`
#include <stdio.h>
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;
}

``练习1:编写代码实现:求⼀个整数存储在内存中的⼆进制中1的个数。

#include <stdio.h>
int main()
{
 int num = 10;
 int count= 0;//计数
 while(num)
 {
 if(num%2 == 1)
 count++;
 num = num/2;
 }
 printf("⼆进制中1的个数 = %d\n", count);
 return 0;
}
//思考这样的实现⽅式有没有问题?
//⽅法2:
#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 for(i=0; i<32; i++)
 {
 if( num & (1 << i) )
 count++; 
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
}
//思考还能不能更加优化,这⾥必须循环32次的。
//⽅法3:
#include <stdio.h>
int main()
{
 int num = -1;
 int i = 0;
 int count = 0;//计数
 while(num)
 {
 count++;
 num = num&(num-1);
 }
 printf("⼆进制中1的个数 = %d\n",count);
 return 0;
练习2:⼆进制位置0或者置1
编写代码将13⼆进制序列的第5位修改为1,然后再改回0
13的2进制序列: 00000000000000000000000000001101
将第5位置为1后:00000000000000000000000000011101
将第5位再置为0:00000000000000000000000000001101
#include <stdio.h>
int main()
{
 int a = 13;
 a = a | (1<<4);
 printf("a = %d\n", a);
 a = a & ~(1<<4);
 printf("a = %d\n", a);
 return 0;
}

单⽬操作符

单⽬操作符有这些:

!、++、–、&、、+、-、~ 、sizeof、(类型)
单⽬操作符的特点是只有⼀个操作数,在单⽬操作符中只有&和
没有介绍,这2个操作符,我们放在学

习指针的时候学习。

7. 逗号表达式

1 exp1, exp2, exp3, …expN

逗号表达式,就是⽤逗号隔开的多个表达式

逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。

//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式
c是多少?
//代码2
if (a =b + 1, c=a / 2, d > 0)
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
 //业务处理
 a = get_val();
 count_val(a);
}
如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
 //业务处理
}

下标访问[]、函数调⽤()

8.1 [ ] 下标引⽤操作符

操作数:⼀个数组名 + ⼀个索引值

int arr[10];//创建数组

arr[9] = 10;//实⽤下标引⽤操作符。

[ ]的两个操作数是arr和9。

8.2 函数调⽤操作符

接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。

void test1()
{
 printf("hehe\n");
}
void test2(const char *str)
{
 printf("%s\n", str);
}
int main()
{
 test1(); //这⾥的()就是作为函数调⽤操作符。
 test2("hello bit.");//这⾥的()就是函数调⽤操作符。
 return 0;
}

结尾语

在探讨爱情艺术与人际交往的智慧之余,让我们切换到编程的世界。在C语言中,操作符同样是构建程序逻辑、实现数据交互的关键工具。例如:

算术操作符如同感情中的互动交流:加号(+)就像两人之间的共享和增进;减号(-)类似在解决问题时彼此的支持与分担;乘号(*)犹如双方情感的交织与深化;除法(/)则好比通过沟通与理解来化解分歧或达成共识;取余操作符(%)像是在日常生活的小细节中发现惊喜,找到彼此个性的独特之处。

移位操作符则是更为精密的情感调控机制:左移操作符(<<)可以类比为共同成长中对对方潜力的激发与信任;右移操作符(>>)就如同在适当的时候给予对方空间和独立性,让关系得到平衡与舒展。

通过熟练掌握这些C语言操作符的运用,程序员能够更精准地控制程序流程,正如在追求爱情的过程中,巧妙运用各种“小手段”,有助于我们更好地建立和维护人际关系,从而抵达真爱的彼岸。

相关文章
|
8月前
|
C语言
C语言中条件操作符的应用
最后,条件操作符是个超级英雄,但不是每个代码问题都需要一个超级英雄来解决。一定要在适当的时候适度的使用它,那么它将成为你的编程工具箱中的一件强力工具。
422 75
|
10月前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
9月前
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生&lt;audio&gt;标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
422 12
|
10月前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
9月前
|
Java 关系型数据库 数据库连接
Javaweb之Mybatis入门程序的详细解析
本文详细介绍了一个MyBatis入门程序的创建过程,从环境准备、Maven项目创建、MyBatis配置、实体类和Mapper接口的定义,到工具类和测试类的编写。通过这个示例,读者可以了解MyBatis的基本使用方法,并在实际项目中应用这些知识。
233 11
|
9月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
11月前
|
存储 编译器 C语言
【C语言程序设计——入门】C语言入门与基础语法(头歌实践教学平台习题)【合集】
本文档介绍了C语言环境配置和编程任务,主要内容包括: - **C语言环境配置**:详细讲解了在Windows系统上配置C语言开发环境的步骤。 - **第1关:程序改错**:包含任务描述、相关知识(如头文件引用、基本语法规则)、编程要求、测试说明及通关代码。 - **第2关:scanf函数**:涉及`scanf`和`printf`函数的格式与使用方法,提供编程要求、测试说明及通关代码。 文档结构清晰,涵盖从环境搭建到具体编程任务的完整流程,适合初学者学习和实践。
396 4
|
11月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
308 1
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
1003 14
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
3623 6

推荐镜像

更多
  • DNS