讲解第一个C程序

上节课我们安装了GCC编译器,并且创建了一个最简单的hello world 例子,这节课,我们来讲解一下这个例子。首先看例子如下:

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}
Code language: C/AL (cal)

代码很简单,就输出一行文字。

下面从上往下,解析每一行代码。

1. #include <stdio.h>

第一节课,我们提了一下预处理,那么这里的第一句代码就是预处理了。从哪里看出来?# 这个符号就是了。

#:预处理指令标记,交给预处理器处理,编译代码第一步执行。

include:导入头文件关键字,作用是把指定文件里的代码复制到当前程序。

<stdio.h>:标准输入输出头文件(standard input output)。 里面封装了屏幕打印、键盘读取等输入输出函数,下面用到的printf 函数就定义在这个文件里。

其实,预处理不属于C语言的一部分,其实,严格上说,C语言的预处理并不是C语言语法的一部分,而是由编译器在编译之前执行的一个独立阶段。它属于编译过程的一环,但不属于C语言的核心语法和语义体系。

也就是说,预处理,是先有一个独立的程序,去做一些替换等操作,比如这里的#include <stdio.h> 就是把stdio.h 这个文件里面的代码拷贝到这里,然后替换了这句“#include <stdio.h>” ,所以假如这个头文件stdio.h里面的 AAAAAAAAA

那么,最终,到达编译器编译的时候,代码其实是这样的:

 AAAAAAAAA

int main()
{
    printf("hello, world\n");
    return 0;
}
Code language: C/AL (cal)

当然这是假设头文件里面是 AAAAAAAAA,事实上,里面并不是。感兴趣的同学可以查看一下这个头文件的内容。

这个头文件,就在你的电脑上面,不同操作系统可能不一样

在 Linux/Unix 系统:通常位于 /usr/include/stdio.h。

在 Windows (Visual Studio):位于 VC/include/stdio.h。

在 macOS (Xcode):位于 /Applications/Xcode.app/.../usr/include/stdio.h。

读者可以借助一些工具,来搜索一下你电脑的这个文件的位置

现在你的对预编译应该有一定的了解了?

如果没有 不加这一行#include <stdio.h>,编译器不认识 printf,会直接报错。读者可以删除,然后再使用gcc,来编译试一下

删除头文件后

再次编译报错

2. int main()

main = C 语言程序入口函数

  1. 任何 C 程序运行时,系统都会自动从 main 函数开始执行,有且只能有一个 main
  2. int:代表函数返回值类型,整数(integer)。
  3. ():表示这是函数,括号内可以写参数,空括号代表无参数。

这个main,几乎是后面大部分编程语言都继承了这种写法,它是程序的入口,当用户双击exe,或者命令行执行这个exe文件 例如输入hello 这个命令的时候,操作系统会帮你调用这个main函数的,它是程序的入口,由操作系统调用;

前面的int,是函数的类型,后面我们自己定义函数,都需要有一个函数的返回类型,等我们后面学到的时候,读者们就会理解了。

小括号() 表示,这个函数接受那些类型的参数,这里是空的,也就是括号里面没有内容,也就是这个函数不接受参数。正常你可以接收参数的。例如:

int main(int argc, char *argv[])Code language: CSS (css)

这样写,就是接收两个参数,一个是int类型,一个是(字符串数组),这个我们后面再解析,后面的课程。

这个main函数,的这些参数,是操作系统传入的。那么这些参数,怎么传入进来?

读者有没有用过一些doc系统的应用,或者有没有用过ping这个命令。比如我们要ping一个ip 看看能不能联通,例如ping 12.36.4.xxx ,那么这里的ping 就是ping.exe 这个程序了12.36.4.xxx 后面的这个ip 就相当于传入参数给这个ping.exe 的main了

所以,我们的hello的程序,如果你要传入参数,也可以 hello abc 那么这个abc 也相当于传入进去,那么这里的main后面的小括号,里面的这些参数,就是接收这些传进来的值。操作系统帮你拿到这些值,然后传入到这个main函数。

反正读者,可以暂时理解,这个main 就是程序的入口,只有一个。操作系统调用的,操作系统把从命令行中获取的值传递到这里。

3. { } 大括号

函数体的上下边界,{ 代表函数开始,} 代表函数结束,所有函数里面的代码写他们的中间。

4. printf("hello, world\n");

  • printf:print format,格式化输出函数,功能是往控制台打印文字。
  • 双引号 " ":包裹字符串常量,里面是要输出的文本。
  • \n:转义字符,换行符,打印完文字自动换到下一行。
  • ;:C 语言语句结束标记,每一条执行语句末尾必须加分号,漏写会编译报错。

后面的f 就是格式化输出,我们后面会学到这个。你暂时先理解为 输出一个文本,然后这个文本hello, world\n就显示到控制台哪里,后面的\n 是输出前面的hello,world 后就换行。

5. return 0;

  • return:给 main 函数返回一个整数,终止当前函数。为什么要return?因为我们的main前面有int ,所以函数体里面必须返回一个整数。
  • 0:约定含义:程序正常、无错误运行完毕。(告诉操作系统,程序是否有错)
    • 返回 0 = 程序执行成功
    • 返回非 0 数字(如 return 1;)= 程序异常退出

现代 C 标准允许 main 末尾省略 return 0;,编译器会自动补,但新手建议规范写上。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注