C语言基础Day02数据类型及运算符

本文详细介绍了C语言的基础知识,包括词法符号中的关键字、标志符、运算符和分隔符,以及数据类型中的数值和非数值数据。讲解了整型、浮点型、布尔类型和void类型的特点与范围。此外,还涵盖了变量的概念、存储类型以及表达式和运算符的使用,如算术、逻辑、关系、赋值、递增递减运算符。最后,文章讨论了运算符优先级和位运算符的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、词法符号

  1. 概念:是程序设计语言中有若干字符组成的有意义的最小语法单位。

  2. 分类:

  • 从其作用分类:
    关键字:由C语言系统预先定义的一些单词,有其固定的作用和意义,不能随意变更。
    标志符:由编程人员自行定义命名的一些符号短语单词等,通常用于给变量、函数等命名。
    运算符:运算规则,对应的一些符号
    分隔符:对各个部分、区块进行分隔的符号://、/**/ # 空格
    标点符号:{}、()、;、,

(一)C关键字: 32个

auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsighed void volatile while

(二)标志符:

​ 命名规则:
​ 只能通过 字母 数字 和下划线组成 并且数字不能在首位

(三)运算符:

运算符分类运算符功能
算术预算符+加法运算
-减法运算
*乘法运算
/除法运算
%取模或求余运算
逻辑运算符&&逻辑与
||逻辑或
!逻辑非
关系运算符>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于
递增递减运算符++递增
递减
地址运算符&返回变量的地址
*指向一个变量
逗号运算符,连接两个表达式
sizeof运算符sizeof()求字节长度
三目运算符?:条件表达式

二、gcc

  1. gcc生成执行文件的步骤:
  • 预处理:将宏、头文件展开。.c文件——>.i文件
  • 编译:将C语言代码转换为汇编指令。.i文件——>.s文件
  • 汇编:将汇编指令转换为机器码。.s文件——>.o文件
  • 链接:将各个文件的机器码放到一起生成一个可执行文件。各个.o文件——>.out文件
  1. C文件类型与后缀名(C语言规范)
文件类型后缀名
C源码文件.c
C头文件.h
预处理后文件.i
汇编文件.s
二进制文件.o

三、数据

(一)数值数据

  1. 数值数据包括:整型、浮点型数据。
  2. 进制:数值 = 字符 * 权重的位置幂
  • 十进制:逢十进一。字符:0-9。
  • 二进制:值前加”0b",表示二进制数,逢二进一。字符:0和1。
  • 十六进制:值前加”0x“,表示十六进制数,逢十六进一。字符:0-9和a-f。
  • 八进制:值前加”0“,表示八进制数,逢八进一。字符:0-7。在文件权限上使用,rw-rw-r–,二进制表示:110110100,八进制表示:664。

​ 修改文件权限:chmod 权限八进制 文件名。

  • 十进制转换为二进制:
58 / 20
	29 / 21
		14 / 20
			7 / 21
				3 / 21
					1 / 21
						0
58 = 0b111010
0724 = 0b1 1101 100 = 468 = 0x01d4
0b1101 0011 = 0323 = 195 = 0xd3
256 = 0b1 0000 0000 = 0x0100

练习:

100瓶毒药内有一瓶是毒药,现在有8只实验小白鼠,每只小白鼠吃到毒药后,大约一小时后出现死亡,请问如何才能使鉴别时间最短?

步骤一:给100瓶药编号,并转换为二进制。

步骤二:让的i只老鼠,喝掉所有二进制中第i位为1的药

步骤三:一个周期后观察老鼠状态,第i只老鼠死了,说明毒药瓶子二进制的第i位是1(位置:从右往左1,2,3…),这样根据死了哪几只老鼠,就能得到二进制表示的哪几位是1了,进而最终可以得到毒药的标号。

(二)非数值数据

  1. 非数值数据包括:语言、文字、符号、图片、声音、逻辑关系等。

四、数据类型

