999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++中函數聲明與編譯的關系探討

2020-07-16 18:19:43高建波方芳趙敏
教育教學論壇 2020年23期

高建波 方芳 趙敏

[摘 要] 使用函數聲明可以避免在主函數之前定義所有的子函數。然而,函數聲明卻有很多細節需要關注,尤其是遇到函數之間嵌套調用時。為深入理解函數聲明,必須清楚程序編譯原理和編譯過程。該文通過一個C++例題的分析,詳細闡述函數聲明與編譯的關系,同時說明養成良好編程習慣的重要性。

[關鍵詞] 函數聲明;編譯;編程習慣

[作者簡介] 高建波,南昌航空大學信息工程學院講師,主要從事計算機科學與技術研究;方 芳,南昌航空大學信息工程學院講師,主要從事計算機科學研究;趙 敏,南昌航空大學信息工程學院講師,主要從事計算機科學研究。

[中圖分類號] G642.0? ? [文獻標識碼] A? ? [文章編號] 1674-9324(2020)23-0135-02? ? [收稿日期] 2019-11-25

一般來說在編程時,子函數的定義可以放在主函數之前,也可以放在主函數之后。將子函數的聲明放在主函數之前,子函數的定義放在主函數之后,可以讓程序顯得更加直觀,這也是良好的編程習慣,而很多編程教學者和初學者并不重視這一點[1]。不好的編程習慣會導致很多錯誤,而這些錯誤在良好編程習慣下會自動屏蔽,因此有必要深入探討函數聲明,尤其是編程中遇到函數之間相互調用和嵌套調用時。為理解函數聲明的重要性,需要考慮編譯器的工作原理及其與函數聲明的關系[2]。

一、函數聲明和編譯

(一)編譯器和編譯

編譯器是C++程序的語法拼寫檢查器,當一個程序被寫好并存儲后,就可以對它進行編譯。這時編譯器程序就會對程序進行詞法分析、語法分析、語義分析和中間代碼生成。在任何一個環節發現錯誤編譯器就會給出錯誤的報告清單。編譯器的工作中詞法分析的任務是從左到右、從上到下逐字符地讀入源程序,即對構成源程序的字符進行掃描然后根據構詞規則識別單詞符號。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語并判斷程序在結構上是否正確。語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查。接著編譯程序將源程序變成中間代碼,一種結構簡單、含義明確、易于翻譯成目標代碼的的記號系統。

(二)函數聲明與編譯的關系

在編程時,程序員經常將主函數放在程序的最前面,這樣程序看起來更加直觀。然而當主函數中需要調用很多的子函數時,如果將子函數的定義均放在主函數之后,那么在程序編譯時就會報錯。報錯的原因在于編譯器在編譯程序時是從上至下進行的,在調用子函數時,必須讓計算機知道這個程序中存在這么一個函數,而將子函數定義在主函數之后,那么在對主函數進行編譯時無法找到對應的子函數。為解決這個問題,可以在主函數之前先聲明子函數的原型定義[3],以便讓編譯器知道函數的參數和返回值類型,在主函數之后再具體定義子函數的內容。例如,

1.#include “stdafx.h”

2.#include

3.using namespace std;

4.void printmessage()

5.int main()

6.{ printmessage();

7.return 0;}

8.void printmessage()

