C语言调试方法
C语言中几种输出调试信息的方法

在调试程序时,输出调试信息是一种普遍、有效的方法。
输出调试信息一般有以下五种方法:方法一:直接使用屏幕打印函数printf。
该方法直接在需要输出调试信息的位置使用函数prin tf输出相应的调试信息,以及某些关键变量的值。
我们通过以下求阶层的函数f act来看看该方法的调试程序过程。
#include <stdio.h>int fact(int n){int i,f=1;for( i=1; i<=n; i++){f += i;}returnf;}int main(){printf( "4!=%d/n", fact(4) );return0;}程序1: 有bug的求阶层函数程序1编译运行的结果如下:4!=11结果错误。
为了找到结果错误的原因,我们在语句"f += i;"之后插入函数p rintf输出调试信息,如程序2。
#include <stdio.h>int fact(int n){int i,f=1;for( i=1; i<=n; i++){f += i;printf("i=%d ; f=%d/n", i, f);}returnf;}int main(){printf( "4!=%d/n", fact(4) );return0;}程序2: 加入函数pri ntf输出调试信息的求阶层函数再编译运行该程序,屏幕输出如下:i=1 ; f=2 i=2 ; f=4 i=3 ; f=7 i=4 ; f=11 4!=11原来语句"f += i"错了,应该为"f *=i"。
修改过来(见程序3),再编译运行,结果如下:i=1 ; f=1 i=2 ; f=2 i=3 ; f=6 i=4 ; f=24 4!=24 #include <stdio.h>int fact(int n){int i,f=1;for( i=1; i<=n; i++){f *= i;printf("i=%d ; f=%d/n", i, f);}returnf;}int main(){printf( "4!=%d/n", fact(4) );return0;}程序3: 修改正确的求阶层函数调试完成,bug找到,并修改正确。
C Free 5程序调试方法

C Free 5程序调试方法程序调试是软件开发过程中非常重要的一环,它可以帮助开发人员找出程序中的错误并进行修复。
在C语言中,程序调试是一项必不可少的技能。
本文将介绍C语言中常用的5种程序调试方法,以帮助开发人员更好地调试程序。
1. 使用printf语句调试:printf语句是C语言中最常用的调试工具之一。
通过在程序中插入printf语句,可以输出程序执行过程中的变量值、状态信息等,以便于观察程序的执行流程和变量的取值情况。
例如:```cint main() {int a = 10;printf("a的值为:%d\n", a);return 0;}```通过在程序中插入printf语句,可以观察到变量a的值为10,从而判断程序是否按照预期执行。
2. 使用断点调试:断点调试是一种常用的调试方法,它可以在程序执行过程中暂停程序的执行,以便于观察程序的执行状态和变量的取值情况。
在C语言中,可以使用调试器(如GDB)设置断点。
例如,在Linux环境下使用GDB调试程序,可以按照以下步骤设置断点:- 编译程序时加上-g选项,以便生成调试信息:```gcc -g program.c -o program```- 启动GDB调试器:```gdb program```- 设置断点:```break line_number```- 运行程序:```run```- 程序执行到断点处时会暂停,可以通过命令观察变量的取值情况,以及进行单步调试、查看栈帧等操作。
3. 使用assert宏调试:assert宏是C语言中的一个调试工具,它用于检查程序中的条件是否满足,如果条件不满足,则终止程序的执行,并输出错误信息。
使用assert宏可以在程序中插入一些断言,以确保程序的正确性。
例如:```c#include <assert.h>int divide(int a, int b) {assert(b != 0);return a / b;}int main() {int result = divide(10, 0);return 0;}```在上述代码中,使用assert宏判断除数b是否为0,如果为0,则终止程序的执行,并输出错误信息。
C语言代码混淆与反调试技术

