C/C++ main用法總結

今天看到一篇很好的文章,詳細的講解了C、C++中的main函數,以及returne的用法。轉載過來大家一起分享下。
轉自:http://www.cnblogs.com/ct6816678/archive/2012/10/26/2741824.html

return是C++預定義的語句,當return語句提供了一個值時,這個值就成為函數的返回值.?

很多人甚至市面上的一些書籍,都使用了void main( ) ,其實這是錯誤的。C/C++ 中從來沒有定義過void main( ) 。
C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地寫著
The definition void main( ) { /* ... */ } is not and never has been C++, nor has it even been C. ( void main( ) 從來就不存在于 C++ 或者 C )。下面我分別說一下 C 和 C++ 標準中對 main 函數的定義。
?

1. C?


在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的經典巨著 The C programming Language 2e(《C 程序設計語言第二版》)用的就是 main( )。此處已經驗證!在他們敘說符號常量的一節中,這樣舉例的:
[cpp] view plaincopyprint?
  1. #include<stdio.h>??
  2. #define?LOWER?0??
  3. #define?UPPER?300?//如果直接使用300?會讓人有點無法理解,賦予它們有意義的名字。開始時候用前者,編譯的時候用后者替換??
  4. #define?STEP?20?//此時UPEER等為符號常量,符號常量替換數字??
  5. main(){??
  6. ??int?fahr;??
  7. ??for(fahr=LOWER;fahr<=UPPER;fahr+=STEP)??
  8. ??????printf("%3d?%6.1f\n",fahr,(5.0/9.0)*(fahr-32));??
  9. }??
不過在最新的 C99 標準 中,只有以下兩種定義方式是正確的:?
[cpp] view plaincopyprint?
  1. int?main(?void?)???
  2. int?main(?int?argc,?char?*argv[]?)???
當然,我們也可以做一點小小的改動。例如:char *argv[] 可以寫成 char **argv;argv 和 argc 可以改成別的變量名(如 intval 和 charval),不過一定要符合變量的命名規則。?
如果不需要從命令行中獲取參數,請用int main(void) ;否則請用int main( int argc, char *argv[] ) 。?
main 函數的返回值類型必須是 int ,這樣返回值才能傳遞給程序的激活者(如操作系統)。?
如果 main 函數的最后沒有寫 return 語句的話,C99 規定編譯器要自動在生成的目標文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不 過,我還是建議你最好在main函數的最后加上return 語句,雖然沒有這個必要,但這是一個好的習慣。注意,vc6不會在目標文件中加入 return 0; ,大概是因為 vc6 是 98 年的產品,所以才不支持這個特性。現在明白我為什么建議你最好加上 return 語句了吧!不 過,gcc3.2(Linux 下的 C 編譯器)會在生成的目標文件中加入 return 0; 。?

2. C++?


C++98 中定義了如下兩種 main 函數的定義方式:?
[cpp] view plaincopyprint?
  1. int?main(?)???
  2. int?main(?int?argc,?char?*argv[]?)???
int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定義的一樣。同樣,?main 函數的返回值類型也必須是int。如果main函數的末尾沒寫return語句,C++98 規定編譯器要自動在生成的目標文件中加入 return 0;?。同樣,vc6 也不支持這個特性,但是 g++3.2(Linux 下的 C++ 編譯器)支持。?

3. 關于 void main?


雖然在一些編譯器中,void main 可以通過編譯(如 vc6),但并非所有編譯器都支持 void main ,因為標準中從來沒有定義過 void main 。g++3.2 中如果 main 函數的返回值不是 int 類型,就根本通 不過編譯。而 gcc3.2 則會發出警告。所以,如果你想你的程序擁有很好的可移植性,請一定要用 int main 。?

4. 返回值的作用?


main 函數的返回值用于說明程序的退出狀態。如果返回 0,則代表程序正常退出,否則代表程序異常退出。下面我們在 winxp 環境下做一個小實驗。首先編譯下面的程序:?
[cpp] view plaincopyprint?
  1. int?main(?void?)???
  2. {???
  3. ?????return?0;???
  4. }???
