【C语言必知必会 | 第一篇】C语言入门,这一篇就够了

引言

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】系列第一篇,带你初步了解C语言,为之后的学习打下基础

在这里插入图片描述

文章目录

    • 1️⃣发展历史
    • 2️⃣语言特点
    • 3️⃣语言组成
    • 4️⃣总结


1️⃣发展历史

C语言起源于美国贝尔实验室的贝尔实验室,由丹尼斯·里奇和肯尼斯·汤普森于20世纪70年代初期开发而成。起初,他们使用B语言对UNIX操作系统进行了改进,并逐步将其重写成了C语言。

随着UNIX的发展,C语言也得到了不断的完善和推广。为了确立C语言的标准,许多专家、学者和硬件厂商参与组建了C语言标准委员会。1989年,他们发布了第一个完整的C语言标准,即ANSI C(C89)。

在这里插入图片描述

随后,C语言标准经历了多次修订和更新。1999年发布了C99标准,其中包含了一些新的特性和语法改进。2011年发布了C11标准,进一步扩展了C语言的功能和表达能力。

C语言以其简洁、高效、可移植性和广泛应用性而闻名。它成为了许多编程领域的首选语言,包括系统级编程、嵌入式系统开发、操作系统设计等。 许多重要的软件和工具,如UNIX、Linux和MySQL等,都是使用C语言开发的。

截至目前,在计算机科学和软件工程领域,C语言仍然是一门重要且广泛应用的编程语言,对后续语言的发展也产生了深远的影响。


2️⃣语言特点

C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作,因此既能够用于开发系统程序,也可用于开发应用软件。

C语言具有以下几个主要的语言特点:

1.C语言的语法相对简单,并且提供了一些核心的编程结构,使得程序员可以用更少的代码实现功能。C语言的底层控制和内存管理能力使其在编写高效的程序时具有优势。

2.C语言是一种面向过程的编程语言,它侧重于按照顺序执行一系列操作步骤,通过函数调用和模块化的方式组织代码。这种特点使得C语言非常适合系统级编程和底层开发。

在这里插入图片描述

3.可移植性强:C语言的标准化以及对底层硬件的直接访问使得它在不同平台和操作系统上具有很高的可移植性。C语言编写的程序通常可以在多个系统上进行编译和运行。

4.C语言提供了指针的概念,允许直接访问和操作内存地址。 这为程序员提供了更高的灵活性和对底层资源的直接控制能力。

在这里插入图片描述

5.C语言提供了广泛的标准库,包含了大量的函数和工具,可以方便地进行文件操作、字符串处理、内存分配等常见任务。

总而言之,C语言以其简洁高效可移植底层控制能力而闻名,成为广泛应用于系统级编程、嵌入式开发和底层软件开发的重要语言。


3️⃣语言组成

数据类型:

C语言中的数据类型用来定义变量的性质和存储空间的大小。常见的数据类型包括整型(int)浮点型(float、double)字符型(char),以及派生的复杂数据类型如结构体(struct)枚举(enum)等。

常量与变量:

在C语言中,常量是指在程序执行期间值不会改变的数据。常量可以是字面值(如整数、浮点数、字符等)或使用const关键字进行声明。变量是用于存储和表示可变数据的标识符。 在使用变量之前,需要先声明并指定其数据类型。

注意: 变量名是由字母、数字和下划线组成的标识符,且不能以数字开头。变量名区分大小写,例如myVariable和myvariable是不同的变量名。

数组:

数组是相同数据类型的元素按一定次序排列而成的集合。在C语言中,数组使用方括号[]来声明,并通过下标访问其中的元素。数组的大小在声明时确定,并且下标从0开始。

在这里插入图片描述

指针:

指针是用来存储变量地址的变量。通过指针,我们可以直接访问和操作内存中的数据。在C语言中,可以使用星号*来声明指针变量,并通过取地址运算符&获取变量的地址,或者通过解引用运算符*访问指针指向的值。

字符串:

字符串是由字符组成的数组,以空字符'\0'作为结束标志。在C语言中,可以使用字符数组或者指针来表示字符串,并通过一系列的字符串操作函数(如strcpy、strlen等)进行处理。

运算符:

C语言提供了各种各样的运算符,用于完成不同类型的运算任务。常见的运算符包括算术运算符(+、-、*、/等)、关系运算符(<、>、==等)、逻辑运算符(&&、||、!等)等。

算术运算符>逻辑运算符>赋值运算符

例如,表达式a + b * c中,乘法运算符的优先级高于加法运算符,所以先计算b * c,然后再与a相加。如果要先计算a + b,可以使用括号来改变优先级,如(a + b) * c

