zerglurker的C语言教程002

经过上节课,大家现在已经有了一个可运行的C语言程序、相关代码和开发环境。

也许你会有一点疑问,为什么是建立main.cpp而不是main.c

另外,printf是什么?main是什么?#include是什么?

嗯,不要急,这些问题我都会慢慢告诉你们。

通过上节课的内容,我们知道代码要想编程程序,是需要一个工具的。

在windows下面,该工具vs提供了;而在linux下面,该工具叫做gcc。

这个工具,就是我们后面会提到的,称为编译器的东西。因为它将源代码编码转译为可运行文件,所以叫做编译器。

为了说明后面的内容,我们先建立一个头文件:

右键单击项目,选择添加→新建项

选择下图中的头文件,文件名输入public.h

然后新加一行代码,如下面所示(基于上课的代码):

#include<stdio.h>

#include“public.h”

intmain(intargc,char**argv,char**env)

{

printf("hello world!\n");

return0;

}

下面我们再来看看代码。任何一个C或者C++的源代码,基本都会有两个部分:头文件引用说明和函数实现

这里#include<stdio.h>就是头文件引用说明部分。它告诉编译器,我这里会用到一些其他文件里面声明的函数。

#include 有两种方式,一种是上文提到,另外一种是用双引号如下面的代码一样

#include“public.h”

两者的区别是,前者告诉编译器,我引用的文件是库文件的头文件(库文件的详细概念后面会讲,这里各位可以简单的理解为操作系统提供的基本函数,用来简化软件开发。),请从系统头文件开始找起;后者告诉编译器,这个头文件是我自己定义的,请先从当前目录找起。

这样编译器就会根据你的指示,去寻找这些头文件。

intmain(intargc,char**argv,char**env)

这行代码,告诉编译器,我这里有一个函数叫做main

它有三个参数argc argv和env,它的返回值是整数

这里特别强调的一点是main函数,在一个程序中只能被实现一次!

因为这个函数有一个特别的函数,它是所有代码的起点,程序的入口函数。

也就是程序运行的时候,会首先运行该函数,而不是其他的函数。

所以这个函数也只能实现一次,否则有多个实现,就相当于是有多个入口,你让程序从哪个进入呢?

毕竟从一个进,其他入口怎么办?所以干脆定义一个规则,一个程序只能定义一个入口。这样大家都好办了。

也许你手上有一本教材,或者别的什么资料,它的main函数是这样给的:

int main(intargc)

int main(intargc,char* argv[])

int main(intargc,char*argv[],char*env[])

甚至干脆是这样的

int main()

以及这样的

void main()

嗯,不要激动,他们都是对的,我也是对的

就像我上面说过的,这个函数只是告诉编译器,我的入口在这里

至于这个入口是个什么样的入口,编译并不太关心。

但是注意!!虽然你甚至可以这样定义main函数:int main(void*param)

可是系统在调用你的这个入口的时候,它会按照启动时参数的个数(argc)启动时参数的列表(argv)启动时环境变量列表(env)的顺序传递参数。从下图可以看到param在运行的时候,系统传递进来的值是1。表明启动时只使用了一个参数。其他的参数你可以不要,但是你不能更改系统给你的参数。

所以我们定义main函数最好按照大家的约定来

而且更有意思的是,尽管你可能不想要这三个参数,可是系统仍然会给出,完全无视你的需求

比如我如下定义main函数

从实际调试情况来看,系统仍然将argv(也就是启动参数列表)和env(运行环境列表)传递给了我。只是我需要用一些特殊的手法才能看到这种情况。

所以,大家定义main函数的时候最好采用我给的方法:

intmain(intargc,char**argv,char**env)

既然你无法舍弃,为了程序的可控性,最好还是都拿着——毕竟不管你拿还是不拿,它都在哪里,相对于不可控的情况,拿在手里心里更加踏实。

好了,总结一下:

本节主要学习了以下几点:

1 源代码的构成有两个部分:头文件和函数实现

2 如何建立一个自定义的头文件

3 入口main函数的知识。

那么现在你现在算是基本有了C语言(或者说是C++语言)入门的第一步。

注意第一点!以后不论你接触到的代码有多么复杂或者多么简单,都离不开这个框(否则要么是一个无用的程序,要么是一个错误的程序)。

关于main函数里面其他内容,在下章和后续章节我还会深入下去,所以千万别忘记了。

时间: 2024-08-25 14:18:19

zerglurker的C语言教程002的相关文章

zerglurker的C语言教程004——指针初步讲解

在上次的教程里面,我提到了指针. 针对指针,这次我将简单的讲讲,后面我还会讲到--那个时候你应该有了相当的基础. 首先,先讲讲指针类型. 任何类型关键字后面加一个*符号,就会变成指针类型. 比如: char → char* 字符指针 int → int* 整数指针 double→double* 双精度指针 甚至还可以这样: char*→char** 字符指针的指针类型 →char*** 字符指针的指针的指针类型- 指针本质上是一个内存地址值,该内存地址上存放的是相关类型的数值.但是void*指针

