百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

C语言入门这一篇就够了-学习笔记

bigegpt 2024-08-14 14:44 2 浏览

按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦。

吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的

有些东西还是有必要了解一下,比如,C语言所产生的代码运行速度比汇编语言编写的代码运行速度稍慢一点,但还是有得一拼,同时C语言要比汇编语言编写的代码可读性高,可移植性好。另外,相对于其他高级语言,比如C++、java、C#等来说,C语言编写的代码运行效率要高。

在介绍C语言的数据类型和基本语法之前,先说说C程序结构和C文件结构。

1、C程序结构:

①预处理指令;

②变量、函数、语句、表达式、注释等;

③返回值;

以一段简单的打印输出“hello world”代码为例:

注意:一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数)和若干个其他函数结合而成,或仅由一个main()函数构成;

接下来看看C语言程序运行结构:基本的三种程序结构为顺序结构、选择结构和循环结构。

顺序结构:程序按顺序执行,不发生跳转。

选择结构:依据是否满足条件,执行相应功能。(1)if(表达式) 语句;(2)if(表达式)语句1;else语句2;(3)if(表达式1)语句1;else if(表达式2)语句2;...else语句n;

注意:第三种方式,即: if......else if..........else if.....else,只能响应一个条件。

循环结构:

while ( ) { } 语句 先判断表达式后执行.

do{ }-while( ) 语句 先执行语句后判断表达式.

for( ; ; ){ }

2、C文件结构:

一个基于C的软件系统一般由以下文件构成:

若干个C文件:每个C文件中包含若干个函数。

若干个头文件:每个头文件中包含一些数据结构的定义以及C函数、变量的原型声明。

若干个库文件:库文件是编译后的二进制文件,一般由若干C文件编译后组成,其中包含了若干个函数的可执行代码;这些库文件中的函数可执行代码在连接的时候合并到最终的可执行文件中。

若干个make文件:make文件描述了多个文件中的依赖关系以及生成最终可执行文件或库文件所需要的信息。

由于篇幅较小,再加点内容,顺便写写C语言的关键字和控制语句。

1、关键字:

这里介绍下C语言的32个关键字(至于ISO推出的C99标准新增的5个C语言关键字和C11标准新增了7个C语言关键字目前没有做过过多了解,这里就不再介绍)

(1)数据类型关键字(12个)

char,short,int,long,float,double,unsigned,signed,void,struct,union,enum;

char:字符型类型数据

short:短整型数据,修饰int,一般省略被修饰的int;// short int a = 10;一般写成 int a = 10;

int:整型数据,通常为编译器指定的机器字长;

long:长整型数据,修饰int,一般省略被修饰的int;

float:单精度浮点型数据;

double:双精度浮点型数据;

unsigned, signed是修饰符,分别表示无符号和有符号,我们时常写的“ int a=123;”其实就是“signed int a = 123;”,表示有符号整型

void: 声明函数无返回值或无参数,修饰指针时表示无类型指针,void不可用来定义变量,但可以用它来修饰各种变量;

struct:用来声明结构体;

union:用来声明共用体或者叫联合体;

enum:用于枚举类型的声明;

关于结构体,共用体,枚举的用法以及结构体和共用体的区别以后单独再写;(2)控制语句关键字(12个)

if,else,for,do,while,break,case,continue,default,return,switch,goto(尽量别使用);

(3)存储类关键字(4个)

auto,extern,register,static

auto:声明自动变量(很少使用);

extern:声明变量外部可用,可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,可以外部使用;

static:声明静态变量,static修饰的变量存储在静态变量区,修饰全局变量时,表示该变量为全局静态变量,作用域为当前文件;修饰函数时表示函数作用域为当前文件内部; 修饰局部变量时,表示该变量为静态局部变量,只被初始化一次,赋值之后值会保持最新的值,也就是说局部静态变量的生命周期被扩展到整个程序运行的时间段内。这里不知道有没有说清楚,干脆看个例子简单明了:


register:声明寄存器变量,修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。

注:register变量必须是能被CPU所接受的类型,这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。因为register变量可能不存放在内存中,所以不能用“&”来获取register修饰变量的地址,如:


(4)其他关键字(4个)

const,sizeof,typedef,volatile

const:const修饰变量,表示被修饰的变量不可被当前线程或进程改变;例如:const int *p = 100; //const修饰int *,表示*p的值不可变*p = 50; //错误,*p的值不可变再比如:int a = 0;int b = 0;int * const p = &a;//const修饰指针p,表示指针变量地址不可变;p = &b; //错误,地址不可变,不能指向其他地址;

sizeof:计算数据类型长度或者变量占内存空间大小,sizeof长得像函数,其实它是个关键字;

typedef:为某种数据类型定义一个新的名字;

volatile:确保本条指令不会因编译器的优化而省略,且要求每次直接读值,简单地说就是防止编译器对代码进行优化。比如如下程序:num=0x65;num =0x66;num =0x67;num =0x68;对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器就不能像对待纯粹的程序那样对上述四条语句进行优化,只认为 num=0x65(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(四条)

2、语句

C语言利用函数体中的可执行语句,向计算机系统发出操作指令;按照语句功能或构成的不同,可将C语言的语句分为5类:

(1)控制语句(9条,可以细分为三种):

选择结构控制语句

if()~else~, switch()~

循环结构控制语句

for()~, while()~, do~while(), break, continue

其他控制语句

return, goto

return功能:终止执行函数,赋值(可选); 将控制权返回给调用函数的下一条语句

goto:无条件转移语句,跳转语句;

如上代码,在不使用goto的情况下,会分别打印出line 1、line 2、line3,在打印完line 1后使用goto语句,则直接跳转到goto目标代码,即代码中的end部分;

(2)函数调用语句:

函数调用语句由一次函数调用加一个分号构成.

例如:

printf(“hello world!”);

scanf(“%d”,&num);

(3)表达式语句:

表达式语句是由表达式后加一个分号构成,

例如:

“num = 10”是表达式,

“num = 10;”是赋值语;

(4)空语句:

空语句由一个分号构成,空语句什么操作也不执行.。

(5)复合语句:

复合语句由大括号括起来的一组语句构成。

{

{ } //复合语句,注意大括号后不需要分号

}

复合语句一般与其它语句配合使用:

如for( ; ; ) { }

这玩意儿想的时候不多,写起来却很多,深究起来就多的完全说不完(┬_┬),C语言基础部分本应该在本篇文章中写完,由于时间问题,下次再写吧。

下篇开始说说数据类型,运算符与表达式,想了解的小伙伴们,可以关注收藏,后续内容请见下回分解。

相关推荐

为3D手游打造, Visual Studio Unity扩展下载

IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

由ArcMap属性字段自增引出字段计算器使用Python的技巧

1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...

微软首次回答 HoloLens 相关问题,终于爆料了

fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...

C#指针的应用(c#指针类型)

C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...

C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)

C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...

欢迎回来:Fortran意外重回流行编程语言20强榜单

TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...

C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案

简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...

C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤

在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...

C# (一)状态机模式(状态机代码实现)

最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...

C# 中 Predicate 详解(c#中的replace)

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...

C#中$的用法?(c#中&&什么意思)

文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...

C#并行编程:Parallel类(c# 并行处理)

在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...

颠覆认知!用Span重构foreach循环竟让数据处理快如闪电

在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...

Unity3D手游开发实践《腾讯桌球》客户端开发经验总结

本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...

.NET 7 AOT 的使用以及 .NET 与 Go 互相调用

目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...