C语言代码混淆与反调试技术在软件开发领域,保护源代码的机密性和安全性是非常重要的。
特别是对于C语言代码,为了防止反向工程和恶意利用,开发人员需要采取适当的措施来混淆代码,使其难以理解和逆向分析。
本文将介绍一些常见的C语言代码混淆和反调试技术,以帮助开发人员提高代码的安全性。
一、标识符和函数名混淆将C语言代码中的标识符和函数名进行混淆是一种常见的代码混淆技术。
通过修改变量和函数的命名,例如使用无意义的字母、数字或符号等代替原有的名称,可以使代码难以阅读和理解。
此外,还可以使用宏定义或函数指针来替代原有的函数调用,增加代码的复杂性。
这样一来,即使反向工程师获取了代码,也难以追踪和理解其中的逻辑。
二、代码逻辑的混淆除了名称的混淆,代码逻辑的混淆也是一种有效的代码保护手段。
通过增加无用代码、重复代码或者不符合常规逻辑的代码,可以迷惑调试工具和反向工程师,使其难以分析和理解程序的真正逻辑。
此外,还可以使用条件编译、宏定义等技术,根据不同的编译器或平台生成不同的代码逻辑,增加代码的复杂性和混淆度。
三、数据的加密和解密为了保护关键数据在内存中的安全性,开发人员可以采用加密和解密的方式来存储和使用数据。
可以使用对称加密算法或非对称加密算法对敏感数据进行加密,并在运行时进行解密。
通过这种方式,即使攻击者通过调试工具获取到内存中的数据,也无法直接获得明文数据,提高了代码的安全性。
四、调试的防护措施为了防止程序被调试和逆向工程,开发人员还可以采取一些反调试技术。
例如,通过检测调试器是否存在、检测调试器的运行状态等方式来发现调试器的存在,并采取相应的应对措施。
另外,还可以使用反调试的函数来检测调试器的运行状态,并在发现调试器存在时执行恶意逻辑或退出程序,从而使反向工程师难以分析和逆向程序。
总结:C语言代码混淆和反调试技术在保护软件安全性方面起着重要作用。
通过混淆标识符和函数名,混淆代码逻辑,加密关键数据以及防护调试等手段,可以有效提高代码的安全性和抵抗逆向工程的能力。
C语言调试方法范文

C语言调试方法范文C语言是一种非常流行的编程语言,但是在编写程序时,不可避免地会遇到各种错误和问题。
为了解决这些问题,开发人员需要使用调试工具和方法进行调试。
一、调试工具1.编译器:大多数编译器都提供了调试功能,可以在编译时生成调试信息和符号表,帮助开发人员定位问题。
2. 调试器:调试器是一种能够暂停程序运行并允许程序员检查程序状态的工具。
常用的调试器包括GDB、Visual Studio等。
3.打印输出:在程序中插入打印语句,将关键变量的值输出到控制台,以便程序员查看程序的执行过程和变量的值。
二、调试方法1.分析错误信息:当程序出现错误时,编译器和调试器通常会提供详细的错误信息,开发人员可以根据这些信息找出错误所在的位置,并分析错误产生的原因。
2.逐行调试:通过调试器逐行执行程序,观察每一步的执行结果,排除可能的问题。
3.断点调试:在关键位置设置断点,程序运行到该位置时会暂停,开发人员可以查看当前的变量值和程序状态,分析问题所在。
4.查看变量值:调试器可以提供查看变量值的功能,开发人员可以通过观察变量的值变化,找出程序中的错误。
5.测试边界条件:在编写程序时,特别是涉及循环和条件语句时,要注意测试边界条件,以确保程序在各种情况下都能正确运行。
6.剖析代码:通过在代码中插入打印语句,观察程序的执行流程,找出程序中的逻辑错误。
7.使用IDE工具:集成开发环境(IDE)通常会提供一些辅助调试功能,如变量查看、跟踪执行流程等,方便开发人员调试程序。
三、常见调试技巧1.打印调试信息:在程序中插入打印语句,输出关键变量的值和程序的执行流程,以便分析程序的执行过程。
2.编写测试用例:编写一些简单的测试用例,包括边界情况,验证程序的基本功能是否正常。
3.二分法调试:如果程序中存在大量代码和复杂逻辑,可以通过二分法调试,将程序分成多个模块,逐个调试,可以更快地找出问题所在。
4.查找常见错误:有些错误比较常见,如内存越界、指针错误等,开发人员可以通过检查这些常见错误来快速定位问题所在。
C语言中几种输出调试信息的方法

