嵌入式:第一天(c语言入门)

目录

一、C语言是什么

二、基础语法

2.1 第一个C语言程序

2.2 注释

2.3 数据类型

数据类型介绍:

变量:

变量的语法:

使用特点:

命名规则和规范:

命令规范:

char类型:

Boolean类型:

数据类型长度(大小):

可移植的类型:

常量:

2.4 数值表示

C语言如何表示相应进制数:

数值存储方式:

2.5 输入输出

输出:

输入:

2.6 运算符

算术运算符:

赋值运算符:

 比较运算符:

逻辑运算符:


一、C语言是什么

C语言是计算机编程语言的一种,编程语言用于人和机器交流。

编程语言通过一系列的语法和语义规则来描述计算机程序的行为和逻辑,程序员使用编程语言编写程序后,计算机可以将程序转化为二进制指令(即机器码),并由CPU执行,CPU会按照指令的顺序依次执行每个指令。


二、基础语法

2.1 第一个C语言程序

#include <stdio.h>

int main() {
    printf("hello world\n");

    return 0;
}
  • include头文件包含
#include <stdio.h>

这行代码是预处理指令,它告诉编译器包含标准输入输出头文件(stdio.h)。这个头文件包含了用于输入/输出功能(如printfscanf)的函数和宏定义。

  • main函数
int main()

这是main函数的开始。在C语言中,程序的执行从main函数开始。main函数返回一个整数值(通常是int类型),这里返回的是0,表示程序正常退出。

  • printf函数
printf("hello world\n");

这行代码调用printf函数,该函数用于格式化输出。在这里,它输出字符串“hello world”和一个换行符\n。这意味着在输出“hello world”之后,光标会移动到下一行。

  • return语句
return 0;

这行代码表示main函数执行完毕,并返回整数值0。在大多数操作系统中,返回0表示程序成功执行,而非零值通常表示某种错误或异常情况。


2.2 注释

  • 注释
    • 对代码的解释和说明
  • 特点
    • 不会被执行
  • 目的
    • 让人们能够更加轻松地看懂代码
  • 分类
    • 行注释 //
      • 快键键 ctrl+/
    • 块注释 /**/
      • 快键键 shift+alt+a
#include <stdio.h>

int main() {
    // 行注释
    /*
        块注释
    */
    printf("hello world\n");

    return 0;
}

 2.3 数据类型

数据类型介绍:
  • 数据类型:c语言中数据类型有3种,分别是基本数据类型、构造数据类型、指针数据类型。

变量:
变量的语法:
  • 在计算机程序中,变量是用来存储数据的一个内存区域,并用一个名字来表示这个区域。
使用特点:
  • 变量在使用前必须先定义,定义变量前必须有相应的数据类型
  • 在程序运行过程中,其值可以改变
#include <stdio.h>

int main() {
    // 1. 定义1个int变量age同时赋值为18(这叫初始化),然后打印内容
    int age = 18;
    printf("%d\n", age);
    // 2. 修改age的内容为20,然后打印内容
    age = 20;
    printf("%d\n", age);
    // 3. 定义2个int变量,然后在分别赋值,然后再打印内容
    int a, b;
    a = 123;
    b = 256;
    printf("%d\n", a);
    printf("%d\n", b);
    // 4. 定义1个float类型变量height同时赋值,然后打印内容
    float height = 1.77;
    printf("%f\n", height);

    return 0;
}
命名规则和规范:
  • 规则说明:
    • 只能由数字、字母、下划线_组成;
      • 不能使用数字开头;
      • 不能使用关键字;
      • 变量名之间大小写是区分的;
命令规范:

可以不遵循,只是一个建议,建议见名知意

  • 风格:

    • 大驼峰

      • 每个单词首字母大写, 例如: MyFirstName

    • 小驼峰

      • 第二个单词开始首字母大写, 例如: myFirstName

    • 下划线命名

      • 每个单词之间使用下划线连接, 例如: my_first_name

char类型:
  • char的本质就是一个1字节大小的整型,一个字符对应一个ASCII 编码数字

#include <stdio.h>

