飞翔飞翔
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 编程基础概念

    • 冯·诺依曼体系结构
    • 数据在计算机中的表示
    • 编程语言的层次
    • C语言的起源与发展
    • C99标准的主要改进
    • 开发环境搭建
    • 第一个C程序
    • 编译与运行流程
    • 可移植性风险的三级体系
  • 第2章 数据类型与运算

    • 字符集与标识符
    • 关键字
    • 注释
    • char 类型
    • short 与 int
    • long 与 long long
    • 有符号与无符号
    • 取值范围与 limits.h
    • float 与 double
    • long double
    • _Bool 类型
    • 变量声明与定义
    • 常量
    • 转义序列
    • 算术运算符
    • 赋值运算符
    • 自增自减运算符
    • 关系与判等运算符
    • 逻辑运算符
    • 位运算符
    • 条件运算符
    • 逗号运算符
    • 运算符优先级
    • 隐式类型转换
    • 显式类型转换
  • 第3章 控制流

    • 表达式语句与空语句
    • 复合语句
    • if 语句
    • switch 语句
    • while 循环
    • do-while 循环
    • for 循环
    • break 与 continue
    • goto 语句
    • return 语句
  • 第4章 函数与模块化编程

    • 函数定义
    • 函数声明与原型
    • main 函数
    • 函数调用机制
    • 传值调用
    • 数组参数
    • 作用域
    • 存储期
    • 链接属性
    • static 与 extern
    • 递归
    • 头文件与源文件
    • 头文件保护
    • include 规则
  • 第5章 数组与字符串

    • 一维数组声明与初始化
    • 数组的存储模型
    • 数组访问与越界
    • 数组操作
    • 二维数组
    • 变长数组 VLA
    • 字符串基础
    • 字符串输入输出
    • 字符串处理函数
    • 字符串与数字转换
  • 第6章 指针

    • 指针的概念
    • 指针的声明与使用
    • 指针运算
    • const 与指针
    • 数组名与指针
    • 指针遍历数组
    • 指针与多维数组
    • 指针作为函数参数
    • 函数返回指针
    • 函数指针
    • 二级指针
    • 复杂声明解析
  • 第7章 结构体、联合体与枚举

    • 结构体定义与声明
    • 结构体初始化
    • 结构体成员访问
    • 结构体嵌套
    • 结构体指针
    • 结构体与函数
    • 联合体
    • 联合体与类型双关
    • 枚举类型
    • 位域
    • 内存对齐与填充
  • 第8章 动态内存管理

    • malloc 与 free
    • calloc 与 realloc
    • 内存泄漏
    • 悬垂指针
    • 内存分配策略
    • 自定义内存池
    • Valgrind 与内存检测
    • 内存碎片
    • 内存对齐分配
    • 常见内存错误
  • 第9章 文件输入输出

    • 文件打开与关闭
    • 文本读写
    • 格式化输入输出
    • 二进制读写
    • 文件定位
    • 错误处理
    • 标准流
    • 临时文件
    • 文件操作示例
  • 第10章 预处理器

    • 预处理器基础
    • 宏定义
    • 带参数的宏
    • 条件编译
    • 头文件包含
    • 预定义宏
    • 宏的高级技巧
    • 预处理器陷阱
    • 编译器特定扩展
  • 第11章 标准库概览

    • 标准库概述
    • assert.h
    • ctype.h
    • errno.h
    • float.h
    • limits.h
    • locale.h
    • math.h
    • setjmp.h
    • signal.h
    • stdarg.h
    • stddef.h
    • stdlib.h
  • 第12章 进阶主题

    • 内联函数
    • 变长数组 VLA
    • 复数类型
    • 布尔类型
    • stdint 与 inttypes
    • 灵活数组成员
    • 匿名结构体与联合体
    • 静态断言
    • 线程支持
    • 原子操作

第一个C程序

学习任何编程语言,传统都是从"Hello, World!"开始。这个程序虽然简单,却包含了 C 程序的基本结构:预处理指令、主函数、标准库调用和返回值。理解每一行的作用,是后续学习的基础。

Hello World 程序

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

将以上代码保存为 hello.c,编译运行:

gcc -std=c99 -o hello hello.c
./hello

输出:

Hello, World!

逐行解析

#include <stdio.h>

这是预处理指令,在编译之前由预处理器处理。#include 将指定头文件的内容插入到当前位置。<stdio.h> 是标准输入输出头文件(standard input/output),包含了 printf 等函数的声明。没有这一行,编译器不知道 printf 是什么,会报"隐式声明函数"的警告或错误。

尖括号 < > 表示从系统头文件路径搜索;双引号 " " 表示先从当前目录搜索,再搜索系统路径。标准头文件用尖括号,自定义头文件用双引号。

int main(void)

这是主函数的定义,每个 C 程序必须有且仅有一个 main 函数,程序从这里开始执行。

  • int 表示函数返回一个整数
  • main 是函数名,固定不变
  • (void) 表示函数不接受参数(C99 推荐显式写 void,空括号在 C 中表示参数未指定)

C99 标准允许两种 main 形式:

int main(void)                  /* 无参数 */
int main(int argc, char *argv[]) /* 接收命令行参数 */

其他形式(如 void main())不是标准 C,某些编译器可能接受,但不可移植。

{ ... }

花括号定义了一个代码块(复合语句),main 函数的函数体就是这个块。C 语言中,代码块可以嵌套,变量声明在块内时只在该块中有效。

printf("Hello, World!\n");

printf 是标准库中的格式化输出函数,将字符串打印到标准输出(通常是屏幕)。

  • "Hello, World!\n" 是字符串字面量,\n 是换行符
  • 每个语句以分号 ; 结束,分号是 C 语句的终止符

printf 支持格式控制,后续会详细讲解:

printf("Name: %s, Age: %d\n", "Alice", 25);   /* %s 字符串,%d 整数 */

return 0;

return 语句结束函数执行,并将值返回给调用者。main 函数的返回值被操作系统接收,0 表示程序正常结束,非零值表示异常退出。

在 C99 之前,如果 main 末尾没有 return,行为未定义。C99 规定:如果 main 函数执行到末尾没有遇到 return,等效于 return 0;。但显式写 return 0; 是更好的习惯。

程序结构总结

一个最简单的 C 程序包含:

  1. 预处理指令:#include、 #define 等,以 # 开头
  2. 函数定义:至少包含 main 函数
  3. 语句:以分号结束,放在函数体内
  4. 注释:/* ... */ 或 // ...(C99),被编译器忽略
/* 文件:hello.c */
/* 这是一个多行注释,说明文件用途 */

#include <stdio.h>      /* 包含标准输入输出头文件 */

/* main 函数:程序入口 */
int main(void)
{
    // 打印问候语(单行注释)
    printf("Hello, World!\n");
    
    return 0;           /* 正常结束 */
}

常见初学者错误

忘记分号:

printf("Hello\n")      /* 错误:缺少分号 */

拼写错误:

printf("Hello\n");     /* 正确 */
print("Hello\n");       /* 错误:函数名拼错 */

引号不匹配:

printf("Hello\n');      /* 错误:开头双引号,结尾单引号 */

main 拼写错误:

int Main(void)          /* 错误:C 区分大小写,必须是 main */
int mian(void)          /* 错误:拼写错误 */

编译器会给出错误提示,仔细阅读错误信息并定位行号,是调试的第一步。

上一页
开发环境搭建
下一页
编译与运行流程