c语言的学习(一)------ c程序开发环境及程序结构

本文详细介绍了C语言的程序编译过程,包括预处理、编译、汇编和链接四个阶段,并讲解了gcc的使用方法。此外,还探讨了C语言的注释规范、数据类型、常量与变量的概念,以及格式化输入输出函数的基本应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、gcc的使用

(一)程序编译过程

程序编译的四个过程:预处理、编译、汇编、链接

1、预处理:gcc -E main.c -o main.i 

        生成.i文件将进行如下操作:

        (1)将所有的#define删除,并展开所有的宏定义。

        (2)处理所有的预编译指令,例如: #if,#elif,#else,#endif等

        (3)处理#include预编译指令,将所包含的文件插入到预编译指令的位置

        (4)添加行号信息,文件标识,便于调试

        (5)删除所有的注释

        (6)保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pargma指令来设定编译的状态或者是指示编译器完成一些特定的动作。

        (7)生成.i文件(包括去注释、宏替换、头文件展开、条件编译),编译生成的.i文件不包含任何宏定义,因为宏已经被展开,并且包含的文件已经被插入到.i文件中。

2、编译:gcc -S main.i -o main.s        (将c/c++转换成汇编)

        生成.s文件,需要进行如下操作:

        (1)扫描、语法分析、语义分析、源代码分析、目标代码生成、目标代码优化

        (2)生成汇编代码

        (3)汇总符号

        (4)生成.s文件

3、汇编:gcc -c main.s -o main.o        (将汇编转换成二进制)

        生成.o文件,需要进行如下操作:

        (1)根据汇编指令和特定平台,把汇编指令翻译成二进制形式

        (2)合并各个section,合并符号表

        (3)生成.o文件

4、链接:gcc  main.o -o main 

        链接过程会进行如下操作:

        (1)合并各个.obj文件的section,合并符号表,进行符号解析

        (2)符号地址重定位

        (3)生成可执行文件

(二)gcc的使用

常用的两种生成可执行程序的方法:

gcc main.c -----> 生成可执行文件a.out

gcc -o main main.c -----> main.c生成可执行文件main

二、c语言注释规范

1、注释原则

项目开发中,尽量保持代码注释规范和统一;注释方便了代码的阅读和维护;边写边注释,修改代码时要相应修改注释,保证注释和代码的一致性;注释要简介明确,不要出现形容词;通过注释可以快速知道所写函数的功能,返回值,参数的使用。

2、文件的头部注释

/*******************************************
* @File name: main.c
* @Author: jxx
* @Version: 1.0
* @Date: 2022-10-31
* @Description: The function interface
********************************************/

3、结构体、全局变量等的注释

int num;    /* 全局变量的作用 */

/* 结构体的功能 */
typedef struct{
    int h;    /* High risk */
    int l;    /* Low risk */
    int m;    /* Middle risk */
    int i;    /* Infomation risk */
}risk;

4、函数的注释

函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等

/*********************************************************
* Function name: insert_hhistory
* Description: Insert to bd_host_history
* Parameter:
* @ipsql        SQL statement
* @host_level   Risk level
* @total        The total number of risk
* @t_id         task id
* @t_uuid       task uuid
* @ipaddr       target ipaddr
* @end_time     task end time
* Return:      0 -- success,    other -- fail
**********************************************************/
int insert_hhistory(char *ipsql, risk host_level, int total, int t_id, char *t_uuid, char *ipaddr, long int end_time)
{
    /*
    *   如果程序过于复杂,这里可以写明,具体算法和思路。
    */
}        

5、建议

一般情况下,源程序有效注释量必须在20%以上。注释不宜太多、不宜太少,准确简洁易懂;

注释格式尽量统一,建议使用/*......*/;

避免一行代码或表达式的中间插入注释;

说明:除非必要,不应该在代码或表达中间插入注释,否则容易使代码可理解性变差

通过对函数或过程、变量、结构等正确的命名,可增加代码的可读性,并减少不必要的注释

在代码的功能、意图层次上进行注释,提供有用、额外的信息

说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。

三、C语言数据类型

c语言的数据类型分为四大种:

1、基本类型:

        a.数值类型:分为整型(short, int, long)和浮点型(float, double)

        b.字符类型:char

2、构造类型:

        a.数组

        b.结构体struct

        c.共用体union

        d.枚举类型enum

3、指针类型

4、空类型void

常用的ASCLL码:'A': 65   'a': 97 (大小写相差32)

四、常量与变量

1、常量:常量是指在程序运行过程中其值不发生改变的量称为常量

直接常量可直接使用,无需任何说明的量,例如整型常量、实型常量以及字符常量
符号常量用标识符代表一个常量,c语言中,可以用一个标识符表示一个常量,称之为符号常量

在使用符号常量之前一定要对其进行定义,一般形式为:

#define 标识符 常量

#define又称宏定义,标识符为所定义宏名。其功能是把该标识符定义为其后的常量值。定义之后,一旦以后的程序再次出现该标识符的地方均用该常量值替代。

**通常符号常量的标识符用大写字母,变量标识符用小小写字母,以示区别。

2、变量: 变量是指在程序运行时其值可以改变的量,变量的功能就是存储数据。每个变量都有特定的类型,类型决定了变量存储的大小和布局。

变量定义的一般格式:

类型说明符 变量名;

定义变量时的一些注意事项:

a.最后一个变量名之后必须以;结尾

b.变量定义必须放在变量使用之前

c.允许在一个类型说明符后,定义多个相同类型的变量,各变量名之间用逗号隔开

变量可以先定义再赋值,也可以在定义的同时赋值;在定义变量的同时赋初值称为初始化

在变量定义中赋初值的一般形式为:

类型说明符 变量1=值1,变量2=值2,.......

3、枚举常量:枚举常量是要占用内存的,他在内存中开辟一个空间来存放枚举变量;其常量值在没有赋值时系统会默认给他的第一个变量赋值0,后面的依次为1、2...使用枚举类型的最大好处是使得程序可读性增强。

enum Sports
{
    //枚举常量
    basketball,
    score,
    tennis
};

int main()
{
    enum Sports s = basketball;
    printf("basketball = %d\n", basketball);
    printf("score = %d\n", score);
    printf("tennis = %d\n", tennis);
    return 0;
}

注:

(1)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用,隔开

(2)可以认为设定枚举成员的值,从而自定义某个范围内的整数

(3)枚举型是预处理指令#define的替代

(4)类型定义以分号;结束

4、常变量

const(c++中的关键字): const定义的是变量,但又相当于常量;说他定义的是常量,但又有变量的属性,所以叫常变量。用const定义常变量的方法很简单,就在通常定义变量时前面加const即可,如:

const int a = 10;

5、区分#define 和 const

要区分#define命令定义的符号常量和用const定义的常变量:

const定义的是变量而不是常量,只是这个变量的值不允许改变是常变量,带有类型,编译运行的时候起作用存在类型检查。

#define定义的是不带类型的常数,只进行简单的字符替换。在预编译的时候起作用,不存在类型检查。

五、格式化输入输出函数

1、格式化输入函数:scanf()

2、格式化输出函数:printf()

3、常用的转换控制符:

%d、%i以十进制格式输出一个整数
%o、%x以八进制格式输出一个整数
%c输出一个字符
%s输出一个字符串
%f输出一个单精度浮点数
%e以科学计数法格式输出一个双精度浮点数
%g以通用格式输出一个双精度浮点数
%%读取一个%字符

4、字符限定符:

"-": 左对齐格式输出

"*": 可变字段宽度

0: 0开头表示数据前面用0填充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值