C语言中几种输出调试信息的方法C语言中有多种方法可以输出调试信息,下面列举了几种常见的方法:1. 使用printf函数:这是最简单直接的方法,通过在代码中插入printf语句来输出调试信息。
例如:printf("Debug information\n");2. 使用宏定义:通过定义一系列的宏来简化输出调试信息的代码。
例如:#define DEBUG printf("Debug information\n");3. 使用条件编译:通过在代码中插入条件编译语句,只有在特定条件满足时才输出调试信息。
例如:#ifdef DEBUG printf("Debug information\n"); #endif4. 使用log文件:将调试信息输出到一个log文件中,便于查看、分析。
可以使用标准库函数fopen和fprintf来实现。
例如:FILE *fp = fopen("debug.log", "a"); fprintf(fp, "Debug information\n"); fclose(fp);5. 使用系统日志:调用系统提供的日志函数,将调试信息输出到系统日志中,方便系统管理和追踪调试信息。
例如:syslog(LOG_DEBUG, "Debug information");6.使用调试器:使用调试器对程序进行断点调试,可以逐行查看代码执行过程、变量的值等。
常用的调试器有GDB、LLDB等。
7. 使用assert断言:通过使用assert宏来检查程序中的逻辑错误,并在条件判断失败时输出相应的错误信息。
例如:assert(x > 0);8. 使用日志库:使用第三方的日志库,如Log4c、Glog等,这些库提供了更为丰富的日志输出功能,可以控制日志输出的级别、格式等。
关于C语言跟踪调试方法

关于C语言跟踪调试方法C语言是一种编译型语言,跟踪调试是在程序执行过程中进行代码行跟踪和变量值监视的过程。
跟踪调试可以帮助开发人员检测和修复程序中的错误,提高代码质量和程序性能。
下面将介绍一些常用的C语言跟踪调试方法。
1.嵌入式输出嵌入式输出是一种最简单和最基础的调试方法。
通过在代码中插入一些输出语句,将关键变量的值输出到终端或日志文件中,以便开发人员查看程序的执行过程和变量的取值。
例如,在C语言中可以使用`printf`函数输出调试信息。
优点:简单易用,适用于简单的调试需求。
缺点:需要手动在代码中插入输出语句,可能会导致代码冗余。
2.断点调试断点调试是一种常用的调试方法。
通过在程序中设置断点,可以暂停程序的执行,并查看变量的值和代码的执行流程。
在C语言中,可以使用多种集成开发环境(IDE)或调试器工具来设置和管理断点。
优点:可以准确地掌握程序的执行流程和变量的值。
缺点:需要依赖调试器工具和IDE。
3.单步执行单步执行是一种逐行执行代码的调试方法。
在单步执行模式下,程序会逐行执行,开发人员可以根据需要逐行查看程序的执行过程和变量的取值。
在大部分调试器中,可以使用以下单步执行指令:- 向前单步执行(Step Over):执行当前行,并将控制权移交给下一行。
如果下一行是一个函数调用,会一起执行函数体,并将控制权移交回调用函数的下一行。
- 进入单步执行(Step Into):执行当前行,并进入函数调用。
如果当前行是一个函数调用,会进入调用的函数中。
- 跳过单步执行(Step Out):在一个函数中执行到一半时,我们可以选择跳过单步执行,直接执行到函数返回的地方。
优点:可以精确地追踪代码的执行过程。
缺点:程序的逻辑可能过于复杂,逐行单步执行可能会增加调试时间。
4.条件断点条件断点是一种在特定条件下暂停程序执行的调试方法。
在C语言中,可以设置条件断点来跟踪特定的变量或值。
如果条件满足,则程序会在设置的断点处暂停执行。
c语言单步调试的步骤