(一)整型

  1. 范围:对应整数,-无穷~+无穷。

  2. 分类:int、short、char。

  • char:使用8bit,即一个字节来存储这个数。
    ​ 0b 0000 0000 ~ 0b 1111 1111即0~255,有256个数。
    ​ 有符号数:signed char,范围:-128 ~ +127
    ​ 无符号数:unsigned char,范围:0 ~ 255
  • short:使用16bit,即2个字节来存储这个数。
    ​ 16个0 ~ 16个1,范围:0~65535,有65536个数。
    ​ signed short,范围:-32768 ~ +32767
    ​ unsigned short,范围:0~65535
  • int:使用4个字节来存储这个数,32bit(32位编译器)。64bit(64位编译器)。
    32个0 ~ 32个1 即0~4294967295,有4294967296个数。
    有符号数:signed int
    无符号数:unsigned int
  1. 负数的表示:一个有符号数,则其存储空间的最高bit位表示这个数的正负,0代表正,1代表负,数在计算机中存储的是补码。

负数的源码、反码、补码

源码:负数的符号位 + 负数值的二进制表示

反码:源码求反

补码:源码求反加1

(二)浮点型

  1. 小数存储:小数的存储不是精确数,存储分3个部分。
  • 符号位:1bit
  • 指示位:8bit
  • 有效位:表示有效位数。
  1. 单精度浮点数(float):4字节,32bit
  • 符号位:1bit
  • 指示位:8bit
  • 有效位:表示有效位数,23bit,十进制七位。
  1. 双精度浮点数(double):8字节,64bit
  • 符号位:1bit
  • 指示位:11bit
  • 有效位:表示有效位数,52bit。
  1. C语言中,白哦是一份很大或很小的常量,写作科学计数法。

0.0000000000121 1.21e-11

1231240020406781000 1.2312400e+18

(三)布尔类型

  1. 真:True、非0
  2. 假:False、0

0.0 是真

(四)void类型

  1. 概念:空类型,修饰函数,无返回值或指针可以指向任意类型。

(五)常量

  1. 概念:写程序时,给定的一些值,在程序运行过程中,这些值不会发生改变。
  2. 字符常量:对文字的存储,如’w’、‘a’、'!'等。

计算机对字符存储是将字符按某种规则(编码)编号,变成数再存储。如英文、字母、数字、符号常使用ASII编码。中文:GBK、UTF-8编码。

  1. 字符串常量:如"hello world!",这中常用双引号括起来的被称为字符串。存储时字符串有一个特殊的符号’\0’,等同于数值0
  2. 标识符常量:对某个常量进行命名,在后代码中,出现这个标识符名字,都替换为对应的常量。又称宏定义。标识符常量在使用时,并不是调用的定义的表达式的值,而是原封不动地替换为该表达式。
#define PI 3.14
#define PI2 PI * PI

练习:

//一个水分子的质量约为3.0*10-23g,一夸克水大约有950g,编写一个程序,要求输入水分子的夸克数,然后显示这么多水中包含多少水分子。

#include <stdio.h>
#define QUALITY 3.0e-23
#define QUART 950

int main()
{
    float weight;
    scanf("%f",weight);
    weight = weight * QUART / QUALITY;
    printf("num:%e\n",weight);
    return 0;
}

五、变量

  1. 概念:对内存空间的命名,必须先定义再使用。
  2. 变量定义:

存储类型 数据类型 变量名;

  1. 存储类型:
存储类型描述
auto由编译器对变量的定义的位置等来自动设计变量的存储类型,通常auto可以省略。
register寄存器类型,当一个变量,使用非常频繁,可以声明这个变量使用寄存器存储类型。
const常量存储,存储变量到常量区,则这个变量的值不能修改。
extern外部引用变量,编译时不需要该变量分配内存空间。
static静态变量,编译时给变量分配静态区内存,静态区内存的特点:该区域的内存空间在程序开始运行时就分配好了,只有当程序结束(main退出),其空间才会被系统回收。

4.变量定义与初始化:变量的初始化是在被说明的同时赋给一个值。

存储类型 数据类型 变量名 = 对应类型的值;

<存储类型> <数据类型> <变量名> = <表达式>

表达式:就是由变量、常量、运算符按一定顺序构成的运算序列,表达式的值就是运算序列的结果。

int i = 0;
static double w = 100.56;
double result = 1;
double x = 5,y = x*2;//连续定义多个同类数据类型
register int count = 0;
auto double s = 0;
unsigned long int name = 664207250925157143295UL;
float f = 5.0f;
  1. 类型转换:
  • 显式的数据类型转换实现的一般形式:

(数据类型的名称) <表达式>

