当前位置: 首页 > news >正文

嵌入式:第一天(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.14int 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或0xprintf("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有一个为真,则结果为真,二者都为假时,结果为假。

 

相关文章:

  • 基于Java+SpringBoot+Vue实验室安全考试系统(源码+文档+部署+讲解)
  • Linux函数学习 fork
  • RabbitMQ3.13.x之六_RabbitMQ使用场景
  • 【算法-数组】二分查找法
  • (27)4.8 习题课
  • 深入浅出 -- 系统架构之微服务架构选型参考图
  • 数字化智慧养老:引领老年人融入科技时代新生活
  • Ant Design Vue 表单验证手机号的正则
  • c#编程基础学习之方法
  • maven: 标签总结
  • 雄安建博会:中矿雄安新区的总部开工建设
  • Windows下docker-compose部署DolphinScheduler
  • 【原创】springboot+vue校园疫情防控管理系统设计与实现
  • 终极数据传输隐秘通道
  • 【鸿蒙开发】组件状态管理@Prop,@Link,@Provide,@Consume,@Observed,@ObjectLink
  • JS 中的深拷贝与浅拷贝
  • 77. Combinations
  • android图片蒙层
  • CentOS 7 修改主机名
  • JS数组方法汇总
  • learning koa2.x
  • Next.js之基础概念(二)
  • PHP的Ev教程三(Periodic watcher)
  • Python_OOP
  • React16时代,该用什么姿势写 React ?
  • spring boot 整合mybatis 无法输出sql的问题
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue.js框架原理浅析
  • 初识 beanstalkd
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 世界上最简单的无等待算法(getAndIncrement)
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​一些不规范的GTID使用场景
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (四)Controller接口控制器详解(三)
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)认识微服务
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)http协议
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .CSS-hover 的解释
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net 知识杂记
  • .NetCore项目nginx发布
  • .NET开源快速、强大、免费的电子表格组件
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @Bean有哪些属性
  • @JSONField或@JsonProperty注解使用
  • [ solr入门 ] - 利用solrJ进行检索
  • [4.9福建四校联考]
  • [AX]AX2012 SSRS报表Drill through action
  • [C#]DataTable常用操作总结【转】