示例如下:

#include <stdio.h>int main() {int a = 10, b = 5, c = 2;int result;result = a + b * c;         // 优先级:乘法 > 加法printf("a + b * c = %d\n", result);result = (a + b) * c;       // 优先级:括号 > 加法 > 乘法printf("(a + b) * c = %d\n", result);result = a / b + c;         // 优先级:除法 > 加法printf("a / b + c = %d\n", result);result = a / (b + c);       // 优先级:括号 > 加法 > 除法printf("a / (b + c) = %d\n", result);result = a % b + c * 2;     // 优先级:乘法 > 取模 > 加法printf("a %% b + c * 2 = %d\n", result);result = (a % b) + (c * 2); // 优先级:括号 > 取模 > 乘法 > 加法printf("(a %% b) + (c * 2) = %d\n", result);return 0;
}

结果如下:

在这里插入图片描述

了解运算符的优先级可以帮助我们编写正确和清晰的表达式,并避免出现不必要的错误。

关键字:

关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。 例如关键字不能用作变量名、函数名等标识符。

数据类型关键字:
short:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入)
long:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入)
long long:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增)
signed:修饰整型数据,有符号数据类型。(C89标准新增)
unsigned:修饰整型数据,无符号数据类型。(K&R时期引入)
restrict:用于限定和约束指针,并表明指针是访问一个数据对象的初始且唯一的方式。(C99标准新增)

在这里插入图片描述

复杂类型关键字:
struct:结构体声明。(K&R时期引入)
union:联合体声明。(K&R时期引入)
enum:枚举声明。(C89标准新增)
typedef:声明类型别名。(K&R时期引入)
sizeof:得到特定类型或特定类型变量的大小。(K&R时期引入)
inline:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99标准新增)

存储级别关键字:
auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto。(K&R时期引入)
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R时期引入)
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。(K&R时期引入)

#include <stdio.h>int main() {register int i;  // 声明一个寄存器变量for (i = 0; i < 10; i++) {printf("%d ", i);}return 0;
}

在上面的代码中,我们使用register关键字声明了一个整型变量i,然后在for循环中使用它进行迭代。

在这里插入图片描述

extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(K&R时期引入)
const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89标准新增)
volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量。(C89标准新增)

这些概念是C语言中非常重要的基础知识,对于理解和编写C程序至关重要。


4️⃣总结

此文为 【C语言必知必会】系列之第一篇 ,带领读者初步了解C语言,为之后的学习打下坚实的理论基础。

后续将发布 【C语言必知必会】系列之第二篇:编译器的安装与使用,读者可订阅专栏持续跟进专栏更新。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文精读--GPT2

被BERT敲打了&#xff0c;但是仍然坚持解码器架构 Abstract Natural language processing tasks, such as question answering, machine translation, reading comprehension, and summarization, are typically approached with supervised learning on taskspecific dataset…

使用代理IP技术实现爬虫同步获取和保存

概述 在网络爬虫中&#xff0c;使用代理IP技术可以有效地提高爬取数据的效率和稳定性。本文将介绍如何在爬虫中同步获取和保存数据&#xff0c;并结合代理IP技术&#xff0c;以提高爬取效率。 正文 代理IP技术是一种常用的网络爬虫技术&#xff0c;通过代理服务器转发请求&a…

idea和jdk之间对应的版本(idea支持的jdk版本)

idea如果和jdk版本不对应&#xff0c;就会出现无法运行的情况&#xff0c;如下&#xff1a; 翻译&#xff1a;无法确定17的“tools.jar”库的路径&#xff08;C:\Program Files\Java\jdk-17&#xff09; 原因&#xff1a;idea版本是2020.2&#xff0c;而jdk版本是17&#xff0…

动态规划-

关键词&#xff1a; 重叠子问题&#xff1b;每一个状态一定是由上一个状态推导出来(类似数列a^n f(a^n-1,a^n-2)) 步骤&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 题目&#…

01_02_mysql06_(视图-存储过程-函数(变量、流程控制与游标)-触发器)

视图 使用 视图一方面可以帮我们使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。比如&#xff0c;针对一个公司的销售人员&#xff0c;我们只想给他看部分数据&#xff0c;而某些特殊的数据&#xff0c;比如采购的价格&#xff0…

【2024软件测试面试必会技能】Unittest(6):unittest_构建测试套件

构建测试套件 在实际项目中&#xff0c;随着项目进度的开展&#xff0c;测试类会越来越多&#xff0c;可是直到现在我 们还只会一个一个的单独运行测试类&#xff0c;这在实际项目实践中肯定是不可行的&#xff0c;在 unittest中可以通过测试套件来解决该问题。 测试套件&…

