目录

C学习笔记01从程序框架到函数调用

【C#学习笔记01】从程序框架到函数调用

引言

​​C语言作为一种高效、灵活的编程语言,在嵌入式系统、操作系统开发以及高性能计算中扮演着重要角色。无论是初学者还是有经验的开发者,掌握C语言的基础知识都是理解计算机底层原理和编写高质量代码的关键。


1. 程序框架的分析

大家在学习编程语言的时候一般第一个程序都是“hello world”,下面就是利用C语言设计的程序代码:

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

一个C语言程序的基本框架通常包括以下几个部分:

  • 预处理指令 :如​ ​#include​ ​,用于引入头文件。

  • 主函数 :​ ​main()​ ​函数是程序的入口。

  • 函数定义 :自定义函数,用于实现特定功能。

  • 语句与表达式 :程序的具体逻辑。

  • ​#include <stdio.h>​ ​:引入标准输入输出库,使得我们可以使用​ ​printf​ ​函数。

  • ​int main()​ ​:​ ​main​ ​函数是程序的入口,程序从这里开始执行。

  • ​printf("Hello World!\n");​ ​:调用​ ​printf​ ​函数,在控制台输出一行文字。

  • ​return 0;​ ​:表示程序正常结束,返回值0通常表示成功。

注意 : 大家在学习编程语言的时候,要记得一句话:程序是写给人看的!

作为一段有意义的程序来说,一定要在程序中对关键的位置进行注释,这样可以方便大家理解程序,尤其是在实际的项目开发过程中是团队开发同一个项目,由于每个人的编程习惯以及逻辑思维都不同,所以就会导致程序没有办法进行整合。


2. 代码风格

良好的代码风格是编写高质量程序的基础。以下是一些常见的代码风格规范:

  • 缩进 :使用4个空格或1个Tab进行缩进,保持代码层次清晰。
  • 命名规范 :变量名、函数名使用小写字母,单词之间用下划线分隔(如​ ​calculate_sum​ ​)。
  • 括号对齐 :​ ​{​ ​和​ ​}​ ​单独成行,并与上一行代码对齐。
  • 空格使用 :在运算符和逗号后添加空格,提高代码可读性。
#include <stdio.h>

// 计算两个数的和
int calculate_sum(int a, int b) {
    int result = a + b;  // 使用有意义的变量名
    return result;
}

int main() {
    int num1 = 10;
    int num2 = 20;
    int sum = calculate_sum(num1, num2);  // 调用函数
    printf("Sum: %d\n", sum);             // 输出结果
    return 0;
}

3. 代码注释

程序中可以包含一些必要的注释,注释是代码的重要组成部分,它可以帮助他人(以及未来的自己)理解代码的逻辑。但是不要过度注释,一般在程序中进行注释时有两种情况:针对某一行代码进行注释  and  针对某一段代码进行注释 具体操作如下所示:

(1) 针对某一行代码进行注释

当程序中需要对某一行代码进行注释时,可以采用 // 或者 /* */ 这两种方案进行注释,如:

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

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

(2) 针对某一段代码进行注释

当程序需要对某一段代码进行注释时,可以采用 /*  */ 这种方案,一般针对函数或者程序:

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

注意 : 程序中的注释只是对于工程师阅读源码起到辅助性作用,对程序进行编译时,编译器会自动忽略注释,只编译有效代码,就是说编译器并不会把注释翻译成二进制指令。


4. 程序入口

C语言是一门采用面向过程范式的编程语言。所谓"面向过程",其核心思想在于将复杂问题分解为若干按顺序执行的步骤。具体而言,当开发者需要解决某个问题时,会先通过逻辑分析将其拆解为多个独立的小问题,然后按照特定顺序逐个攻克这些子问题,最终实现整体问题的解决,这正体现了"分而治之、逐步击破"的工程化思维。

基于这种自顶向下的设计理念,程序的执行流程控制显得尤为关键。根据C语言标准规范,程序的执行严格遵循线性顺序,且必须以main函数作为唯一入口点。

#include <stdio.h>

int main() {
    printf("Program starts here!\n");
    return 0;
}