int main() {
    // 定义一个char类型变量,同时赋值为97,分别用%d,%c打印结果
    char ch = 97;
    printf("%d\n", ch);
    printf("%c\n", ch);
    // 定义一个char类型变量,同时赋值为'a',分别用%d,%c打印结果
    char ch2 = 'a';
    printf("%d\n", ch2);
    printf("%c\n", ch2);

    return 0;
}
Boolean类型:
  • 布尔类型是一种处理逻辑的类型,其有两个值,分别是真(true)或假(false),它在内存中的长度一般只占用1个字节。

  • 早期C语言没有布尔类型数据,以0代表逻辑假,非0代表逻辑真

  • C99标准定义了新的关键字_Bool,提供了布尔类型,或者也可以使用stdbool.h中的bool

#include <stdio.h>
#include <stdbool.h>

int main() {
    // 定义一个bool类型变量,同时赋值为true,然后打印变量的值
    bool flag = true;
    printf("%d\n", flag);

    // 修改上一步变量的值为false,然后打印变量的值
    flag = false;
    printf("%d\n", flag);

    return 0;
}
数据类型长度(大小):
  • bit(比特)

    • 一个二进制代表一位,一个位只能表示0或1两种状态。

  • Byte(字节)

    • 一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。

  • 使用sizeof查看数据长度 ○ 长度在不同平台是不一样。

#include <stdio.h>

int main() {
    // 通过sizeof打印各种类型的长度(大小)
    printf("char length = %d\n", sizeof(char));
    printf("short length = %d\n", sizeof(short));
    printf("int length = %d\n", sizeof(int));
    printf("long length = %d\n", sizeof(long));
    printf("float length = %d\n", sizeof(float));
    printf("double length = %d\n", sizeof(double));
    printf("long double length = %d\n", sizeof(long double));

    // 定义int类型变量,sizeof打印变量的大小
    int a;
    printf("a length = %d\n", sizeof(a));

    return 0;
}
可移植的类型:
  • C语言在可移植类型头文件 stdint.h 和 inttype.h 中规定了精确宽度整数类型,以确保C语言的类型在各系统内功能相同。
  • 作用:为了保障各个平台的数据类型相同。
#include <stdio.h>
#include <inttypes.h>

int main() {
    // 8位整型
    int8_t a=127;
    printf("%d\n", sizeof(a));

    // 16位整型
    int16_t b = 127;
    printf("%d\n", sizeof(b));

    // unsigned 无符号,没有符号位,数值为正数
    uint8_t c = 255;
    uint16_t d = 200;

    return 0;
}

nt8_t 的取值范围是:

  • 最小值:-2^(8-1) = -2^7 = -128
  • 最大值:2^(8-1)-1 = 2^7-1 = 127

所以,int8_t 的范围是 -128 到 127

 int16_t 的取值范围是:

  • 最小值:-2^(16-1) = -2^15 = -32768
  • 最大值:2^(16-1)-1 = 2^15-1 = 32767

所以,int16_t 的取值范围是 -32768 到 32767

uint8_t的取值范围:

  • 最小值:0(所有位都是0)
  • 最大值:255(所有位都是1)

所以,uint8_t的取值范围是0 到 255。

uint16_t的取值范围:

  • 最小值:0(所有位都是0)
  • 最大值:65535(所有位都是1)

所以,uint16_t的取值范围是 0 到 65535。

因为uint8_t和uint_16是无符号的,所以它不能表示负数。

常量:

与变量不同,常量的值在程序运行时不会改变。

在赋值之后不能修改,否则报错。

定义常量的两种方式:

// 预处理常量
#define PI 3.14

// const常量
const double pi2 = 3.14;

示例:

#include <stdio.h>
// 预处理常量
#define PI 3.14

int main() {
    // const常量
    const double pi2 = 3.14;

    // 常量不能修改,以下代码是错误的
    PI = 3.33;
    pi2 = 3.33;

    return 0;
}

 2.4 数值表示

C语言如何表示相应进制数:

十进制

以正常数字1-9开头,如15

八进制

以数字0开头,如017

十六进制

以0x或0X开头,如0xf

二进制

以0b或0B开头,如0b1111

#include <stdio.h>

int main() {
    // 十进制方式赋值
    int a = 15;
    // 八进制方式赋值
    int b = 017;
    // 十六进制方式赋值
    int c = 0xf;
    // 二进制方式赋值
    int d = 0b1111;
    printf("%d, %d, %d, %d\n", a, b, c, d);

    return 0;
}
数值存储方式:
  • 在计算机系统中,数值一律用补码来存储

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

  • 对于负数,其补码为它的反码加1

    • 负数的补码符号位不动,其他位求反,最后整个数加1,得到原码

原码

原码:一个数的原码就是它的二进制表示,其中最高位是符号位(0表示正,1表示负)。

十进制原码
50000 0101
100000 1010
00000 0000
-11000 0001
-51000 0101

反码

对于正数,反码与原码相同,对于负数,符号位不变,其它部分取反(1变0,0变1)。

十进制原码反码
50000 01010000 0101
100000 10100000 1010
+00000 00000000 0000
-11000 00011111 1110
-51000 01011111 1010

补码(重点)

在计算机系统中,数值一律用补码存储。

十进制原码反码补码
50000 01010000 01010000 0101
100000 10100000 10100000 1010
+00000 00000000 00000000 0000
-11000 00011111 11101111 1111
-51000 01011111 10101111 1011
  • 计算机的基石-补码

对于一个字节(8 位),他所能表示的范围有多大呢?所有可能编码如下,共 256种。

11111111
11111110
********
********
00000011
00000010
00000001
00000000
  • 补码的编码规则

如何来利用这些硬件的基础来表示我们需要的数据范围呢?就是编码。

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

  • 补码的运算

    1. 正整数的补码是其二进制表示,与原码相同

    2. 求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0 变 1,1变 0)后加 1。

  • 转换关系

  1. 原码表示方法:最高位为符号位,1表示负数,0表示正数。其余比特位表示数值。

  2. 反码表示方法:正数的反码是其本身,负数的反码为在原码的基础上,符号位不变,其余位取反。

  3. 补码表示方法:正数的补码就是其本身,负数的补码为在原码的基础上,符号位不变,其余位取反,再+1(即在反码的基础上+1)


2.5 输入输出

输出:
  • 输出:将程序的运行结果输出到控制台或终端窗口中
  • printf语法格式
int printf (const char *format, ...);
    • format参数是一个格式化字符串,包含了输出的格式控制信息
    • 后面的参数...是可变参数,参数(要输出的数据)长度不固定
  • 格式化占位符

打印格式

对应数据类型

含义

%c

char

字符型,输入的数字按照ASCII码相应转换为对应的字符

%hd

short int

短整数

%hu

unsigned short

无符号短整数

%d

int

接受整数值并将它表示为有符号的十进制整数

%u

unsigned int

无符号10进制整数

%ld

long

接受长整数值并将它表示为有符号的十进制整数

%f

float

单精度浮点数

%lf

double

双精度浮点数

%e,%E

double

科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写

%s

char *

字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)

%p

void *

以16进制形式输出指针

%o

unsigned int

无符号8进制整数

%x,%X

unsigned int

无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF

示例代码: 

#include <stdio.h>

int main() {
    // 定义变量
    char c = 'A';
    short s = 10;
    int i = 10;
    long l = 10;
    float f = 1.123456789123456789;
    double d = 1.123456789123456789;
    unsigned int ui = 20;
    char *name = "bill";
    
    // 格式化输出
    // 整型
    printf("c=%d\n", c);
    printf("s=%hd\n", s);
    printf("i=%d\n", i);
    printf("l=%ld\n", l);
    // 浮点类型
    printf("f=%.10f\n", f);
    printf("d=%.20lf\n", d);
    // 无符号数据
    printf("u=%u\n", ui);
    // 八进制和十六进制 可以加上前缀# 自动输出八进制和十六进制0或0x
    printf("o=%#o\n", 120);
    printf("x=%#x\n", 120);
    // 字符串类型
    printf("s=%s\n", name);
    // 内存地址
    printf("ps=%p\n", &s);

    return 0;
}
输入:
  • 输入:接收用户输入的数据的过程
  • scanf语法格式
scanf("格式化字符串", &变量1, &变量2,...);
    • 格式化字符串用于指定输入的数据类型及其格式
    • 变量1、变量2等是要读入的变量的地址

示例代码:

#include <stdio.h>

int main() {
    // 定义int类型变量age,通过scanf输入内容,然后打印内容
    int age;
    printf("请输入年龄:");
    scanf("%d", &age);
    printf("age = %d\n", age);

    return 0;
}

 2.6 运算符

算术运算符:

运算符

术语

示例

结果

+

10 + 5

15

-

10 - 5

5

*

10 * 5

50

/

10 / 5

2

%

取模(取余)

10 % 3

1

++