zerglurker的C语言教程009——运算符详解(一)

在之前几节我们讲过数据类型.讲过函数.讲过代码执行顺序以及一些添加简单函数的方法. 这一节我们将着重讲讲运算符.包括运算符的含义以及优先级的概念 在C语言中,以下运算符是被公认的: C/C++语言运算符详解 优先级 运算符 名称以及含义 运算目 使用示例 结合方向 可否重载 附加说明 无 () 圆括弧 单目 (表达式) 无 否 括弧内的表达永远先计算 无 dynamic_cast<>() 类型动态转化 单目 dynamic_cast<目标类型>(源) 无 否 C++专有,不能转换返

zerglurker的c语言教程006——第一功能

行,以往的经验教训后,.成员main性能.变数.命名等基本概念应该有一个初步的了解 下面,我们就可以开始我们自己的第一个定义的函数. 仿照头等舱.操作的第二个教训.添加一个新的项目的解决方案Lession006 第一课main.cpppublic.h复制过来 然后例如以下图示意的那样增加到项目中来: 右键单击项目 在加入栏 选择现有项 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemVyZ2x1cmtlcg==/font/5a6L5L2T/fonts

zerglurker的C语言教程008——循环语句详解

上节课我们提到了程序语句的三大执行顺序:顺序执行.条件执行和循环执行 今天我们详细讲讲循环执行,不废话,先上代码和运行效果 首先来一段示例代码,老规矩,新建一个空项目(参考006课) 新建一个空的main.cpp和public.h public.h里面定义代码如下: void LargeDistributionSequence(unsigned int nLength); main.cpp代码如下: #include <stdio.h> #include "public.h"

zerglurker的C语言教程010——运算符详解(三)

同上节课,请参考运算符总览 本节主要讲讲sizeof 也许有的资料提到过C++的typeid,但是这个根本不是运算符,而是一个类,有文件定义的 所谓运算符必须是无需头文件即可使用的符号.如果要使用一个运算符,还需要头文件,那么这个运算符就不是基本的运算符,是开发人员重载或者自己写的. 从这个角度看typeid就不是运算符,而是微软自定义的. 运算符的另一个特点是,对常量进行操作,编译阶段就会进行处理. 比如 int a = sizeof(int) ; 编译器会在编译的时候直接将4用来初始化a.所

zerglurker的C语言教程010——运算符详解(二)

首先,请参考上节课我们提到的运算符总览 今天我们主要讲解下面几个运算符: ()圆括弧运算符 {}组合运算符 ::作用域解析 throw运算符 ,逗号运算符 ()圆括弧运算符 使用示例: a*(b+c) (b>=a)&&(c<=a) (a%(b/c))*d 特点说明: 1 圆括弧拥有优先执行权限.即运算表达式时,优先运算圆括弧内的表达. 2 圆括弧可以嵌套,嵌套时内部的圆括弧拥有更高的优先级. 注意: 由于()作为圆括弧运算符的时候,里面的表达式不可以为空,也不可以有多个语句,所

zerglurker的c语言教程——命名规则

今天讲讲C/C++中的命名规则 命名规则或者说命名限制可以应用于函数命名.变量命名.常量命名.结构体命名.自定义类型命名以及C++中类命名.对象命名.模板类或对象命名等等 第一条:名称的第一个字符只能是字母或者下划线. int _,_a,A1,_9;//合法 int 1_a,1_,$S;//非法 注意:只有一个下划线的名称,在C/C++中是一个合法的名称! 第二条:名称中可以包含数字 第三条:名称中不能包含除了下划线.字母和数字之外的其他符号 第四条:名称是大小写敏感的 也就是说name和NAM

zerglurker的C语言教程007——代码运行的顺序

软件开发中.代码有三种基本运行顺序: 顺序运行 代码从入口開始一条一条运行.直到返回或者结束 循环运行 在设定条件后,代码反复运行某一个或多个部分,直到达到某些条件后终止 条件运行 代码会先推断某些条件,假设满足则运行部分代码,假设不满足则运行还有一部分代码 实际其中,这三种运行顺序是交错出现的.你中有我,我中有你. 以下是上节课的代码,我们来一句一句的分析看.你就会明确我上面说的是什么了: #include <stdio.h> #include "public.h" in

YAML 语言教程(转载)

用YAML语言读取配置是最快的,之前的suricata中用yaml读取了配置,并且在代码运行期间,对配置进行了维护,所以抽点时间,来了解一下YAML语言编程,下文虽然对YAML语言和JAVAScript语言的相同语句进行了比对.但也不失为一个好的YAML入门教程. 原文地址:http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt YAML 语言教程 作者: 阮一峰 日期: 2016年7月 4日 编程免不了要写配置文件,怎么写配置也是一门学问.