C语言采用函数式编程范式,其程序结构以函数为基本构建单元。一个完整的C程序由主函数(main function)和若干子函数(sub-functions)构成。其中,主函数具有特殊的命名规范——必须使用"main"作为函数标识符,该命名源自英文"main"(意为主要的、核心的)的语义内涵,体现了其在程序架构中的核心地位。作为程序的唯一入口点,系统将严格依照main函数内部的语句顺序执行指令。

特别说明

程序的执行顺序与main函数在源代码文件中的物理位置无关。即便将main函数定义置于文件末尾,程序仍会从main函数开始执行,这种设计确保了程序入口的确定性和一致性。


5. 程序结束

程序的结束通常通过​ ​return​ ​语句实现。在​ ​main()​ ​函数中,​ ​return 0;​ ​​表示程序正常退出,而非零值通常表示程序异常退出。返回值指的是函数执行完成后的结果,当然,并不是所有的函数都具有返回值,这个要根据实际情况而定。

​main()​ ​函数中的​ ​return​ ​语句

​main()​ ​函数是C语言程序的入口,也是程序结束的地方。​ ​main()​ ​函数的返回值通常是一个整数,用于表示程序的退出状态:

  • ​ return 0; ​ ​:表示程序正常结束。在大多数操作系统中,返回值为0表示程序成功执行。
  • 非零返回值 :通常表示程序异常结束。不同的非零值可以用来表示不同的错误类型。
#include <stdio.h>

int main() {
    int value = -1;
    if (value < 0) {
        printf("Error: Negative value!\n");
        return 1;  // 异常退出,返回值为1
    }
    printf("Program ends normally.\n");
    return 0;  // 正常退出,返回值为0
}
  • 如果​ ​value​ ​为负数,程序会输出错误信息并通过​ ​return 1;​ ​结束,表示程序因错误而退出。
  • 如果​ ​value​ ​为非负数,程序会输出正常结束信息并通过​ ​return 0;​ ​​结束,表示程序成功执行。

​exit()​ ​函数

除了​ ​return​ ​语句,C语言还提供了​ ​exit()​ ​函数来立即终止程序。​ ​exit()​ ​函数位于​ ​stdlib.h​ ​头文件中,它接受一个整数参数,类似于​ ​main()​ ​函数的返回值:

  • ​ exit(0); ​ ​:表示程序正常结束。
  • ​ exit(非零值); ​ ​:表示程序异常结束。
#include <stdio.h>
#include <stdlib.h>  // 引入exit()函数

int main() {
    int value = -1;
    if (value < 0) {
        printf("Error: Negative value!\n");
        exit(1);  // 异常退出
    }
    printf("Program ends normally.\n");
    exit(0);  // 正常退出
}
  • ​exit()​ ​函数会立即终止程序,不会继续执行后续代码。
  • 与​ ​return​ ​语句不同,​ ​exit()​ ​可以在程序的任何地方调用,而不仅限于​ ​main()​ ​函数。

6. 函数调用

在C语言程序架构中,函数作为基本组成单元,其体系由主函数(main function)和若干子函数(sub-functions)构成。主函数具有固定命名规范(必须为main)和特定功能定位(程序入口),而子函数则具有更高的灵活性和多样性。

子函数作为主函数的补充,主要分为两大类别:

库函数(Library Functions) :由官方或权威机构(如ISO、ANSI、GNU等)提供的标准化函数集合,统称为标准库(Standard Library)

用户自定义函数(User-defined Functions) :开发者根据特定需求自主实现的函数

值得注意的是,函数库的来源具有多样性:除了官方标准库外,还包括由各类组织、企业或个人开发的第三方库(Third-party Libraries)。这些库根据授权模式可分为:开源免费库(体现技术共享精神)和商业授权库(体现知识价值)

https://i-blog.csdnimg.cn/img_convert/0e62529762b6d69970a35f2b4f9e8136.png

一般官方提供的函数库都已经在系统路径中能够是存在的,所以用户需要使用<>包含头文件,就可以让编译器找到对应的函数接口。

注意 : 头文件不是必须包含,只有调用了函数库中的函数接口,才需要包含头文件!


写在后面:

本系列博客文章只是简单介绍知识点、C语言的基础知识,意在使读者(还有自己)大概了解C语言,起到辅助学习作用,若需进一步系统学习还需借助另外的文献及课程。