郭俊鳳 王開鑄
摘要:本文就C語言程序設計知識體系結(jié)構(gòu)進行深入的分析與歸納,提出C語言程序設計的語法方面的知識體系結(jié)構(gòu)。首先,討論知識體系結(jié)構(gòu)中各概念的定義;其次,分別給出C語言的語法知識體系和程序設計的語法知識體系。為設計C語言程序設計題庫提供理論基礎(chǔ)。
關(guān)鍵詞:知識體系;C語言程序設計;C語言語法;C程序語法
中圖分類號:G642 文獻標識碼:A
1知識體系
定義1:知識是指特定事物、普遍事理、方法、過程、式樣、結(jié)構(gòu)和原理等在大腦中的記憶,以及它們間的關(guān)系的記憶。知識是無限的,而結(jié)合某一領(lǐng)域的知識卻是有限的。也就是說,C語言程序設計知識體系結(jié)構(gòu)中有關(guān)它們的語法知識體系是客觀存在的。
定義2:知識點是指具體領(lǐng)域中符合定義1的知識。知識的表現(xiàn)形式是概念、判斷、推理。其中概念分為具體概念和抽象概念。它們的表現(xiàn)形式是具體事物和抽象名詞。2500年前荀況稱它們?yōu)閷嵵兔?。而判斷是描述事物的屬性或事物間的關(guān)系,他們的表現(xiàn)形式是由詞語組成的命題,即陳述句;推理是一段原委的敘述,它由一個或多個句子組成。從它們的語義內(nèi)容來看,C語言知識可以分為14類:定義,功能,組成,作用,特征,區(qū)別,算法,分類,原理,方法,策略,過程,應用,方法。
定義3:知識單元是指知識在語義上是同一概念的性質(zhì)和(或)同一種屬關(guān)系等知識組成的知識點集合。知識單元的大小是與知識單元中知識點的多少成正比。而由可滿足某一應用的最少知識點組成的知識單元稱為獨立知識單元。例如:C語言的常量是一個知識單元,而常量中的十進制常量是一個獨立知識單元。
定義4:知識塊是指在語義上有聯(lián)系的若干個知識單元的集合。知識塊的大小與集合中知識單元的多少成正比。而由可滿足某些應用的最少獨立知識單元組成的知識塊稱為獨立知識塊。例如:C語言中的基本數(shù)據(jù)類型是一個知識塊,而十進制數(shù)據(jù)類型、值域和對應的運算符是一個獨立知識塊。
定義5:知識體系是指能夠構(gòu)成一個完整應用的若干的知識塊的結(jié)合。知識體系的大小是與知識塊的多少成正比的。而構(gòu)成一個最小的完整應用的最少知識塊的集合稱為獨立知識體系。
定義6:知識體系結(jié)構(gòu)是指知識體系中知識點間和(或)知識單元間和(或)知識塊間具有橫向的直接或間接關(guān)系的知識體系。例如:數(shù)組是一個知識塊,指針也是一個知識塊。那么指針數(shù)組或數(shù)組指針是這兩個知識橫向聯(lián)系產(chǎn)生的知識塊。具有這樣知識塊的知識體系稱為知識體系結(jié)構(gòu)。知識體系結(jié)構(gòu)也存在一個基本的知識體系結(jié)構(gòu)。
領(lǐng)域知識體系結(jié)構(gòu)是指一個具體領(lǐng)域的知識體系結(jié)構(gòu),本文就是探討和提出“C語言程序設計”這個具體領(lǐng)域的知識體系結(jié)構(gòu)。
2C語言程序設計的知識體系
現(xiàn)用backus的元語言來描述C語言程序設計的知識體系。該元語言有三個符號:<>、??=、|,其中,<>里面存放非終極符,??=是將其左邊的非終極符替換成其右邊的內(nèi)容。|表示“或者”。例如:<字>??=<字母>|<數(shù)字>|<特殊符號>是一個元語言的表示,其意思是字可被替換成字母或者數(shù)字或者特殊符號。<函數(shù)>??=<函數(shù)頭><函數(shù)體>。其意思是函數(shù)可被替換成函數(shù)頭和函數(shù)體?;蛘哒f,函數(shù)是由函數(shù)頭和函數(shù)體兩部分組成。本文為了研究方便,把可選項括在元符號“[”和“]”中。
這三個產(chǎn)生式表示C語言程序設計知識體系由六個知識體系組成的。其中,C語言語法知識體系是指C語言的組成及其每個成分的組成規(guī)則。同理,C程序設計的語法知識體系是指該程序的組成及其每個成分的組成規(guī)則。
C語言語義知識體系是指C語言的各個成分的含義及其在語境中的含義。同理,C程序設計的語義是指程序的各個成分的含義及其在語境中的含義。
語用原本是描述該語言成分在計算機中如何實現(xiàn)的含義,即計算機受到程序的“刺激”后,它有什么反應。當語用這個詞用在程序設計中時,是指使用者用程序的成分、部分、整體在解題中的用途。即它們的功能。惟獨語用在這一點上,它的知識體系是無限的。
本文僅探討C語言語法知識體系和C程序設計語法知識體系。
3C語言語法知識體系
3.1字
<字>??=<字母>|<數(shù)字>|<特殊符號>
<字母>??=<大寫字母>|<小寫字母>
<大寫字母>??=A|B|C|……|Z
<小寫字母>??=a | b | c |……| z
<數(shù)字>??=0 | 1 | 2 | 3 |……| 9
<特殊符號>??= +|–|*|/|%|<|>|=|&|||! | : |, |; |. |_|#|″|′||~|∧|?|空格符|[|]|{|}|(|) ,由上可知,C語言有92個字。
3.2詞
<詞>??=<標識符>|<關(guān)鍵詞>|<運算符>|<分隔符>|<常量>|<注釋符>
<標識符>??=<字母>|<下劃線>|<標識符><數(shù)字>|<標識符><字母>|<標識符><下劃線>
<關(guān)鍵詞>??=auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned| void|volatile|while
<運算符>??=<成員類運算符>|<目類運算符>|<乘法類運算符>|<加法類運算符>|<移位類運算符>|<關(guān)系類運算符>|<等號類運算符>|<位運算符>|<邏輯運算符>|<條件運算符>|<賦值類運算符>| <逗號運算符>
<成員運算符>??=() | [] | . | –>
<目類運算符>??= ! | ~ | ++ | – – | – |(類型)| * | & | sizeof
<乘法類運算符>??=* | / | %
<加法類運算符>??= +| –
<移位類運算符>??=<< | >>
<關(guān)系類運算符>??=< | <= | > | >=
<等號類運算符>??= != | = =
<位類運算符>??= & | ∧| |
<邏輯類運算符>??=&& | ||
<條件運算符>??=?:
<賦值類運算符>??= += | – =| *= | /= | %= | < <= | >>= | &=| ∧= | != | =
<逗號運算符>??=,
<分隔符>??=,| 空格符 | ; | : | {}
<注釋符>??= /* */
<常量>??=<數(shù)值常量>|<字符常量>|<字符串常量>
<數(shù)值常量>??=<十進制常量>|<八進制常量>|<十六進制常量>
<十進制常量>??=<整數(shù)>|<實數(shù)>|<科學數(shù)表示>
<整數(shù)>??= <無符號整數(shù)>|+<無符號整數(shù)>|-<無符號整數(shù)
<無符號整數(shù)>??=<數(shù)字>|<無符號整數(shù)><數(shù)字>
<實數(shù)>??=<無符號整數(shù)>|<十進制小數(shù)>|<無符號小數(shù)><十進制小數(shù)>
<十進制小數(shù)>??=.<無符號整數(shù)>
<科學數(shù)表示>??=<實數(shù)><指數(shù)>
<指數(shù)>??=e<整數(shù)>|E<整數(shù)>
<八進制常量>??=<八進制整數(shù)>
<八進制整數(shù)>??=0<八進制數(shù)字>
<八進制數(shù)字>??=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
<十六進制常量>??=<十六進制整數(shù)>
<十六進制整數(shù)>??=0x<十六進制數(shù)字>
<十六進制數(shù)字>??=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F
<字符常量>??=<字>
<字符串常量>??=”<字符串>”
<字符串>??=<字>|<字符串><字>
由上可知,C語言有六類詞,除關(guān)鍵詞有32個,運算符43個,分隔符有5個,注釋符有1個以外,每類詞都有自己的組成規(guī)則。符合規(guī)則的詞為正確的詞,否則為錯誤的詞。共有上述18條規(guī)則。
3.3詞組
C語言只有一種詞組,稱為表達式。表達式是由運算符與運算對象組成的。C語言的基本表達式有15個,基本表達式是指一個運算符和它的運算對象組成的。它們是:
<表達式>??=<本原表達式>|*<表達式>|&<表達式>|-<表達式>|!<表達式>|~<表達式>|++<類值>|– –<類值>|<類值>++|<類值>– –|sizeof<表達式>|(類型名)<表達式>|<表達式><二目運算符><表達式>|<表達式>?<表達式>:<表達式>|<表達式>,<表達式>
<本原表達式>??=<標識符>|<常量>|<字符串>|<表達式>|<本原表達式>(<表達式表>opt)|<本原表達式>[<表達式>]|<類值>.<標識符>|<本原表達式>-><標識符>
<類值>??=<標識符>|<本原表達式>[<表達式>]|<類值>.<標識符>|<本原表達式>-><標識符>|*<表達式>|(<類值>)
<本原表達式運算符>??= () | [] | . | –>
它們具有最高優(yōu)先級。它們的結(jié)合性是從左到右的。
<一目運算符>??= * | & | – | ! | ~ | ++ | – – | sizeof | (<類型名>)
它們的優(yōu)先級僅次于本原表達式運算符,而高于任何二目運算符的優(yōu)先級。它們的結(jié)合性是從右到左的。
<二目運算符>??= * | / | % | + | – | >> | << | < | > | <= | >= | = = | != | & |∧| | | && | || |
它們的優(yōu)先級僅次于一目運算符,高于賦值運算符的優(yōu)先級。它們的結(jié)合性是從左到右的。它們間的優(yōu)先級是按它們的排序遞減的。
<三目運算符>??=? :
它們的優(yōu)先級次于一目運算符和二目運算符,高于賦值運算符。它的結(jié)合性是自右至左的。
<賦值運算符>??= =| += | – = | *= | /= | %= | >>= | <<= | &= | ∧= | !=
它們的優(yōu)先級次于二目運算符的優(yōu)先級,高于逗號運算符的優(yōu)先級。所有的賦值運算符具有同一個優(yōu)先級,同時,它們的結(jié)合性是從右到左的。
<逗號運算符>??=,
逗號運算符的優(yōu)先級最低,而它的結(jié)合性是從左到右的。
3.4句
<句>??=<類型說明句>|<執(zhí)行句>
<類型說明句>??=<類型說明句區(qū)分符>|[<初始化說明符表>];
<類型說明句區(qū)分符>??=<類型區(qū)分符>[<初始化說明符表>] |<存儲級區(qū)分符>[<初始化說明符表>]
<存儲級區(qū)分符>??=auto | static | extern | register | typedef
<類型區(qū)分符>??=char | int | short | long | unsigned | float | double | <構(gòu)造型區(qū)分符> | <類型定義名>
<初始化說明符>??=<說明符>[<初始化>]
<說明符>??=<標識符>|(<說明符>)|<說明符>[<常量表達式>]
<構(gòu)造型區(qū)分符>??=<結(jié)構(gòu)聯(lián)合區(qū)分符>|<枚舉區(qū)分符>
<結(jié)構(gòu)聯(lián)合區(qū)分符>??=struct{<結(jié)構(gòu)說明句表>} |struct<標識符>{<結(jié)構(gòu)說明句表>}|struct<標識符>|union{<結(jié)構(gòu)說明句表>}|union<標識符>{<結(jié)構(gòu)說明句表>}|union<標識符>
<結(jié)構(gòu)說明句表>??=<結(jié)構(gòu)說明句>|<結(jié)構(gòu)說明句><結(jié)構(gòu)說明句表>
<結(jié)構(gòu)說明句>??=<類型區(qū)分符><結(jié)構(gòu)說明符表>;
<結(jié)構(gòu)說明符表>??=<結(jié)構(gòu)說明符>|<結(jié)構(gòu)說明符>,<結(jié)構(gòu)說明符表>
<結(jié)構(gòu)說明符>??=<說明符>|<說明符>:<常量表達式>|:<常量表達式>
<初始化>??=<表達式>|={<初始化表>}|={<初始化表>,}
<初始化表>??=<表達式>|<初始化表>,<初始化表>| {<初始化表>}
<構(gòu)造類型說明語句>??=<結(jié)構(gòu)聯(lián)合類型說明語句>|<枚舉類型說明語句>
<結(jié)構(gòu)聯(lián)合類型說明語句>??=<結(jié)構(gòu)聯(lián)合保留字><結(jié)構(gòu)聯(lián)合類型句>{<結(jié)構(gòu)聯(lián)合成員說明語句表>}<結(jié)構(gòu)聯(lián)合對象表>
<枚舉區(qū)分符>??= enum<類型名>{常量名表}; | enum{常量名表}; | enum<類型名>;
<常量名表>??=<常量名>|<常量名>=<初始化表>|<常量名>,<常量名表>|<常量名>=<初始化表>,<常量名表>
<類型名>??=<標識符>
<復合語句>??={[<執(zhí)行句表>][<執(zhí)行語句表>]}
<類型說明句表>??=<類型說明句>|<類型說明句><類型說明句表>
<執(zhí)行句表>??=<執(zhí)行句>|<執(zhí)行句><執(zhí)行句表>
<執(zhí)行句>??=<復合句>|<表達式>;|if (<表達式>)<執(zhí)行句>|if(<表達式>)<執(zhí)行句>else<執(zhí)行句> |while(<表達式>)<執(zhí)行句>|do <執(zhí)行句>while(<表達式>);
|for([<表達式1>];[<表達式2>]); [<表達式3>])<執(zhí)行句>
|switch (<表達式>)<執(zhí)行句>|case <常量表達式>:<執(zhí)行句>
|default:<執(zhí)行句>|break;|continue;|return ;|return <表達式>
|goto<標識符>;|<標識符>:<執(zhí)行句>| ; |<調(diào)用語句>
4C程序語法知識體系
4.1程序
<程序>??=[<預處理>]<外部定義句>|[<預處理>]<外部定義句><程序>
<外部定義句>??=<函數(shù)定義句>|<數(shù)據(jù)定義句>
<函數(shù)定義句>??=[<類型區(qū)分符>]<函數(shù)說明符><函數(shù)體>
<函數(shù)說明符>??=<說明符>([<參數(shù)表>])
<參數(shù)表>??=<標識符>|<標識符>,<參數(shù)表>| <說明句>|<說明句>,<參數(shù)表>
<函數(shù)體>??=<類型說明句表><函數(shù)語句>|<函數(shù)語句>
<函數(shù)語句>??={[<類型說明句表>] <執(zhí)行句表>}
<數(shù)據(jù)定義句>??=[extern][<類型區(qū)分符>][<初始化說明符表>];|[static]<類型區(qū)分符>[<初始化說明符表>];
4.2預處理
#define<標識符><詞串>
<詞串>??=<詞><詞串>
#define<標識符>(<標識符>,……,<標識符>)<詞串>
#undef<標識符>
#include<<文件名>>
#include“<文件名>”
#if <常量表達式>
#ifdef<標識符>
#ifndef<標識符>
#else
#endif
#line<常量><標識符>
參考文獻:
[1] 王開鑄. 實用C語言程序設計[M]. 哈爾濱:哈爾濱工業(yè)大學出版社,2002.
[2] 譚浩強. C語言程序設計[M]. 3版. 北京:清華大學出版社,2005.
[3] 郭俊鳳,朱景福. C程序設計案例教程[M]. 北京:清華大學出版社.2009.
Summary of System Structure of Grammatical Knowledge in C Language Programming
GUO Jun-feng, WANG Kai-zhu
(Heilongjiang East College, Harbin 150086, China)
Abstract: This paper analyses and generalizes system structure of knowledge on C language programming design deeply,and puts forward a system structure on grammatical knowledge of C language programming design. At first,we discuss on every definition of conceptions in system structure of knowledge; Then, we give the system of grammatical knowledge on C language and on programming design respectively. It also provides theoretical basis for designing exam database of C language programming design.
Key words: system structure of knowledge; C language programming design; C language grammar; C programming grammar