目标检测-Transformer-ViT和DETR

文章目录 前言一、ViT应用和结论结构及创新点 二、DETR应用和结论结构及创新点 总结 前言 随着Transformer爆火以来&#xff0c;NLP领域迎来了大模型时代&#xff0c;成为AI目前最先进和火爆的领域&#xff0c;介于Transformer的先进性&#xff0c;基于Transformer架构的CV模型…

C语言深入剖析——函数栈帧的创建与销毁

目录 0.前言 1.什么是函数栈帧 1.1栈帧的组成 1.2栈帧的作用 1.3栈帧的管理 2.理解函数栈帧的作用 3.解析函数栈帧的创建与销毁 3.1栈的介绍 3.2寄存器简介 3.3汇编指令简介 3.4具体过程解析 3.4.1预备知识 3.4.2函数的调用堆栈 3.4.3转到反汇编 3.4.4函数栈帧的…

【Python_Zebra斑马打印机编程学习笔记(一)】实现标贴预览的两种方式

实现标贴预览的两种方式 实现标贴预览的两种方式前言一、调用 Labelary Online ZPL Viewer API 方法实现标贴预览功能1、Labelary Online ZPL Viewer API 案例介绍2、生成 PNG 格式3、Parameters 二、通过 zpl 的 label.preview() 方法实现标贴预览功能1、实现步骤2、代码示例 …

Python实战:读取MATLAB文件数据(.mat文件)

Python实战&#xff1a;读取MATLAB文件数据(.mat文件) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…

MATLAB R2018b安装教程

目录 一、软件下载 二、软件介绍 三、安装须知 四、安装步骤 【最后】 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;MATLAB基础及应用&#x1f91d;希望作者的文章能…

Bert基础(一)--自注意力机制

1、简介 当下最先进的深度学习架构之一&#xff0c;Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络&#xff0c;并且以它为基础衍生出了诸如BERT、GPT-3、T5等…

知识积累(二):损失函数正则化与权重衰减

文章目录 1. 欧氏距离与L2范数1.1 常用的相似性度量 2. 什么是正则化&#xff1f;参考资料 本文只介绍 L2 正则化。 1. 欧氏距离与L2范数 欧氏距离也就是L2范数 1.1 常用的相似性度量 1&#xff09;点积 2&#xff09;余弦相似度 3&#xff09;L1和L2 2. 什么是正则化&…

http相关概念以及apache的功能(最详细讲解!!!!)

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

c#程序,oracle使用Devart驱动解决第第三方库是us7ascii,数据乱码的问题

最近做项目&#xff0c;要跟对方系统的库进行读写&#xff0c;结果发现对方采用的是oracle的us7ascii编码&#xff0c;我们系统默认采用的是ZHS16GBK&#xff0c;导致我们客户端读取和写入对方库的数据都是乱码&#xff0c;搜索网上&#xff0c;发现需要采用独立的oracle驱动去…

JVM——感谢黑马程序员官方文档

JVM——感谢黑马程序员官方文档 一、JVM介绍1.什么是JVM&#xff1f;2.有什么好处3.学习路线 二、内存结构1.程序计数器(Program Counter Registe)1.定义2.作用3.特点4.演示 2.虚拟机栈(Java Virtual Machine Stacks)1.定义2.演示3.问题解析4.栈内存溢出5.线程运行诊断&#xf…

操作系统--多线程的互斥、同步

一、概念 在进程/线程并发执行的过程中&#xff0c;进程/线程之间存在协作的关系&#xff0c;例如有互斥、同步的关系。 1.互斥 由于多线程执行操作共享变量的这段代码可能会导致竞争状态&#xff0c;因此我们将此段代码称为临界区&#xff08;critical section&#xff09;…

数据中心机房建设的真正挑战

在数字化时代&#xff0c;数据中心机房不仅是信息处理和存储的心脏&#xff0c;也是企业运营的核心枢纽。然而&#xff0c;在机房建设过程中&#xff0c;存在一系列概念上的误解和痛点。这些误区不仅影响了机房建设的质量和效率&#xff0c;也给企业的长期发展带来了潜在的风险…

了解RT-Thread

1.简介 1&#xff09;RT-Thread&#xff0c;全程是Real Time-Thread&#xff1b; 2&#xff09;嵌入式实时多线程操作系统&#xff1b; 3&#xff09;基本属性之一是支持多任务&#xff1b; 4&#xff09;某一时刻只能运行一个任务&#xff0c;每次对一个任务的执行时间很短…