C语言预备知识_hello world_数据类型_变量(入门到入神)

2024-01-06 19:36

本文主要是介绍C语言预备知识_hello world_数据类型_变量(入门到入神),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么要学习 C语言

  • 学习 C语言是非常接近底层的一种编程语言
  • C语言是学习其它编程语言第基础,基础不牢,地动山摇
  • 考研会用到 C语言

C语言预备知识

CPU 内存条 硬盘 显卡 主板 显示器之间的关系
当你在电脑上观看一部存储在硬盘上的电影时,各个组件之间会进行一系列的交互和协作。下面是一个简化的流程来说明这个过程:

  1. 数据存储(硬盘):电影文件以数字格式存储在硬盘上。硬盘是一个持久的数据存储设备,可以保存文件,即使电脑关闭也不会丢失。
  2. 数据加载(操作系统):当你通过双击电影文件图标或执行播放命令时,操作系统会接收到这个请求。操作系统会与硬盘进行通信,将电影数据从硬盘加载到内存条中。这一步的目的是让CPU能够快速访问和处理这些数据。
  3. 数据处理(CPU):CPU接收到从内存条中传递过来的电影数据,并开始执行播放指令。CPU会处理这些数据,执行相应的计算和操作,以播放电影。CPU处理的数据可能包括解码视频、处理音频、同步视频和音频等任务。
  4. 图像生成(显卡):显卡接收到CPU处理后的数据,并将其转换成图像。显卡内部有一个图形处理单元(GPU),能够快速处理大量的图像数据。显卡将图像数据发送到显示器上显示出来,使得用户可以看到电影的图像部分。
  5. 声音播放(声卡):电影的声音数据也会被处理并播放出来。声卡(通常集成在显卡上)负责处理声音数据,并通过电脑的音响系统播放出来。
  6. 输出显示(显示器):显示器是最终的输出设备,它显示显卡发送的图像。用户通过显示器观看电影的图像和听到声音。

硬盘: 硬盘是电脑的主要数据存储设备,它永久保存了操作系统、应用程序、文件和数据等。当需要读取或写入数据时,硬盘通过主板与电脑的其他组件进行通信。
内存条: 内存条是一个高速的存储区域,使得CPU可以快速访问数据。当电脑需要执行一个任务时,相关的数据首先被加载到内存中,这样CPU就可以快速读取和处理这些数据。
CPU: CPU(中央处理器)是电脑的“大脑”。它执行操作系统、应用程序和用户指令。CPU处理内存中的数据,执行计算和操作,以完成各种任务。
显卡: 显卡负责将CPU处理后的数据转换成图像。显卡内部有一个图形处理单元(GPU),它能快速处理大量的图像数据,并将其发送到显示器进行显示。显卡还负责处理与图形相关的计算任务,如游戏、3D建模等。
主板: 主板是一个电路板,连接和支撑了电脑的所有主要组件。主板上安装了各种插槽、接口和连接器,使得各个组件能够相互通信和协同工作。
显示器: 显示器是最终的输出设备,它显示显卡发送的图像。显示器将图像显示给用户,使得用户可以看到电脑的处理结果。

在电影播放的场景中:

  • 电影文件首先储存在硬盘上。
  • 当用户双击电影文件时,操作系统将电影数据从硬盘加载到内存条中。
  • CPU开始处理这些数据,执行播放指令。
  • 显卡接收到CPU的处理结果,将数据转换成图像,并通过显示器显示出来。
  • 声音数据则通过声卡(集成在显卡上)播放出来。

通过这些组件的协同工作,用户可以观看到电影的图像和听到声音。这种协同工作使得电脑成为一个功能强大的工具,可以进行各种任务,如办公、娱乐、游戏、设计等。
在这个过程中,各个组件之间的通信和协同工作是至关重要的。它们共同协作,使得电影能够流畅地播放出来。当然,这只是一个简化的流程,实际的过程可能更加复杂,涉及更多的细节和技术。

hello world 是如何被运行的

#include <stdio.h>int main(void){printf("hello world");return 0;
}

image.png

  • 写好代码后,通过编译和链接,会生成一个后缀为 .exe的可执行文件
  • 执行这个 .exe文件是由操作系统调用 CPU 去执行的

底层硬件的执行涉及到计算机的物理结构和工作原理。当我们编译和执行上面的C代码时,它会在底层硬件上经历一系列的步骤。以下是这些步骤的简化概述:

  1. 编译过程:
  • 预处理:编译器首先会解析预处理器指令。在此代码中没有使用到预处理器指令,所以这个步骤比较简单。
  • 编译:编译器将C代码转换为汇编代码。
  • 汇编:汇编器将汇编代码转换为机器语言代码。
  1. 链接过程:链接器将编译得到的多个目标文件组合在一起,形成一个可执行文件。在这个简单的例子中,只有一个目标文件,所以链接过程相对简单。
  2. 执行过程
  • 加载:操作系统将可执行文件加载到内存中。
  • CPU执行:CPU开始执行内存中的机器语言指令。对于printf函数,这涉及到CPU执行相应的指令来控制计算机的I/O操作,即将文本输出到显示器或控制台。
    • CPU执行指令时,需要与内存、硬盘、显卡等其他硬件设备进行通信,读取和写入数据。
    • 对于printf函数,它通常涉及到与操作系统的底层交互,以将输出发送到显示器或控制台。
  1. 返回:程序执行完毕后,返回0表示程序正常结束。

数据类型

就像数学上对数字进行分类(整数、分数、有理数、无理数……)一样,C语言也将变量进行不同的分类。
int i =1表示 i 变量是整型变量,所谓整型变量就是只能存放整数的变量