9.{cout << “I'm a function!”;}

該程序第4行聲明了printmessage()函數,該函數沒有形參和返回值,且在主函數的前面,程序的第8、9行定義了函數printmessage(),也即明確說明函數的功能。該程序亦可做如下的修改:將子函數printmessage()定義在主函數之前,即將程序的第8、9行放置于程序的第5行之前,并去掉程序的第4行。兩種方法都可以通過編譯,相比而言,第一種方法更符合良好編程習慣的要求。

二、子函數之間有嵌套調用時的函數聲明

上例中,子函數可以放在主函數之前或之后,因此編程者會忽視良好編程習慣。在遇到函數之間相互嵌套調用時,對子函數聲明的采用與否,則會產生完全不同的結果。

(一)一個嵌套調用的例子和相關說明

1.#include “stdafx.h”

2.#include

3.using namespace std;

4.void odd (int a) {

5.if ((a%2)!=0) cout << “Odd number.\n”;

6.else even (a);}

7.void even (int a) {

8.if ((a%2)==0) cout << “Even number.\n”;

9.else odd (a);}

10.int main () {

11.int i;

12.do {

13.cout << “Type a number: (0 to exit)”;

14.cin >> i;

15.odd (i);

16.} while (i!=0);

17.return 0;}

該程序的兩個子函數odd()和even()之間存在相互調用的情形。雖然將兩個子函數均定義在了主函數之前,然而因為編譯是從上至下執行的,當執行到7行時odd()函數調用了even()函數,而此時even()函數根本不存在。同理如果將even()函數定義放在odd()定義之前依然會遇到類似問題。在以上兩種情況下,該程序均無法通過編譯。而良好的編程習慣事先要求聲明所有子函數,從而不會產生這種編譯錯誤。

(二)對上例的深入分析

為更加深入理解函數聲明和編譯之間的關系,設計了四個小程序片段,見表1。

這四個片段并不是完整的程序,卻可用來說明函數聲明和編譯關系。在片段1中,主函數之前聲明了子函數even(),由于在主函數的內容調用了odd()函數,而此時并沒有聲明odd()函數,編譯器執行到這里時直接報錯。在片段2中,函數even()中調用了odd(),而此時odd()并不存在,編譯器立刻報錯。在片段3中,先聲明函數odd(),然后在even()中進行了調用,這是沒有問題的;同理,主函數也可以調用odd()函數。片段4中先聲明了函數odd(),然后主函數中調用odd(),再在even()函數中調用odd(),而函數odd()也調用了even(),因為even()定義在odd()之前,因此也沒有問題。雖然片段3和4可以通過編譯,然而先聲明子函數的方式顯得更加簡單和直觀,免去了分析子函數相互調用的細節。

三、結論

因為編譯器在編譯程序時是從上至下的,所以使用函數聲明可以避免子函數間相互調用而產生的編譯錯誤,而這也是良好的編程習慣。本文構建了四個小程序片段,用于說明函數聲明和編譯的關系,從而加深對函數聲明及其重要性的理解。

參考文獻

[1]何雪英.C++教學中編程習慣的培養[J].電腦知識,2019,15(22):126-127,129.

[2]萬新燕,時招軍.編譯原理實驗教學設計[J].教育教學論壇,2019,2(8):261-262.

[3]保羅.斯奈思(著),劉繼飛等(譯).C++[M].沈陽:遼寧教育出版社,2002.

Discussion on the Relation Between Function Declaration and Compilation in C++

GAO Jian-bo,FANG Fang,ZHAO Min

(Nanchang Institute of Information Engineering,Nanchang,Jiangxi 330000,China)

Abstract:Using function declaration can avoid defining all sub-functions before the main function.However,function declarations have many details to pay attention to,especially when it comes to nested calls between functions.In order to understand the function declaration in depth,we must make clear the principle of program compilation and the compiling process.This paper elaborates the relation between function declaration and compilation through a C++ example analysis,and explains the importance of developing good programming habits.

Key words:function declaration;compilation;programming habit

主站蜘蛛池模板: 日韩精品亚洲精品第一页| 久久夜色精品国产嚕嚕亚洲av| 一级片免费网站| 欧美成人第一页| 91成人在线免费观看| 男人天堂亚洲天堂| 538国产视频| 青草视频在线观看国产| 欧美在线国产| 久久久久亚洲精品无码网站| 成人伊人色一区二区三区| 四虎国产成人免费观看| 中文字幕在线欧美| 中文毛片无遮挡播放免费| 91九色最新地址| 国产黄在线免费观看| 波多野结衣一区二区三视频| 亚洲制服丝袜第一页| 欧美久久网| 亚洲天堂视频在线播放| 国模私拍一区二区| 亚洲欧美另类久久久精品播放的| 亚洲AⅤ波多系列中文字幕| 国产美女在线免费观看| 在线看AV天堂| 91福利片| 久久精品国产精品一区二区| 欧美yw精品日本国产精品| 精品久久久久久中文字幕女| 秋霞一区二区三区| 亚洲免费三区| 男人的天堂久久精品激情| 国产理论最新国产精品视频| 国产麻豆精品在线观看| 亚洲天堂免费观看| 亚洲精选无码久久久| 国产精品视频999| 99re免费视频| 成人在线天堂| 五月激情婷婷综合| 中文字幕不卡免费高清视频| 伊人久久久久久久久久| 日韩色图区| 无码免费视频| 亚洲成a∧人片在线观看无码| 91麻豆国产视频| 538国产在线| 日韩免费毛片| 无码国产偷倩在线播放老年人 | 亚洲天堂视频网站| 99久久亚洲综合精品TS| 精品国产欧美精品v| 99视频在线免费观看| 岛国精品一区免费视频在线观看 | 亚洲精品无码专区在线观看| 99伊人精品| 国产视频一区二区在线观看| 亚洲日韩每日更新| 老色鬼欧美精品| 国产精品亚洲专区一区| 国产主播喷水| a级毛片毛片免费观看久潮| 国产色爱av资源综合区| 欧美、日韩、国产综合一区| 丁香综合在线| 在线观看国产小视频| 成人久久精品一区二区三区| 亚洲一区二区无码视频| AV片亚洲国产男人的天堂| 亚洲AV无码一区二区三区牲色| 欧美性色综合网| 欧美日韩亚洲国产| 国产成人高清精品免费| 日本人妻一区二区三区不卡影院| 国产成人亚洲精品色欲AV| 中文一区二区视频| 精品国产三级在线观看| 在线a视频免费观看| 性色在线视频精品| 97se亚洲综合| 免费一级毛片| 久久无码av三级|