前自增

a=2; b=++a;

a=3; b=3;

++

后自增

a=2; b=a++;

a=3; b=2;

--

前自减

a=2; b=--a;

a=1; b=1;

--

后自减

a=2; b=a--;

a=1; b=2;

赋值运算符:

运算符

术语

示例

结果

=

赋值

a=2; b=3;

a=2; b=3;

+=

加等于

a=0; a+=2;

等同于 a = a + 2;

a=2;

-=

减等于

a=5; a-=3;

等同于 a = a - 3;

a=2;

*=

乘等于

a=2; a*=2;

等同于 a = a * 2;

a=4;

/=

除等于

a=4; a/=2;

等同于 a = a / 2;

a=2;

%=

模等于

a=3; a%=2;

等同于 a = a % 2;

a=1;

 比较运算符:

C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。

运算符

术语

示例

结果

==

相等于

4 == 3

0

!=

不等于

4 != 3

1

<

小于

4 < 3

0

>

大于

4 > 3

1

<=

小于等于

4 <= 3

0

>=

大于等于

4 >= 1

1

逻辑运算符:

运算符

术语

示例

结果

!

!a

如果a为假,则!a为真;

如果a为真,则!a为假。

&&

a && b

如果a和b都为真,则结果为真,否则为假。

||

a || b

如果a和b有一个为真,则结果为真,二者都为假时,结果为假。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-04-08

作业要求&#xff1a; 1> 思维导图 2>使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否…

vue项目中使用html2canvas 下载当前页面(动态页面宽度、高度)

老规矩先上效果图: 需求1、 只要上图红色区域的内容下载&#xff0c;就需要计算红色区域的内容的动态宽度、高度。 需求2、当前页面可视区域的内容下载&#xff0c;上传按钮下面的所有内容。 一、 安装依赖 &#xff1a;安装html2canvas插件 npm isntall html2canvas 或者…

[渗透利器]在线渗透测试工具箱?测评

前言 hxd更新完了在线工具箱&#xff0c;受邀写一下使用体验以及测评 使用体验 这个工具箱设计的比较轻便&#xff0c;以往用过的工具箱大多都是以离线打包的方式发布&#xff0c;该工具箱&#xff0c;作者自己掏钱自己买服务器&#xff0c;自己买带宽&#xff0c;先生大义。…

[闲聊统计]之参数估计是什么?(下)

我们在前面说了一下参数估计中的点估计&#xff0c;接下来&#xff0c;我们来讲一下区间估计。 区间估计——在点估计的基础上&#xff0c;给出总体参数估计的一个估计区间&#xff0c;该区间由样本统计量加减估计误差而得到。 置信水平——如果将构造置信区间的步骤重复多次&a…

三:synchronized 关键字

目录 1、共享带来的问题2、synchronized 用法3、类加载器对 Class 锁的影响4、synchronized 实现原理4.1、同步方法、同步代码块4.2、对象内存布局4.3、Monitor 对象定义 5、synchronized 与原子性6、synchronized 与可见性7、synchronized 与有序性8、synchronized 锁升级8.1、…

UDS(ISO14229) ———— 0x10(DiagnosticSessionControl)

前言 在UDS协议中,我们首先接触到的是诊断和通信管理功能单元(Diagnostic and communication management functional unit)模块。在这个模块里面,DiagnosticSessionControl是我们第一个需要掌握的内容。 按照ISO 14229上面的划分,我们可以将诊断会话模式分为两大类; 一类…

Pytest精通指南(02)对比Unittest的差异

文章目录 前言用例编写规则不同用例前置与后置条件不同断言功能不同测试报告失败重跑机制参数化用例分类执行Unittest 前后置示例Pytest 前后置示例总结 前言 在Python中&#xff0c;unittest和pytest是两个主流的测试框架&#xff1b; 它们都旨在支持自动化测试、使用断言验证…

通信分类3G,4G,5G,通信专用名词

Generation: 2G: GSM全名为&#xff1a;Global System for Mobile Communications&#xff0c;中文为全球移动通信系统&#xff0c;俗称"全球通"&#xff0c;是一种起源于欧洲的移动通信技术标准&#xff0c;是第二代移动通信技术 3G&#xff1a;WCDMA 4G&#xff1a…

C++奇迹之旅:探索类对象模型内存的存储猜想