基本数据类型

  • 整数
    • 整型–int(一般 4 个字节)
    • 短整型–short int(一般 2 个字节)
    • 长整型–long int(一般 8 个字节)
  • 浮点数
    • 单精度浮点数 float(一般 4 个字节)
    • 双精度浮点数 double(一般 8 个字节)
  • 字符
    • char(1 个字节) --C语言里面没有一个数据类型可以存储一个字符串,char 是存储单个字符的数据类型

复合数据类型

  • 结构体
  • 枚举
  • 共用体

结构体、枚举,后面会讲
共用体,已经被淘汰掉了

变量

什么是变量

变量的本质:内存中的一端存储空间
变量,可以理解为存储数据的容器
变量的定义就是向内存申请一块空间(容器)作为变量,并将变量名作为这块空间的名字
变量的初始化就是对变量进行赋值
image.png
int i;i=1等价于 int i=3;
对下面的代码进行讨论和学习:
image.png

这里主要看** ****int i****i=1**,**printf**的用法后面详细讲解

  • **int i;i=1;**在内存中找了一块空间,将这块空间命名为** i,然后在这个叫做 i **的空间里放上了数据 3。程序运行结束,3 所占的空间会被释放掉。

“释放”指的是,这块空间的使用权限被放掉了,被转交给其他程序使用

image.png
为什么要使用变量?
如果不使用变量,就必须程序员自己去找内存里的空闲单元。内存里面有很多存储单元,每个存储单元都有一个编号。如果要定义 1000 个变量,把这 1000 个编号都记住几乎是不可能的。

为什么变量必须初始化

所谓初始化,就是赋值的意思

#include <stdio.h>int main(void){int i;//i=1;printf("i=%d\n",i);return 0;
}

这段代码,没有对变量进行初始化就将其输出

这样,其输出结果将会是一个不确定的值、随机的值、意想不到的值、没有用的垃圾值

注意:虽然理论上i的初始值是不确定的,但实际上在许多编译器和平台上,会被初始化为0。这就是为什么你每次运行结果都得到0的原因。

软件运行与内存的关系(垃圾数据)
内存是在操作系统的统一管理下使用的!

  1. 软件在运行前需要向操作系统申请存储空间,在内存空间足够的时候,操作系统将分配一端内存空间并将外存中软件复制一份存入到该内存空间中,并启动该软件的运行。
  2. 在软件与运行期间,该软件所占用的内存空间并不在分配给其他软件。
  3. 当软件运行完毕后,操作系统将回收该内存空间(注意:操作系统并不清空该内存空间中遗留的数据,而是释放掉该内存空间的使用权),以便再次分配给其他软件使用。

综上所述,一个软件所分配到的空间极有可能存在着其他软件使用过后的残留数据,这些数据就被称为“垃圾数据”。

那么,为什么 [ 输出结果将会是一个不确定的值、随机的值、意想不到的值、没有用的垃圾值 ] 呢?
image.png
以下内容目前较难理解,暂时先放在这里:
这个变量没有被初始化赋值,变量里也没有之前程序遗留的数据,那么硬要输出,会输出什么?

在这种情况下,如果变量没有被初始化赋值,且没有之前程序遗留的数据,那么输出的结果将是未定义的。由于局部变量的初始值是不确定的,所以在这种情况下,你无法预测程序将输出什么结果。在C语言中,未初始化的局部变量具有未定义的值,这意味着它们的值是不确定的。因此,如果你尝试输出一个未赋值的局部变量的值,结果将是不可预测的,每次运行都可能得到不同的值。为了避免这种情况,你应该始终给变量赋一个初始值或在使用之前给它赋值。

没有被初始化赋值,变量里也没有之前程序遗留的数据,为什么还会输出一个值?这个不确定的值是哪里来的?

这个不确定的值是由于局部变量的内存分配和初始化机制导致的。在C语言中,当程序运行时,栈内存用于存储局部变量和函数调用的信息。每个局部变量都有其自己的内存地址,但是它们的初始值是不确定的,取决于它们所在内存位置上之前的数据。
即使变量之前没有遗留数据,由于栈内存的特性,该变量所在的内存地址可能包含之前其他变量的值或者垃圾数据。当程序试图读取这个未初始化的变量时,它将输出这个内存地址上的值,即之前存储在那里的数据。
因此,即使变量没有被显式初始化赋值,也可能会有一些不确定的值,因为它的初始值取决于它所在内存位置上之前的数据。为了避免这种情况,程序员应该始终给变量赋一个初始值或在使用之前给它赋值。这样可以确保变量的值在我们使用它之前是已知的,并且不会输出不确定的值。

局部变量吗?全局变量会如何?

对于全局变量,情况会有所不同。全局变量是在程序的全局范围内定义的,它们在程序的整个生命周期中都存在。因此,全局变量的初始值通常取决于它们在内存中的位置和系统的默认初始化值。
在许多情况下,全局变量的初始值会被设置为0或空指针,但这并不是C语言强制要求的。实际上,全局变量的初始值是不确定的,取决于它们所在内存位置上之前的数据。
与局部变量不同的是,全局变量在程序开始执行时就被分配内存,并且在程序结束时才被释放。因此,全局变量的值在整个程序运行期间都保持不变,除非程序员显式地修改它们的值。
总之,无论是局部变量还是全局变量,都应该在使用之前进行初始化赋值,以确保它们的值在我们使用它们时是已知的,避免输出不确定的值。

这篇关于C语言预备知识_hello world_数据类型_变量(入门到入神)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577375

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识