理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法

本文主要是介绍理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    本期视频点击这里   

    在上一篇中,我们进行了Visual Studio 2013的安装以及第一个demo程序“HelloWorld”的建立。现在我们看一下其中的源代码及相关的C语言基础知识。打开工程,可以通过在源文件标签栏的右键菜单中快速打开源代码的所在目录。HelloWorld的简单代码:

#include <stdio.h> 
int main() 
{printf ( "Hello World! \n" ); return 0 ; 
}

1、C语言源代码的编译生成过程
        可以很明显地看出,我们编写的源文件实际上以一个文本文件的形式存在,其中以ASCII码表示的文本内容就是我们编写的C语言代码。而编译器所做的,就是将文本文件形式的源代码通过各种处理,最终生成可执行文件。这个可执行文件以及大多数的中间文件与源文件明显不同,他们属于二进制文件。
在编译生成过程中,编译器所做的工作主要有四个步骤:

①预处理:在这一阶段,IDE的预处理器会寻找以#开头的命令对源程序进行修改。如#include某个头文件,则会将该头文件的内容直接插入到源代码文件;而#define宏定义则会对源代码中的宏进行替换。此阶段得到的结果是另一个源文件,其长度远大于我们自己编写的源代码。

②编译:在编译时,IDE的编译器将刚刚预处理所生成的源代码中的语句进行处理和翻译,生成由汇编语言组成的程序;通常,在某个平台上(如X86)所使用的汇编语言大体是一致的,因此汇编语言可以将不同的高级语言的输出做一定的统一。通常,编译也是一种高级语言进行开发最重要的阶段。

③汇编:在汇编阶段,IDE的汇编器将上一步生成的汇编语言文件中的指令进行翻译,生成计算机可以识别的机器语言。这一步的输出称为目标文件,在VS的工程中生成的目标文件后缀名是.obj。

生成的目标文件

④链接:我们所编写的代码经常用到当前源文件之外所实现的函数,如demo中的printf函数就是如此。而这个函数最终实现的机器语言代码必须整合到当前工程的程序中,这一步就由IDE的连接器实现。经过链接之后,IDE就生成了包含所有必须资源的机器语言的文件,这就是最终生成的可执行文件。在Win平台下可执行文件的后缀名为.exe。


2、C程序中的函数
        一个C程序,无论大小,均是由函数以及其他辅助信息组成的。C语言的函数实现程序的运算功能,而变量用于储存计算的值。在HelloWorld这个Demo中,只存在一个函数就是main函数。main函数,即主函数是所有函数中比较特殊的一个,所有的C程序必须且只能有一个main函数,因为main函数是整个程序的入口点,所有的程序必须从main的起点开始执行。
        除了main函数之外,C源代码中还存在大量的库函数和程序员自定义的函数。如HelloWorld工程中的文字输出函数printf就是属于标准输入输出库的一个函数,包含在头文件stdio.h中,并在代码开始的预编译指令#include中引入。该函数的功能是格式化打印字符串到控制台中。由于该函数是最方便的输出数据的方式,因此在C控制台程序中的使用率也是最高的之一。
        自定义函数是程序员为实现自己的功能所实现的函数。在真正的C语言实践的工程中,自定义函数才是占据代码绝大多数的主体。在程序员编写的自定义函数中,根据需要调用包括输入输出等在内的库函数。

3、变量和表达式
        对于计算机程序来说,最核心的任务无非就是对器件的控制或者对数据的处理。无论承担哪一种任务,数据都是重要的因素。而变量在程序中主要作为数据的容器,几乎所有编程语言都需要相应的变量系统来支撑其功能的实现。在C语言中常用的变量主要有字符型(包括字符和字符串等)和数字型(包括整型和浮点型)等,此外还定义了结构体、共用体等组合数据类型用于处理更加复杂的问题。
        为了对变量进行处理,C语言中定义了多种运算符实现变量的多种计算。C语言中的基本运算符有+、-、*、/和%,分别表示求和、求差值,求乘积,求商以及求余数操作。此外,C语言还规定了多种其他的运算符构成算数表达式,不同的运算符按照不同的运算顺序规定了不同的优先级,其中最高的是括号()、数组索引[]、结构体成员.和->,最低的是逗号运算符','。另外,由赋值运算符构成的表达式为赋值表达式,赋值表达式可以为某个变量赋予一个新的值。

4、如何对C代码进行注释
        C程序中除了有效代码之外,还有另一个重要的部分就是注释。注释是代码文档的核心部分之一, 通常是对代码的功能、注意事项等重要信息的说明。在程序的生成和运行阶段,注释的所有信息都不会产生任何实际作用,因为从编译器开始注释的文字都将被忽略。C程序中对代码添加注释有两种方法。其一是将“//”符号添加到某一行文字的起始段,这样这整个一行都将被作为注释处理。另一种方法是通过符号/**/来注释部分文字,在/*和*/之间的所有字符都将被当做注释处理,这种注释方法可以注释掉一行的部分文字或者多行的文字,甚至可以用在语句的内部。

5、如何对程序进行调试
        单步调试是程序开发中最为重要的步骤之一。几乎所有的程序员,无论是具有多年经验的资深工程师,还是初学编程的新手,都几乎不可能一次编写出没有任何问题的程序。而单步调试是解决程序中出现的问题的最佳途径。在VS中,单步调试最主要用到的几个功能是断点的设定和取消、单步执行跳过、单步执行进入和调试运行到断点,分别用快捷键F9、F10、F11和F5实现。此外,VS中设置的断点不仅可以长期生效,也可以对断点的有效性添加条件,这样程序只有在运行到断点所在的语句并且满足预设的条件时才会中断,其他时候断点不发生作用。

设置断点并调试运行

        另外在调试运行过程中,还可以对代码进行反汇编,查看程序的汇编代码,并且对程序进行汇编指令级的调试。这项功能在排查很多疑难Bug时非常有效。
反汇编调试

这篇关于理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415391

相关文章

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