| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 980 人关注过本帖, 2 人收藏
标题:main()函數返回碼在操作系統的使用
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(2)
 问题点数:0 回复次数:15 
main()函數返回碼在操作系統的使用
C/C++程序main()函數有一個返回值,通常返回整數。一般教材都說程序正常結束返回零即可,異常則返回非零,但其實這個返回值,到底怎麽用,很多人是不瞭解的。下面給個示例。

首先寫一個程序,代碼如下:
程序代码:
#include <stdio.h>
#include <conio.h>

int main(void)
{
    int ch;

    do
    {
        printf_s("\nPress A or B: ");
        ch = _getch();
    } while (ch != 'A' && ch != 'a' && ch != 'B' && ch != 'b');
    putchar(ch);
    putchar('\n');

    return (ch == 'A' || ch == 'a') ? 0 : 1;
}

這段程序,是在控制臺上接收用戶一個按鍵,按下A則返回0,按下B則返回1,僅此而已。

編譯這個程序,獲得.exe文件,轉到這個文件所在的目錄,用記事本寫一個go.cmd文本文件,内容如下:
程序代码:
@echo off
:start
test_04
@echo ExitCode is %errorlevel%
if not errorlevel 1 goto start
:end

這個指令文檔的意思,是執行剛才編譯得到的.exe程序(我用的文件名是test_04.exe,改爲自己實際的名稱),在程序結束後,首先輸出其返回值,即%errorlevel%,然後,判斷這個返回值是否爲1,衹要不是1,就重複執行;換句話説,就是衹有用戶輸入了B,即返回值爲1時,才能結束這個指令序列。

在文件管理器中,雙擊go.cmd即可執行之。


[ 本帖最后由 TonyDeng 于 2015-3-2 21:13 编辑 ]
搜索更多相关主题的帖子: color 
2015-03-02 21:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在這裏,我爲了説明問題,刻意選擇了衹有返回值爲1,批指令才結束,意思是說,并非衹有零才是“正常”結束,實際上。該怎麽用,是由你在go.cmd中決定的,不是什麽操作系統必須你返回零,不管返回什麽,程序都已經結束了——不返回,也根本不會有問題!

根據程序退出碼選擇後續動作,才是這個退出碼的本來意義,比如,你可以決定返回值爲1時啓動Word,返回值爲2時啓動Excel,諸如此類。main()函數的return值,正規的名稱是ExitCode,即退出碼,它是exit()函數的參數,exit()才是給操作系統的errorlevel變量賦值的,main()的return 0是調用exit(0),這個才是程序最後執行的動作。程序是由exit()結束,不是由main()結束。

C/C++程序的入口點(Entry point),通常是main(),但這個函數其實是可以改的,在鏈接Link的參數中,可以通過/ENTRY:函數名修改入口點,使得程序不是從main()開始,可以是別的名稱的函數。


[ 本帖最后由 TonyDeng 于 2015-3-2 21:33 编辑 ]

授人以渔,不授人以鱼。
2015-03-02 21:26
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
学习了

一片落叶掉进了回忆的流年。
2015-03-02 21:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
修改程序入口點的示例:

把上面程序代碼的main()改爲mymain(),cl的編譯指令包含如下參數(在IDE中亦可輸入):
/SubSystem:CONSOLE /Entry:"mymain"


[ 本帖最后由 TonyDeng 于 2015-3-3 13:11 编辑 ]

授人以渔,不授人以鱼。
2015-03-02 21:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把1樓的程序改成這樣,效果是完全一樣的:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void mymain(void)
{
    int ch;

    do
    {
        printf_s("\nPress A or B: ");
        ch = _getch();
    } while (ch != 'A' && ch != 'a' && ch != 'B' && ch != 'b');
    putchar(ch);
    putchar('\n');

    exit((ch == 'A' || ch == 'a') ? 0 : 1);
}



授人以渔,不授人以鱼。
2015-03-02 21:46
uswood
Rank: 2
等 级:论坛游民
帖 子:34
专家分:16
注 册:2014-3-29
收藏
得分:0 
学习了,谢谢!
2015-03-04 21:33
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
楼主,你是不是在响应一些人学习繁体字啊?
2015-03-05 10:37
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
能熟练使用DOS批处理命令,T版主是古董级人才啊!

能编个毛线衣吗?
2015-03-05 10:54
大爱CATs
Rank: 4
来 自:重庆
等 级:业余侠客
威 望:3
帖 子:108
专家分:250
注 册:2015-1-13
收藏
得分:0 
看完顶顶

弹指一挥间
2015-03-05 11:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用八画小子在2015-3-5 10:37:55的发言:

楼主,你是不是在响应一些人学习繁体字啊?

那是正體字。

授人以渔,不授人以鱼。
2015-03-05 11:28
快速回复:main()函數返回碼在操作系統的使用
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030533 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved