郭俊鳳 王開鑄
摘要:本文就C語言程序設計知識體系結構進行深入的分析與歸納,提出C語言程序設計的語法方面的知識體系結構。首先,討論知識體系結構中各概念的定義;其次,分別給出C語言的語法知識體系和程序設計的語法知識體系。為設計C語言程序設計題庫提供理論基礎。
關鍵詞:知識體系;C語言程序設計;C語言語法;C程序語法
中圖分類號:G642 文獻標識碼:A
1知識體系
定義1:知識是指特定事物、普遍事理、方法、過程、式樣、結構和原理等在大腦中的記憶,以及它們間的關系的記憶。知識是無限的,而結合某一領域的知識卻是有限的。也就是說,C語言程序設計知識體系結構中有關它們的語法知識體系是客觀存在的。
定義2:知識點是指具體領域中符合定義1的知識。知識的表現形式是概念、判斷、推理。其中概念分為具體概念和抽象概念。它們的表現形式是具體事物和抽象名詞。2500年前荀況稱它們為實知和名知。而判斷是描述事物的屬性或事物間的關系,他們的表現形式是由詞語組成的命題,即陳述句;推理是一段原委的敘述,它由一個或多個句子組成。從它們的語義內容來看,C語言知識可以分為14類:定義,功能,組成,作用,特征,區別,算法,分類,原理,方法,策略,過程,應用,方法。
定義3:知識單元是指知識在語義上是同一概念的性質和(或)同一種屬關系等知識組成的知識點集合。知識單元的大小是與知識單元中知識點的多少成正比。而由可滿足某一應用的最少知識點組成的知識單元稱為獨立知識單元。例如:C語言的常量是一個知識單元,而常量中的十進制常量是一個獨立知識單元。
定義4:知識塊是指在語義上有聯系的若干個知識單元的集合。知識塊的大小與集合中知識單元的多少成正比。而由可滿足某些應用的最少獨立知識單元組成的知識塊稱為獨立知識塊。例如:C語言中的基本數據類型是一個知識塊,而十進制數據類型、值域和對應的運算符是一個獨立知識塊。
定義5:知識體系是指能夠構成一個完整應用的若干的知識塊的結合。知識體系的大小是與知識塊的多少成正比的。而構成一個最小的完整應用的最少知識塊的集合稱為獨立知識體系。
定義6:知識體系結構是指知識體系中知識點間和(或)知識單元間和(或)知識塊間具有橫向的直接或間接關系的知識體系。例如:數組是一個知識塊,指針也是一個知識塊。那么指針數組或數組指針是這兩個知識橫向聯系產生的知識塊。具有這樣知識塊的知識體系稱為知識體系結構。知識體系結構也存在一個基本的知識體系結構。
領域知識體系結構是指一個具體領域的知識體系結構,本文就是探討和提出“C語言程序設計”這個具體領域的知識體系結構。
2C語言程序設計的知識體系
現用backus的元語言來描述C語言程序設計的知識體系。該元語言有三個符號:<>、??=、|,其中,<>里面存放非終極符,??=是將其左邊的非終極符替換成其右邊的內容。|表示“或者”。例如:<字>??=<字母>|<數字>|<特殊符號>是一個元語言的表示,其意思是字可被替換成字母或者數字或者特殊符號。<函數>??=<函數頭><函數體>。其意思是函數可被替換成函數頭和函數體。或者說,函數是由函數頭和函數體兩部分組成。本文為了研究方便,把可選項括在元符號“[”和“]”中。
這三個產生式表示C語言程序設計知識體系由六個知識體系組成的。其中,C語言語法知識體系是指C語言的組成及其每個成分的組成規則。同理,C程序設計的語法知識體系是指該程序的組成及其每個成分的組成規則。
C語言語義知識體系是指C語言的各個成分的含義及其在語境中的含義。同理,C程序設計的語義是指程序的各個成分的含義及其在語境中的含義。
語用原本是描述該語言成分在計算機中如何實現的含義,即計算機受到程序的“刺激”后,它有什么反應。當語用這個詞用在程序設計中時,是指使用者用程序的成分、部分、整體在解題中的用途。即它們的功能。惟獨語用在這一點上,它的知識體系是無限的。
本文僅探討C語言語法知識體系和C程序設計語法知識體系。
3C語言語法知識體系
3.1字
<字>??=<字母>|<數字>|<特殊符號>
<字母>??=<大寫字母>|<小寫字母>
<大寫字母>??=A|B|C|……|Z
<小寫字母>??=a | b | c |……| z
<數字>??=0 | 1 | 2 | 3 |……| 9
<特殊符號>??= +|–|*|/|%|<|>|=|&|||! | : |, |; |. |_|#|″|′||~|∧|?|空格符|[|]|{|}|(|) ,由上可知,C語言有92個字。
3.2詞
<詞>??=<標識符>|<關鍵詞>|<運算符>|<分隔符>|<常量>|<注釋符>
<標識符>??=<字母>|<下劃線>|<標識符><數字>|<標識符><字母>|<標識符><下劃線>
<關鍵詞>??=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
<運算符>??=<成員類運算符>|<目類運算符>|<乘法類運算符>|<加法類運算符>|<移位類運算符>|<關系類運算符>|<等號類運算符>|<位運算符>|<邏輯運算符>|<條件運算符>|<賦值類運算符>| <逗號運算符>
<成員運算符>??=() | [] | . | –>
<目類運算符>??= ! | ~ | ++ | – – | – |(類型)| * | & | sizeof
<乘法類運算符>??=* | / | %
<加法類運算符>??= +| –
<移位類運算符>??=<< | >>
<關系類運算符>??=< | <= | > | >=
<等號類運算符>??= != | = =
<位類運算符>??= & | ∧| |
<邏輯類運算符>??=&& | ||
<條件運算符>??=?:
<賦值類運算符>??= += | – =| *= | /= | %= | < <= | >>= | &=| ∧= | != | =
<逗號運算符>??=,
<分隔符>??=,| 空格符 | ; | : | {}
<注釋符>??= /* */
<常量>??=<數值常量>|<字符常量>|<字符串常量>
<數值常量>??=<十進制常量>|<八進制常量>|<十六進制常量>
<十進制常量>??=<整數>|<實數>|<科學數表示>
<整數>??= <無符號整數>|+<無符號整數>|-<無符號整數
<無符號整數>??=<數字>|<無符號整數><數字>
<實數>??=<無符號整數>|<十進制小數>|<無符號小數><十進制小數>
<十進制小數>??=.<無符號整數>
<科學數表示>??=<實數><指數>
<指數>??=e<整數>|E<整數>
<八進制常量>??=<八進制整數>
<八進制整數>??=0<八進制數字>
<八進制數字>??=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
<十六進制常量>??=<十六進制整數>
<十六進制整數>??=0x<十六進制數字>
<十六進制數字>??=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F
<字符常量>??=<字>
<字符串常量>??=”<字符串>”
<字符串>??=<字>|<字符串><字>
由上可知,C語言有六類詞,除關鍵詞有32個,運算符43個,分隔符有5個,注釋符有1個以外,每類詞都有自己的組成規則。符合規則的詞為正確的詞,否則為錯誤的詞。共有上述18條規則。
3.3詞組
C語言只有一種詞組,稱為表達式。表達式是由運算符與運算對象組成的。C語言的基本表達式有15個,基本表達式是指一個運算符和它的運算對象組成的。它們是:
<表達式>??=<本原表達式>|*<表達式>|&<表達式>|-<表達式>|!<表達式>|~<表達式>|++<類值>|– –<類值>|<類值>++|<類值>– –|sizeof<表達式>|(類型名)<表達式>|<表達式><二目運算符><表達式>|<表達式>?<表達式>:<表達式>|<表達式>,<表達式>
<本原表達式>??=<標識符>|<常量>|<字符串>|<表達式>|<本原表達式>(<表達式表>opt)|<本原表達式>[<表達式>]|<類值>.<標識符>|<本原表達式>-><標識符>
<類值>??=<標識符>|<本原表達式>[<表達式>]|<類值>.<標識符>|<本原表達式>-><標識符>|*<表達式>|(<類值>)
<本原表達式運算符>??= () | [] | . | –>
它們具有最高優先級。它們的結合性是從左到右的。
<一目運算符>??= * | & | – | ! | ~ | ++ | – – | sizeof | (<類型名>)
它們的優先級僅次于本原表達式運算符,而高于任何二目運算符的優先級。它們的結合性是從右到左的。
<二目運算符>??= * | / | % | + | – | >> | << | < | > | <= | >= | = = | != | & |∧| | | && | || |
它們的優先級僅次于一目運算符,高于賦值運算符的優先級。它們的結合性是從左到右的。它們間的優先級是按它們的排序遞減的。
<三目運算符>??=? :
它們的優先級次于一目運算符和二目運算符,高于賦值運算符。它的結合性是自右至左的。
<賦值運算符>??= =| += | – = | *= | /= | %= | >>= | <<= | &= | ∧= | !=
它們的優先級次于二目運算符的優先級,高于逗號運算符的優先級。所有的賦值運算符具有同一個優先級,同時,它們的結合性是從右到左的。
<逗號運算符>??=,
逗號運算符的優先級最低,而它的結合性是從左到右的。
3.4句
<句>??=<類型說明句>|<執行句>
<類型說明句>??=<類型說明句區分符>|[<初始化說明符表>];
<類型說明句區分符>??=<類型區分符>[<初始化說明符表>] |<存儲級區分符>[<初始化說明符表>]
<存儲級區分符>??=auto | static | extern | register | typedef
<類型區分符>??=char | int | short | long | unsigned | float | double | <構造型區分符> | <類型定義名>
<初始化說明符>??=<說明符>[<初始化>]
<說明符>??=<標識符>|(<說明符>)|<說明符>[<常量表達式>]
<構造型區分符>??=<結構聯合區分符>|<枚舉區分符>
<結構聯合區分符>??=struct{<結構說明句表>} |struct<標識符>{<結構說明句表>}|struct<標識符>|union{<結構說明句表>}|union<標識符>{<結構說明句表>}|union<標識符>
<結構說明句表>??=<結構說明句>|<結構說明句><結構說明句表>
<結構說明句>??=<類型區分符><結構說明符表>;
<結構說明符表>??=<結構說明符>|<結構說明符>,<結構說明符表>
<結構說明符>??=<說明符>|<說明符>:<常量表達式>|:<常量表達式>
<初始化>??=<表達式>|={<初始化表>}|={<初始化表>,}
<初始化表>??=<表達式>|<初始化表>,<初始化表>| {<初始化表>}
<構造類型說明語句>??=<結構聯合類型說明語句>|<枚舉類型說明語句>
<結構聯合類型說明語句>??=<結構聯合保留字><結構聯合類型句>{<結構聯合成員說明語句表>}<結構聯合對象表>
<枚舉區分符>??= enum<類型名>{常量名表}; | enum{常量名表}; | enum<類型名>;
<常量名表>??=<常量名>|<常量名>=<初始化表>|<常量名>,<常量名表>|<常量名>=<初始化表>,<常量名表>
<類型名>??=<標識符>
<復合語句>??={[<執行句表>][<執行語句表>]}
<類型說明句表>??=<類型說明句>|<類型說明句><類型說明句表>
<執行句表>??=<執行句>|<執行句><執行句表>
<執行句>??=<復合句>|<表達式>;|if (<表達式>)<執行句>|if(<表達式>)<執行句>else<執行句> |while(<表達式>)<執行句>|do <執行句>while(<表達式>);
|for([<表達式1>];[<表達式2>]); [<表達式3>])<執行句>
|switch (<表達式>)<執行句>|case <常量表達式>:<執行句>
|default:<執行句>|break;|continue;|return ;|return <表達式>
|goto<標識符>;|<標識符>:<執行句>| ; |<調用語句>
4C程序語法知識體系
4.1程序
<程序>??=[<預處理>]<外部定義句>|[<預處理>]<外部定義句><程序>
<外部定義句>??=<函數定義句>|<數據定義句>
<函數定義句>??=[<類型區分符>]<函數說明符><函數體>
<函數說明符>??=<說明符>([<參數表>])
<參數表>??=<標識符>|<標識符>,<參數表>| <說明句>|<說明句>,<參數表>
<函數體>??=<類型說明句表><函數語句>|<函數語句>
<函數語句>??={[<類型說明句表>] <執行句表>}
<數據定義句>??=[extern][<類型區分符>][<初始化說明符表>];|[static]<類型區分符>[<初始化說明符表>];
4.2預處理
#define<標識符><詞串>
<詞串>??=<詞><詞串>
#define<標識符>(<標識符>,……,<標識符>)<詞串>
#undef<標識符>
#include<<文件名>>
#include“<文件名>”
#if <常量表達式>
#ifdef<標識符>
#ifndef<標識符>
#else
#endif
#line<常量><標識符>
參考文獻:
[1] 王開鑄. 實用C語言程序設計[M]. 哈爾濱:哈爾濱工業大學出版社,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