C语言单步调试步骤单步调试是程序员在开发过程中常用的调试方法,它可以帮助我们逐步执行代码,检查每一步的结果,从而找出问题所在并进行修复。
下面是C语言单步调试的一般步骤:1. 编译代码在使用调试器之前,首先需要将代码编译成可执行文件。
在终端或IDE中输入编译命令,将源代码编译成可执行文件。
例如,使用gcc编译器编译C语言源代码:```bashgcc -o program program.c```2. 启动调试器调试器是一种用于单步执行程序的工具,它可以让我们观察程序在每一步执行时的状态。
在Linux系统中,常用的调试器有gdb和lldb等。
启动调试器并加载可执行文件:```gdb program```3. 设置断点断点是用于暂停程序执行的位置。
在调试过程中,我们通常在程序的关键位置设置断点,以便观察变量值和程序状态。
在调试器中设置断点:```phpbreak main```上述命令将在main函数处设置断点。
我们可以根据需要设置多个断点。
4. 开始调试在设置好断点后,使用调试器的“run”命令开始执行程序:run```程序将执行直到遇到断点并暂停。
5. 检查变量当程序在断点处暂停时,我们可以检查变量的值和程序状态。
在gdb中查看变量值:```phpprint variable_name```可以使用上述命令查看变量值。
我们还可以使用其他调试命令来检查程序状态。
6. 单步执行使用调试器的“step”命令单步执行程序:step```如果遇到函数调用,使用“next”命令逐行执行函数:```arduinonext```7. 观察输出在调试过程中,我们可以观察程序的输出以了解程序的执行情况。
在终端中查看输出:```bashprogram arg1 arg2 ...```8. 修复错误根据调试过程中的观察和检查,我们可以找到并修复代码中的错误。
修复错误后,重新编译并启动调试器进行测试。
9. 重复调试重复执行上述步骤,直到程序能够正确执行并完成预期结果。
C语言编程常见错误和程序调试

15.1 C语言编程常见错误如果提示工具连接错误,则表示KEIL安装程序有问题,重新卸载,并全部删除后重新再进行安装后即可。
15.2 KEILC程序调试常见错误pling :C:\8051\MANN.CError:318:can’t open file ‘beep.h’说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中pling:C:\8051\LED.CError 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的3.WARNING 206:’DelayX1ms’: missing function-prototypeC:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作声明解决方法编写DelayX1ms 的内容编写完后也要作声明或作外部声明可在delay.h 的包含档声明成外部以便其它函数调用4.***WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去5.***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
World”application,然后点击“Finish” ,如图 0-7 所示。
图 0-6 创建工程后的界面
图 0-7 创建一个类似于输出 Hello,World 的工程
系统创建工程后, 在工作空间的 ClassView 视图中, 打开 “类树” 中的 Global, 可以见到主函数 main,双击主函数 main,系统打开相应的源文件(与工程名同, 扩展名为 cpp),如图 0-8 所示。可以更改这个源文件代码为自己的程序。 注意:更改时,不要将编译命令“ #include "stdafx.h" ”丢掉。 注意:方法 1 和方法 2 的区别有两点:1)方法 1 没有建立任何文件此后 可以添加.c 的源文件,也可以添加.cpp 源文件;2)方法 2 建立了程序框架和一 个带主函数的.cpp 源文件。 ..c 的源文件使用 c 编译器,.cpp 文件使用 C++的编 译器,二者是有区别的。 二、添加源程序 1. 源文件的添加
2. 建立工程 方法一:建立空的工程后添加源文件。 启动 VC 环境后,选择“File”菜单中的“New”项,弹 出图 0-3 所示的对话框。 其标签项自动选择为 “Projects” (工 程)。作为初学者,在左侧的列表中选择倒数第 3 项“Win32 Console Application” (win32 控制台应用), 在右侧 “Project Name”文本框中输入欲建立的工程名称,如:Example01。在 “Location” (位置)中选择工程的存放位置(最好为课程建一个总文件夹),点击 “OK” ,系统出现建立工程的导航对话框,如图 0-4 所示。
控制台程序窗口。
图 0-15 程序运行的控制台窗口 口口 四、调试程序 1.跟踪程序的运行 下面以程序 3 为例,看看如何跟踪程序的运行。该程序 的功能是计算一个拱形门的面积,最后输出拱形门的面积和 高。如图 0-16,假定拱形门是由半圆和正方形相接组成。 /* 程序 3 */ w #include"stdio.h" #define PI 3.14159 void main() 图 0-16 拱形门 { float w,area,heigh; printf("本程序计算拱形门的面积和高,请输入拱形门的宽度\n"); scanf("%f",&w); area=(float)PI*w*w/2.0; area=area+w*w; printf("宽度为%.3f 的拱形门面积为:%.3f\n",w,area); heigh=w+w/2; printf("拱形门高度为:%.3f\n",heigh); } 调试程序的方法主要以单步执行程序为主, 也可以采用设置断点的方法, 依 次运行到断点之处。无论是单步还是设置断点,都是为了观察变量的内部状态, 结合窗口的输出,判断程序是否按照预定的逻辑正确执行。 跟踪程序运行的技术主要有使用功能键 F5、F10、F11 和设置断点。F10 的 作用是单步执行一条语句,但是不跟踪进入所调用的函数(若有的话),这叫做 “step over”——单步越过(越过),而 F11 的作用是单步执行,遇到函数调用 时,程序执行点进入函数,这叫做“step into”——单步进入(步入)。F5 的功 能是从程序当前执行点开始一直向后执行,直到遇到断点,或执行到程序结束。 F5 常常配合断点的使用。 建立工程、输入程序、编译无误后,按 F10 键,并再按 2 次 F10 键,集成环 境的界面如图 0-17,对应程序高级语言源程序的控制台窗口见图 0-18.
在图 0-9 中,选择“C++Source Files”(C++源文件),在右边的 File 文本 框中填写文件名(一定要带有扩展名,.c 或.cpp,它们的编译器不同),然后单 击“OK” ,系统为使用者建立源文件并打开,右边的文本编辑区,就是展示源文 件内容的窗口。 图 0-10 是为工程 example01 添加了源文件 exam01.c 后,并展开 了 Source Files 文件夹(单击其前面的“+”号)后的界面。
键入此程序后,经编译,在输入窗口中得到编译错误信息,如图 0-14 所示。 其中指出,程序有两处错误,3 处警告。信息较长较多时,可以滚动水平和 垂直滚动条,来查看某条信息。也可以双击其中某个信息,使信息出现在最下边 (蓝底白字部分)。 双击某个信息的同时, 在编辑框的左边框的对应行上, 将出现一个蓝色箭头, 指明出错的位置。 错误信息的格式是: 源文件路径文件名(行号):错误类别 错误代号:错误对象名:错误原因。 如: e:\example02\exam02.c(3) : error C2065 : ‘area’ : undeclared indentifer. 是说: 源文件 exam02.c 的第 3 行,有错误,错误代码是 C2065,即’area’错误, 原因是标识符没有定义。 查其代码行可知,由于在变量 r 与 area 之间使用了分号。原本打算将它们 都定义为 float 型,应该使用逗号。使用分号将使 area 失去类型。
图 0-5 创建工程的信息
在图 0-6 中,窗口左侧为“Workerspace”(工作空间)窗口,下部窗口为 “Output”(输出)窗口。在 workerspace(工作空间)窗口中有两个视图标签: ClassView(类视图)和 FileView(文件视图)。前者按照 C++ “类”的管理方式展 现 C/C++的源代码,后者按照文件的组织方式展现 C/C++的源代码。点击标签的 名称,可以在二者之间切换显示。 接下来的操作是为工程增加一个源文件,具体步骤见第二节。 方法 2:建立框架工程后更改源文件 在建立工程,系统弹出建立工程的导航对话框后,选择第 3 项,A“Hello,
文本选择 除了用鼠标拖动选择外,双击选择可以选择一个词汇(变量名、 函数名等);如果打算选择单行代码,可以在文本窗口左侧的边框上、该行的前 面单击鼠标左键,即可完成单行的选择,如图 0-12 所示。如果打算选择多行, 可在窗口左侧的边框上,按下鼠标左键进行拖动。
ቤተ መጻሕፍቲ ባይዱ
图 0-11 源文件的缩进书写方式 全文操作 全 文选择可以使用快捷键 ctrl+a。 全文缩进 整个源程序按照格式进行缩进可以使用快捷键 alt+F8,当然,必 须事先选择全文。 取消与恢复 前次的操作可以用快捷键 ctrl+y 取消;而刚刚被取消的操作可以用快捷键 ctrl+z 恢复。 三、编译与运行 1. 编译 当将程序 1 键入之后,可点击菜单“build”中 的“Rebuild All” ,系统会对源文件及整个工程进行 编译,编译完成后再进行连接,最终生成可执行程序(.exe)。也可以点击菜单第 2 项或按 F7 生成可执行程序。如图 0-13 所示。 系统进入编译时,在下面将出现 output 窗口,其中给出编译和链接过程中 的语法检查信息。如果有错,给出错误信息。这些信息包括错误行、类别 错误 代号:错误对象名:错误原因。 2. 排除语法错误 编译的一项任务就是排除程序中的语法错误, 下面以一个计算圆的面积的程 序(程序 2a)为例,说明 VC6.0 对基本语法错误的检查。 /* 程序 2a */ void main() { float r; area; printf("本程序计算圆的面积,请输入圆的半径\n"); scanf("%f",&r); area=PI*r*r; printf("半径为%.3f 的圆面积为:%.3f\n",r,area); }
图 0-14 程序 2 的编译输出信息
另一个错误是标识符 PI, 本意是 PI 作为符号常量, 程序中漏写了#define PI 3.14159。而关于 prinft 和 scanf 的警告是由于没有包含头文件 stdio.h。 最终将程序改正为程序 2b,则可以通过编译。 /* 程序 2b */ #include"stdio.h" #define PI 3.14159 void main() { float r,area; printf("本程序计算圆的面积,请输入圆的半径\n"); scanf("%f",&r); area=(float)PI*r*r; printf("半径为%.3f 的圆面积为:%.3f\n",r,area); } 注意:警告级错误不会停止编译,可以连接,也可以执行程序。而错误是 必须要改正的。作为编程经验,除非错误明显,一般每改正第 1 个错误后就要再 进行编译。若还有错,再改正第 1 个错误,...,直至排除全部错误。在错误列 表中, “后面的”错误往往是前面的错误造成的,改了前面的错误,后面的错误 有些也会跟着消逝。但有时改了前面的错误后,可能会出现更多的错误,遇到这 种情况不要轻易怀疑是否前面改错了,因为可能是在改正后,下面的程序面又出 现了更严重错误,而这个错误又引起了更多的新错误。 3. 运行程序 在图 0-13 所示的 build 菜单中, 有一个带有叹号图标的菜单项——Execute (执行)example01.exe, (其快捷方式为 Ctrl+F5) ,点击它,或者按 Ctrl+F5 就 可以直接运行程序。如图 0-15 就是运行时的控制台窗口。 要运行程序,还有另一个方法。它与上述方法不同,叫做调试运行,在图 0-13 build 菜单中的 Start Debug(开始调试)子菜单中。这种运行方法适于分步 调试程序,观察程序内部运行状况,排除错误逻辑。这样方法将在以后各章节的 调试习题中加以介绍。 不过两种运行程序方法的区别是,前者运行完程序后,控制台窗口等待按任 意键关闭, 让程序结果停留在窗口画面上。而后者则在程序运行完毕后直接关闭
按照方法一建立工程后,整个工程是一个完全空的架子,没有任何源文件。 此时,单击菜单“File” ,再次选择“New” ,系统弹出与图 0-3 一样的对话框, 不过,此时的对话框默认的标签是“Files” ,如图 0-9 所示。