郭俊凤 王开铸
摘要:本文就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