文章目录 &#x1f4dd;前言&#x1f320; 类的实例化&#x1f309;类对象模型 &#x1f320; 如何计算类对象的大小&#x1f309;类对象的存储方式猜想&#x1f320;猜想一&#xff1a;对象中包含类的各个成员&#x1f309;猜想二&#xff1a;代码只保存一份&#xff0c;在对象…

特征融合篇 | RTDETR引入基于内容引导的特征融合方法 | IEEE TIP 2024

本改进已集成到 RT-DETR-Magic 框架。 摘要—单幅图像去雾是一个具有挑战性的不适定问题,它从观察到的雾化图像中估计潜在的无雾图像。一些现有的基于深度学习的方法致力于通过增加卷积的深度或宽度来改善模型性能。卷积神经网络(CNN)结构的学习能力仍然未被充分探索。本文提…

Prometheus+grafana监控nacos和spring-boot服务(增加自定义指标)(七)

前面记录了项目中常用的各种中间件的指标采集器的用法及搭建方式 &#xff0c; 由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前六篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana…

【3GPP】【核心网】核心网/蜂窝网络重点知识面试题二(超详细)

1. 欢迎大家订阅和关注&#xff0c;3GPP通信协议精讲&#xff08;2G/3G/4G/5G/IMS&#xff09;知识点&#xff0c;专栏会持续更新中.....敬请期待&#xff01; 目录 1. 对于主要的LTE核心网接口&#xff0c;给出运行在该接口上数据的协议栈&#xff0c;并给出协议特征 2. 通常…

电压继电器SRMUVS-220VAC-2H2D 导轨安装 JOSEF约瑟

系列型号&#xff1a; SRMUVS-58VAC-2H欠电压监视继电器&#xff1b;SRMUVS-100VAC-2H欠电压监视继电器&#xff1b; SRMUVS-110VAC-2H欠电压监视继电器&#xff1b;SRMUVS-220VAC-2H欠电压监视继电器&#xff1b; SRMUVS-58VAC-2H2D欠电压监视继电器&#xff1b;SRMUVS-100…

python爬虫 爬取网页图片

http://t.csdnimg.cn/iQgHw //爬虫爬取图片其实是很简单的&#xff0c;但是大多数同学&#xff0c;可能对 url的设置一直有困惑&#xff08;这点本人也在研究&#xff09;&#xff0c;而本篇文章&#xff0c;对于想要爬取图片的小白简直是福利。你只需要将文章代码运行即可&am…

自动化测试面试题及答案大全

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【YOLOv9】完胜V8的SOTA模型Yolov9(论文阅读笔记)

官方论文地址: 论文地址点击即可跳转 官方代码地址: GitCode - 开发者的代码家园 官方代码地址点击即可跳转 1 总述 当输入数据经过各层的特征提取和变换的时候,都会丢失一定的信息。针对这一问题:

顺序表讲解

一.数据结构 在学习顺序表之前&#xff0c;我们先需要了解什么是数据结构。 1.什么是数据结构呢&#xff1f; 数据结构是由“数据”和结构两词组合而来。 什么是数据呢&#xff1f; 你的游戏账号&#xff0c;身份信息&#xff0c;网页里的信息&#xff08;文字&#xff0c…

onSaveInstanceState()与onRestoreInstanceState()

目录 1.二者作用 2.onSaveInstanceState调用时机 2.1 五种情况 前4种情况Activity生命周期&#xff1a; 2.2 注意事项&#xff1a;确定会被系统回收并销毁&#xff0c;不会调用此方法 两个例子 3.onRestoreInstanceState调用时机 3.1实例——屏幕切换生命周期 3.2 极端…

Python实现读取dxf文件的所有字符

Python实现读取dxf文件的所有字符 import ezdxfdef read_dxf_and_print_text(filename):# 加载DXF文件doc ezdxf.readfile(filename)# 遍历所有的实体for entity in doc.entities:# 检查实体是否是TEXT、MTEXT或DIMENSIONif isinstance(entity, ezdxf.entities.Text):print(f…

初识--数据结构

什么是数据结构&#xff1f;我们为什么要学习数据结构呢....一系列的问题就促使我们不得不了解数据结构。我们不禁要问了&#xff0c;学习C语言不就够了吗&#xff1f;为什么还要学习数据结构呢&#xff1f;这是因为&#xff1a;数据结构能够解决C语言解决不了的问题&#xff0…