然后打開附件里的“命令提示符”,在命令行里運行剛才編譯好的可執行文件,然后輸入“echo %ERRORLEVEL%”,回車,就可以看到程序的返回 值為 0 。假設剛才編譯好的文件是 a.exe ,如果輸入“a && dir”,則會列出當前目錄下的文件夾和文件。但是如果改成 “return -1”,或者別的非 0 值,重新編譯后輸入“a && dir”,則 dir 不會執行。因為 && 的含義是:如果 && 前面的程序正常退出,則繼續執行 && 后面的程序,否則不執行。也就是說,利用程序的返回 值,我們可以控制要不要執行下一個程序。這就是 int main 的好處。如果你有興趣,也可以把 main 函數的返回值類型改成非 int 類型 (如 float),重新編譯后執行“a && dir”,看看會出現什么情況,想想為什么會出現那樣的情況。順便提一下,如果輸入 a || dir 的話,則表示如果 a 異常退出,則執行 dir 。
?

5. 那么 int main(int argc,char *argv[],char *envp[])呢??


這當然也不是標準 C 里面定義的東西!char*envp[] 是某些編譯器提供的擴展功能,用于獲取系統的環境變量。因為不是標準,所以并非所有編譯器都支持,故而移植性差,不推薦使用。?

只要一個函數的返回值是數字型的,那么就可以返回0(即return 0),其實你返回多少都沒問題。一般情況下,C++做出來的函數都要求返回一個值, 當函數執行正常,且達到了一般情況下的目的,那么就返回0表示正確的調用了該函數,這個0就是返回給主調函數以通知沒有出錯的;如果函數調用中出錯,或者 沒有按照一般情況執行,那么就返回1,以告知主調函數采取響應策略;如果你在某個函數所在類的定義所在的頭文件中定義了一組狀態值(一般都是負整數),那 么函數就可以返回不同的值以告之主調函數具體發生了什么異常或錯誤,?這種情況一般用于函數功能獨立性較差的的情況。所以一般不鼓勵把函數返回類型定義為void,至少返回應該是int,而在函數的最后加上return 0.語句:?

在函數中,如果碰到return 語句,那么程序就會返回調用該函數的下一條語句執行,也就是說跳出函數的執行,回到原來的地方繼續執行下去。但是如果是在主函數中碰到return語句,那么整個程序就會停止,退出程序的執行。?

總之,return 的返回類型一定是函數的定義時候的類型。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449798.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449798.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何將數據寫入excel中,而不覆蓋原有數據

之前直接用pandas庫&#xff0c;然后to_excel&#xff08;&#xff09;&#xff0c;結果直接將原始數據直接覆蓋&#xff0c;幸虧有備份。&#xff08;友善提醒&#xff0c;做數據處理之前&#xff0c;先將數據本地備份一份&#xff0c;確認完全沒有問題&#xff0c;然后還是備…

對List集合中的元素進行排序

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ollections對List集合中的數據進行排序 有時候需要對集合中的元素按照一定的規則進行排序&#xff0c;這就需要用到 Java中提供的對集合…

Jmeter----5.1 設置中文

注意&#xff1a;JMeter5需要Java8 以上&#xff0c;本文環境是Win7 64位 設置永久默認漢化&#xff1a;在Jmeter的安裝目錄下的bin目錄中找到 jmeter.properties這個文件&#xff0c;用文本編輯器打開。在#languageen下面插入一行languagezh_CN 這樣&#xff0c;再次打開Jmete…

pandas計算移動平均值

本人今天遇到遇到一個任務&#xff0c;計算同月份合約當天各合約總持倉量的移動平均值。立刻寫下了這個函數&#xff1a; group df.groupby([合約系列,date]) f pd.DataFrame(group[持倉量].sum().rolling(20).mean()) 上交后&#xff0c;提出要求&#xff0c;不行&#xff…

一個優美的架構需要考慮的幾個問題

隨著公司的架構逐步發展&#xff0c;越來越多的問題被提出來&#xff0c;也發現一個良好的技術架構需要考慮的問題 1 架構的可擴展性 這里面又包括以下幾個方面 水平垂直可拆分服務無狀態數據可緩存可異步處理&#xff08;提高性能&#xff09;可復制&#xff08;提高效率&…

HSTS的來龍去脈

前言 安全經常說“云、管、端”&#xff0c;“管”指的是管道&#xff0c;傳輸過程中的安全。為了確保信息在網絡傳輸層的安全&#xff0c;現在很多網站都開啟了HTTPS&#xff0c;也就是HTTPTLS&#xff0c;在傳輸過程中對信息進行加密。HTTPS使用了對稱加密、非對稱加密、消息…

利用XShell上傳、下載文件(使用sz與rz命令) 超實用!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 rz、sz 安裝方式&#xff1a;sz/rz命令安裝方式 借助XShell&#xff0c;使用linux命令sz可以很方便的將服務器上的文件下載到本地&#…

