C语言main函数返回值详解

14 篇文章 0 订阅

前言:本文程序代码均在Windows + mingw64环境下编译完成(gcc)

 

C语言的main函数有两个标准写法

// C99加入两种 main 标准写法
int main(void)    // 标准一写法
// 和
int main(int argc,char *argv[])    // 标准二写法
int main(int argc,char **argv)     // 等介于标准二写法

// ==================================================

// 但C99之前就比较随便了,如下边两种写法比较常见于VC6.0(C89)
main()
void main()    // 单片机上这种写法比较多,因为不用返回给系统

main函数返回值说明

从C99开始,规定main函数必须返回一个int变量值,其值是返回给系统用的

main函数的返回值,用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。

返回非零值代表程序异常退出,而main函数给返回个0,则表示“非异常退出”,即正确执行并退出。

 正常情况下写的C语言程序则可以从如下代码开始:

#include <stdio.h>

int main(int argc, char* argv[])
{
    // 我要写的程序代码开始位置
    return 0;    // 执行正确并退出
}

// 或

#include <stdio.h>

int main(void)
{
    // 我要写的程序代码开始位置
    return 0;    // 执行正确并退出
}

main函数返回值应用举例

很多时候要完成一个问题,需要几个程序按顺序的去执行,如果有一个程序执行错误,后边的程序就不执行了。

这里有两个简单的C语言程序

程序1:

// Hello.c
#include <stdio.h>

int main(void)
{
    printf("Hello\n");
    return 0;    // 返回个正确执行并退出值
}

程序2:

// World.c
#include <stdio.h>

int main(void)
{
    printf("World\n");
    return 1;    // 返回个非零值(错误值)
}

对这两个程序进行编译和执行,显示如图:

编译程序
程序执行显示截图

echo %ERRORLEVEL%   // 为输出上一次程序执行的返回值

Linux系统下为echo $?

 接着多个程序的执行,执行过程如下:

# 第一次执行两个程序
E:\测试时间>Hello.exe && World.exe
Hello
World

# 第二次执行两个程序(顺序换一下)
E:\测试时间>World.exe && Hello.exe
World

E:\测试时间>

 

两个程序不同顺序执行结果截图

 

 执行过程说明:

  1. 第一次执行:Hello.exe && World.exe 两个程序都执行且输出相应的字符串
  2. 第二次执行:World.exe && Hello.exe 只有World.exe执行输出,而Hello.exe并没有执行输出

&& 说明:连接二个命令的。前面的命令执行正确后才会执行后面的命令。 

 

实例(获取被调用程序返回值)

在实际应用程序开发过程中,经常会调用到其它程序来完成一些事情,比如很多程序会调用nmap这款著名的扫描程序等。

这里简单举例一下调用外部程序执行

被调用程序源代码(辅程序):

// tex.c
#include <stdio.h>
#include <conio.h>

int main(int argc,char *argv[])
{
    printf("Hello World!\n");
    for(int i = 0; i<argc; i++)
    {
        printf("argv[%d]:%s\n",i,argv[i]);    // 打印程序参数
    }
    getch();    // 暂停一下,免得程序一闪而过
    return 0;
}

调用程序源代码(主程序):

// wo.c
#include <stdio.h>
#include <conio.h>
#include <windows.h>

int main(void)
{
    DWORD dwExitCode = 0;
    SHELLEXECUTEINFO ShExecInfo = {0};        // ShellExecuteEx调用例程及定义
    ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    ShExecInfo.hwnd = NULL;
    ShExecInfo.lpVerb = ("open");
    ShExecInfo.lpFile = ("tex.exe");//要调用程序的文件
    ShExecInfo.lpParameters = ("我要给tex程序的参数 >><<");//传递给要调用执行程序的参数
    ShExecInfo.lpDirectory = NULL;
    ShExecInfo.nShow = SW_SHOW;
    ShExecInfo.hInstApp = NULL;
    ShellExecuteEx(&ShExecInfo);  // 可生成句柄,供WaitForSingleObject调用
    WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
    GetExitCodeProcess(ShExecInfo.hProcess, &dwExitCode);//获取程序执行返回的结果
    printf("Exit code(Read) : %d\n", dwExitCode);
    return 0;
}

编译程序:

执行程序,调用过程:

程序执行时

 被调用程序执行完后,返回调用程序的显示结果:

程序执行结束显示结果

后语

 

main函数的返回值是个比较重要的环节,最好养成一个好习惯。

在很多新手里最多使用的是:“return 0” 不管程序是执行正确还是错误,统统都是:“return 0”,比较不好的习惯。

实际上可以自定义返回值,根据不同情况返回不同值,方便程序执行过程中就可以得知程序是那个环节出现问题等。

而程序最好使用 int main(int argc,char *argv[]) 来定义自己的程序入口,让参数来完成相应的功能,而不是打开程序就执行程序全部功能,方便以后调用自己的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值