int a = 10;
float b = (float)a;//强制类型转换
int c = int(b);//转换会丢失小数部分,去尾法,不是四舍五入
  • 隐式类型转换:在某些情况下会自动执行类型转化,通常是向精度更高的转换。

六、表达式与运算符

  1. 表达式:就是由变量、常量、运算符按一定顺序构成的运算序列,表达式的值就是运算序列的结果。
  2. 运算符:对数据进行操作的动作,是一种告诉编译器执行特定的数学或逻辑操作的符号。

(一)算术运算符

  1. 算术运算符:主要用于算术运算的,算数运算符包括:+、-、、/、%,属于双目运算符,需要两个操作数(值或表达式)。+、-、、/:适用于数值,float、double;%:只适用于整型。
  2. 算术运算符的结果:结果是一个数值。

(二)逻辑运算

  1. 逻辑运算符包括:&&、||、!。
  2. 逻辑运算符的结果:结果是真1或假0。
运算符描述
&&逻辑与(有假为假)
||逻辑或(有真为真)
!逻辑非

(三)关系运算符

  1. 关系运算符:数值大小关系比较。包括:>、<、>=、<=、==、!=。
  2. 关系运算符的结果:结果是真1或假0。
运算符描述
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

(四)赋值运算符

  1. 赋值运算符:将右侧的值(表达式的值、变量的值、常量)赋值给左侧的变量。赋值运算符包括:=、+=、-=、*=、/=。
  2. 赋值运算符的结果:结果是一个数值。
运算符描述
=赋值
+=加运算后赋值
-=减运算后赋值
*=乘法运算后赋值
/=除法运算后赋值

(五)递增递减运算符

  1. 递增递减运算符:是单目运算符,只能与变量结合。
  2. 运算方法:
运算符描述
++a表达式的值为2,a的值为2
–a表达式的值为0,a的值为0
a++表达式的值为1,a的值为2
a–表达式的值为1,a的值为2

练习

设下列表达式都有int a = 1;一直++和-- 优先级高于+和-

表达式:(++a + 2);——a = 2 表达式的值为4

表达式:(a++ + 5);——a = 2 表达式的值为6

(六)位运算符

  1. 位运算符:只有整型
  2. 位运算符的运算规则:
运算符功能描述作用
&与:有0为0对整数的某些二进制位置0。
|或:有1为1对整数的某些二进制位置1。
^异或:相异为1对整数的某些二进制位取反。
~取反:翻转对整数的所有二进制位取反。
<<逻辑左移:高位舍弃,低位补0。左移n位,相当于除以2的n次方
>>逻辑右移:低位舍弃,高位补0。右移n位,相当于乘以2的n次方

(七)地址运算符

  1. 地址运算符:是单目运算符,包括:&(取地址运算)、*(指针取值运算)。
  2. 地址:变量在内存中的编号。

(&a)——表达式的值是a的地址,是地址类型或指针类型。

*(&a)——表达式的值是变量a的值,指针取值运算与取地址运算互为逆运算。指针运算符操作的数的数据类型为地址或地址类型变量(指针变量)。

(八)特殊运算符

  1. 逗号运算符:分隔表达式,优先级是最低的。逗号表达式:(表达式1,表达式2,……表达式n),其值为表达式n。
  2. sizeof()运算符:sizeof(变量名或数据类型);作用本质是计算变量对应的数据类型或给定的数据类型所占用的内存空间大小,且其计算再编译时完成。

示例:

int a;
sizeof(a);//等同于sizeof(int),表达式的值为4,代表4字节
  1. 三目运算符:
  • 结构:表达式1 ? 表达式2 : 表达式3;
  • 逻辑:如果表达式1为真,则整个表达式的值是表达式2的值,并且表达式3不会被执行。如果表达式1为假,则整个表达式的值是表达式3的值,并且表达式2不会被执行。
//a、b、c三个数中的做大的一个数,赋值给x
//三目运算符的嵌套:优先跟最近的结合
x = a > b ? (a > c ? a : c) : (b > c ? b : c)

(九)运算符优先级

  1. 运算符的优先级:

最高优先级的 特殊运算符、地址操作符、后缀++、–

二级 单目运算符

算术运算符 > 关系运算符 > 位运算符(单目运算符~除外)> 逻辑运算符(单目运算符!除外) > 三目运算符 > 赋值运算符 > 逗号运算符
在这里插入图片描述

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值