quantaxis使用docker安裝,解決了一個很奇特的問題

之前使用docker-compose pull 更新之后&#xff0c;使用docker-compose up進行安裝。出現 qaweb顯示address already in web,cmd中顯示Starting qa_web is wrong。之前一直覺得什么毛病啊&#xff0c;試了很多辦法。 比如關閉8010接口&#xff1a; netstat -ano|findstr “801…

基礎數學落后與高端人才流失

這個話題令人感到很痛苦&#xff0c;也很無奈。我本不該提起這個話題。但是&#xff0c;無窮小微積分專業網站不久即將開通&#xff0c;我不得不認真備課&#xff0c;仔細研讀 J.Keisler 的“初等微積分”電子版教材。在研究該教材內容的過程中&#xff0c;參照國內的《高等數學…

Datawhale MySQL 訓練營 Task2 查詢語句

目錄 MySQL 管理MySQL 用戶管理 參考數據庫管理SQ查詢語句1. 導入示例數據庫&#xff0c;教程 MySQL導入示例數據庫2. 查詢語句 SELECT3. 篩選語句 WHERE &#xff0c;過濾4. 分組語句 GROUP BY5. 排序語句 ORDER BY6. 函數作業總結MySQL 管理 MySQL版本 8.0.15 MySQL 用戶管理…

記錄一個相當好用的反編譯工具下載地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 下載地址見&#xff1a;https://download.csdn.net/download/stoneepigraph/9817144 下載后直接雙擊該程序就可以用&#xff0c;十分方便…

2021-07-09

#先引入后面可能用到的包&#xff08;package&#xff09; import pandas as pd from datetime import datetime import backtrader as bt import matplotlib.pyplot as plt %matplotlib auto #正常顯示畫圖時出現的中文和負號 from pylab import mpl mpl.rcParams[font.sans…

Patrick Wyatt:代碼沒問題 程序卻有bug?

摘要&#xff1a;相信每個程序員都遇到過“不可能的bug”&#xff0c;代碼沒有任何問題卻出錯了&#xff01;問題肯定是出在操作系統上&#xff0c;或者是工具&#xff0c;甚至是因為計算機硬件的問題&#xff1f;&#xff01;&#xff1f;當然&#xff0c;魔獸之父也不例外&am…

視差滾動(Parallax Scrolling)插件補充

13. Windows Windows (github) 是一個讓你用占據整個屏幕的section來構建單面網站的插件。該插件提供給你一些回調函數&#xff0c;當新的section出現在可視區并且并且處理快照時被調用&#xff0c;所以你可以輕松的繼承它來自定義導航菜單或更多的東西。下面是一個例子&#x…

主流瀏覽器內核

IE trident Firefox Gecko Google chrome Webkit/blink Safar i Webkit Opera presto轉載于:https://www.cnblogs.com/codezhao/p/10451030.html

Quartz使用總結、Cron表達式

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Quartz可以用來做什么&#xff1f; Quartz是一個任務調度框架。比如你遇到這樣的問題 想每月25號&#xff0c;信用卡自動還款想每年4月…

股票數據庫建立

import akshare as ak import baostock as bs import pandas as pd import datetime bs.login()stk_list_place D:/stk_list.csv #股票代碼表存儲地址 stk_place D:/Data/ #股票數據存儲地址 def update_stk_list(dateNone):#獲取指定日期的指數、股票數據stock_rs bs.qu…

利用redis實現分布式鎖:加鎖與解鎖

待補充轉載于:https://www.cnblogs.com/csuliujia/p/10451462.html

MVC日期格式化,后臺使用Newtonsoft.Json序列化日期,前端使用”f”格式化日期

MVC控制器中&#xff0c;經常使用Newtonsoft.Json把對象序列化成json字符串傳遞到前端視圖。當對象中有DateTime類型的屬性時&#xff0c;前后臺如何處理才能把DateTime類型轉換成想要的格式呢&#xff1f; 有這樣的一個類具有DateTime類型屬性&#xff1a; using System; name…

多股回測(backtrader+quantstats+akshare)

導包 #引入技術指標數據 from __future__ import (absolute_import ,division,print_function,unicode_literals) import datetime #用于datetime對象操作 import os.path #用于管理路徑 import sys #用于在argvTo[0]中找到腳本名稱 import backtrader as bt #引入backt…