c语言语法大全法

扫码下载官方App
学习过该课程的人还学习过:
其他联系方式
所属系列课程
网易公司()旗下实用技能学习平台。与顶级机构、院校和优秀讲师合作,为您提供海量优质课程,以及创新的在线学习体验,帮助您获得全新的个人发展和能力提升。
关注我们:
& 网易公司 版权所有
C语言/C++学习指南 (语法篇) 入门到精通,IT与互联网 编程语言,阿发你好,一门零基础、从入门到精通的C语言/C++语法教程,由毕业于清华大学的业内人士执课,从最简单的HelloWorld入门程序,到最深入的C语言/C++核心概念,均为您娓娓道来,言之必详、听之必懂。本教程配套同名纸质教程。
适用人群:零基础学员,及其他任意水平的学员【投稿】语法浅析--从C语言到Objective-C
招聘信息:
Objective—C(以下简称OC)作为C语言的超集,其基本特性就是C语言可以直接在OC中无缝结合。随着开发时间越来越长,对C语言的熟悉往往给笔者带来很多便利,所以这里一部分做个分析,一部分也是作为一些小经验的分享。新手写文,捉襟见肘,总结的不好,或是有更好的方法,还请诸位不吝指出。本文的示例代码以Command Line Tools的方式做了一个简单的demo,上传到了上,如果您感兴趣,也可以下载下来自己调试。编程语言对于语言的定义多种多样,但是总让人觉得差强人意。所以笔者索性自己总结了下,为计算机语言归纳出了三个要素:1.语素 &简单说来,语素就是符号与文字单元。从早起的二进制0和1,到汇编语言的汇编指令,到C语言的ASCII码字符集,再到swift的Unicode字符集。当然了,单纯的符号是无意义的,更为狭义的语素会经过语言语法的划分,如关键字、标识符、运算符、注释符等等。就定义而言,语素规范是由语法规定的,而就功能而言,语素明确了我们&用什么写&。2.语法 &语法并不是某种显式的符号,而是编写或罗列语素的规则。从单个语素的含义,到语素间的排列规则,再到大段代码的执行顺序。语法负责让一整篇无意义的符号按照一定的规则表达出含义,我们可以将其称之为语义。一般来说,学语言初期,主要在学的就是语法了。就定义而言,语法是语义的表达框架,就功能而言,语法则明确了我们“如何去写”。3.语义 &语义,可以归纳为思维的描述,引申的话,也可以归结为逻辑,毕竟逻辑就是思维的规律。无论是平常交流用的语言也好,与计算机交互使用的计算机语言也罢,究其本质,都是为了表达、沟通与理解。就定义而言,语义是语言使用者思维的具化体现,就功能而言,语义其实就是在表达“想写什么”。虽然从描述思维的角度来说,语义可以是无穷的,但无穷依旧有其局限性。这种局限性可以追溯到设计语言之初,从语言的特性与适用场所窥得端倪。比如C语言中,选择ASCII字符集和其字符组合作为语素,用if(...)作为语法中的判断逻辑表达式,用if(x)return 1;来表达具体的语义。但当我们希望描述一个变量拥有自己的函数时,就显得无比吃力。我们或许可以用很多句话来模拟,但是想要一句话解决问题就不可能了。究其原因,是因为C语言本身不支持这样的描述方式。从层次上来说,支持什么样的描述方式往往是由语法来确定的,但究其原因,语法作为表达框架,其集合的边界是取决于我们语义的宽度的。其实说的简单点,只是因为设计语言的时候,我们想说的东西还没有甚至没敢这么复杂。深层次的语言设计初衷就不再探讨了,这些理由基本都囊括在自己的语言特性里,有人说想深学一门语言,就要学它的历史。从某个角度来说,这也是为了更方便我们去理解,设计语言的人,想要用这个语言来表达什么而已。顺便讨论下日常语言和计算机语言的区别,对于日常语言和来说计算机语言,最大的区别在于受体。日常语言的表达对象是具有相似思维能力的活生生的人,语言从思维形成,到表述,到传达,到接收时转化为自己所理解的信息,往往会进行多层次多维度的归纳和演绎。而计算机语言面对的是拥有着既定规则和一定计算能力的机器,所以需要我们的表达是精确到位的。所以,对应的语法也需要精确,“你不是一个人”这样的歧义句,放在日常语言里或许只博得一笑,可放在计算机语言里,问题就严重了。语素、语法、语义作为语言的三要素,未必是最精确和科学的,不过对于计算机语言来说,这也算是一种归纳并定性的思路,可以让我们对一门语言有另一个层面的认识与特性区分。不推荐强行的教条划分,顶多在自顶向下或是自底向上分析语言的时候,有个模型做借鉴吧。声明、实现与调用说完了假大空的理论,我们回到C语言。 C语言定义了关键字、标识符、运算符、注释符这样的基本语素,定义了if、for等等的逻辑语句表达之后,最核心的元素分为两种:数据与函数。对于C语言而言,代码的实际构成都可以归结为对数据和函数做以下三件事:声明、实现与调用。让我们从代码上来做一些简单的区分:int&//变量声明,格式为&“数据类型&标识符;"
int&func(int);//函数声明,格式为“数据类型&标识符(数据类型,...);”
int&func(int&x){//函数实现,格式为“数据类型&标识符(数据类型&形参标识符,...){&...&return&...}”
&&&&var&=&x;&//变量赋值,利用赋值运算符“=”
&&&&printf("%d",var);&//变量调用,直接使用变量的标识符
&&&&return&x?func(x-1):0;//函数调用,格式为“函数名标识符(传入参数)”
}相信你看到上面这几句代码后面的拥挤的注释已经心慌慌了,不必紧张,这只是语法的一个列举。C语言语法自成一本书,笔者不会妄想到用一篇博客讲完的。如果你有一定的C语言开发经验,你就会发现上面这段代码写的毫无意义,也就最后一句的递归调用可以装装逼。首先,函数有一个很特别的地方,那就是它的调用,比如func()。这样的表达是被视作一个数据来占位的,在实际含义中表示它的返回值。这个特性将函数与数据从语法上放在了平行的位置,虽然看着不起眼,但这是个很棒的特性。让我们可以用同样的方式去对待计算过程和一个具体的值。 我们可以以此做两种假设:把变量当做函数:变量取值本身也是个过程,我们调用一个变量,其实也是通过一定过程取得了一个返回值。 int i = 1;与int i(){return 1;}在功能上是否很相似呢?把函数当做变量:任何一个函数在调用后一定对应着一个确定的返回值,哪怕是一个void类型,也是与数据类型所对应的。所以哪怕是func(func(func(func(1)))),最终依旧是个int型的数据而已。当然了,从实现角度来说,变量与函数的差别很大。但在编写代码的时候,尤其是将函数当做一个变量,会减少我们所需要关注的地方。我们完全可以声明一个int whoCare(int,int),当做一个变量调用。最后再去考虑它的实现过程。当我们把函数的调用视作一个数据占位符的时候,我们会发现整个语法变得简单了不少。除了声明和实现的格式,语句就剩下各种情况下的数据运算了,然后嵌套,调用,随意重复n++次。那么回到我们的声明和实现,整个语法格式其实是走一步算一步的。&大概就是上图这个样子了。语法是个坑,一边学一边用成长起来比较快。大部分实践经验证明,学语法基本都是从写什么不可以开始的,找个报错功能靠谱,比如Xcode这样的IDE软件开始码代码吧,什么时候静态编译不报错了,语法关也就过的差不多了。OOP的OC语言设计从来不是一件轻松的事情,每一个规则的设计都取舍于性能和易用性,一方面要求严谨,一方面要求灵活。从C语言中发展出来的面向对象语言就有好几种,它们唯一的共同特征大概就是都可以直接运行C语言代码了(笑= =)。从个人情感角度来说,笔者对于OC的这门语言的热爱大概只有Python能够分一杯羹了。无关于性能、环境与语法,其钟爱点仅仅源于方括号[],让整篇代码看起来整齐美观。为了拓展面向对象的功能,一方面,OC在C语言中采纳了很多固有特性来模拟对象特性。另一方面,则另起炉灶,设计了另外一套关键字语法系统,而且设计的颇具美感。第一眼看上去,语法或许特殊到再也见不到类似的,但是细细揣摩上去,反倒是因为这种不同让我们在同一个片段里混用C语言语法与OC语法,也绝对不会混淆。理论上,这里是应该对比一下C++的,不过笔者对C++学习甚浅,还是不要妄加论断的好。这里要说的是,OC也加入了与C++混编的功能,不过因为对象机制不同,不同语言下的面向对象语法是不能相互替换的。一想到一篇代码里会存在两种类,一个对象= new CPPClass,一个= [OCClass new],望而生畏。OC语法区别于C语言的主要地方都是在对象层面,对于基础的语法,基本上可以照抄照搬,倒也省心省事。所以从基本语素说起,我们就可以直接看OC的对象与方法了。顺便提一句OC的文件结构。在C语言里面,.c文件是靠#include来声明包含的,在OC里面,则会分为.h和.m文件。如果你像我一样对引用生出好奇心的话,会发现是没有对.m的引用的,但是文件里的实现代码却会被执行,答案很简单,编译器用另外一种方式替我们做了这件事。至于具体如何做到,这里先不讨论(笔者也顺便再研究研究= =)。要说明的是,尽可能不要在OC中写#import "....m",即便这样是完全可以的。第一步,我们来建立一个新的对象好了。为了方便,我稍稍违反一下默认的文件结构,将声明和实现代码都搬到一个.h文件里,请不要在写代码的时候这样做。//BCObject.h
#pragma&mark&-&BCObject.h
@interface&BCObject&:&NSObject
#pragma&mark&-&BCObject.m
@implementation&BCObject
@end与C语言的声明与实现相对应,在OC中,一个类也需要做这两件事,并且赋予了专门的关键字。在这里叫关键字或许不太合适,你也可以称为编译器标记,毕竟从实现角度来说,它们和之前的关键字的功能还不太一样。在OC中,@符号的功能颇多,在这里,是与后面定义好的字符共同作为一个标记出现,供编译器进行转义。比如@import是库引用,@interface是类声明,而@implementation则是类实现,当然了,声明和实现还需要伴随@end这样的结束记号。 OC的面向对象语法基本都是在自己的编译器标记中才可以使用的,它等于和编译器约定,在@...@end之间的代码,是使用OC编写的。也可以反过来做假设,如果不在声明和实现的段落中,则该语句与对象无关,那么面向对象的语法也就想当然的无法成立了。 不过,这只是针对声明和实现,如果仅仅是调用,OC和C语法的混搭,真的是爽歪歪~@implementation&BCObject
+(NSString&*)hello{
&&&&return&@"hello&world";
void&say(NSString&*str){
&&&&NSLog(@"%@",str);
}然后,我们就可以使用say([BCObject hello]);这样的语句来实现"hello world"了。如果你仔细观察,你会发现我并没有为+(NSString *)hello这个方法做声明,只是和C语言中一样,把实现放在了调用的代码段前。这里也顺便说明一个问题,在面向对象中,往往会有私有方法和实例变量这样的说法。在OC中,最简单的方法是把私有的东西放在.m方法里,因为不存在文件包含,所以也就无法调用了。而像我们刚才这样,直接调用@implenmentation的方法,就会发现他是没有语法上的防御力的,仅仅是靠文件结构的约定俗成而已。这也是为什么不让大家引用.m文件的原因之一。不过,如果是私有实例变量的话,OC却是提供了对应的标记来声明私有。@import&F
@interface&BCObject&:&NSObject{
&&&&@public
&&&&NSString&*
&&&&@private
&&&&NSString&*
@implementation&BCObject
-(instancetype)init{
&&&&self&=&[super&init];
&&&&if(self){
&&&&&&&&hello&=&@"hello";
&&&&&&&&bye&=&@"bye";
&&&&return&
-(NSString&*)bye{
&&&&return&
//在main.m中调用
int&main(int&argc,&const&char&*&argv[])&{
&&&&@autoreleasepool&{
&&&&&&&&say([BCObject&hello]);
&&&&&&&&BCObject&*obj&=&[BCObject&new];
&&&&&&&&say(obj&->&hello);
&&&&&&&&say(obj.bye);
&&&&return&0;
}在C语言中,我们可以用->来寻址结构体指针中的元素数据,而在OC中,我们则可以通过这个符号来寻址对象内的实例变量。有没有联想到什么呢?对= =因为OC的对象的其实就是个结构体指针,这个运算是通用的。只不过,我们可以通过@private和@public,当然也会有@protect来限制访问权限。不过,在实际编写中,这样的声明和取值实在太过繁琐,虽然可以这么用,但早已鲜有人问津。自OC2.0之后,我们有了@property用来解决类内实例变量对外的存取,我们将其翻译为属性,并形象的将它的存取方法称为setter和getter。在这之后,访问类内的实例变量就全部靠方法,而非指针了。@interface&BCObject&:&NSObject{
&&&&@public
&&&&NSString&*
&&&&@private
&&&&NSString&*
@property&NSString&*
//在main.m中调用
int&main(int&argc,&const&char&*&argv[])&{
&&&&@autoreleasepool&{
&&&&&&&&say([BCObject&hello]);
&&&&&&&&BCObject&*obj&=&[BCObject&new];
&&&&&&&&obj.word&=&obj&->&
&&&&&&&&say(obj.word);
&&&&return&0;
}回过头来看OC的声明和实现语法,数据的声明和c语言完全一样,只不过对象都是指针,所以总会多个"*"号。而在方法的声明和实现中,为了区别于C语言的函数,OC使用“()”来声明数据类型,使用&:&来标识传入参数,并且创新的引入了参杂多个“:”的函数命名方式,让整个句子看着更符合语言逻辑。虽然这个特性对我等英语盲人来说意义并不大,但是[you doItWith:A and:B for:C]看起来比you.doIt(A,B,C)还是要舒服的多了。如果英语词汇量充足的话,我们是可以有效的减少翻阅文档的次数的。因为格式特立独行,所以想要混淆就变的困难。OC的语法看起来唬人,学起来倒也不算难,还是那句话,在xcode里多写代码,什么时候静态编译不报错了,语法自然就过关了。多说一点除了声明、实现、调用的格式之外,语法需要学习的地方还有很多。在C语言中,我们要考虑变量的作用域,参数的值传递与引用传递,要考虑一个值的储存方式等等。在OC中,复杂的东西则更多,不过,随着学习的递进,我们就会发现这些东西其实不在语法范畴之内,比如模式,比如库和框架,比如内存管理,再比如Runtime机制。如果你已经有编程基础的话,那么玩转一门新语言的语法并不是一件非常困难的事。学语法,或许一周左右。学习语言特性,或许把玩个把月也就很有成效了。不过学语言真正困难的地方在于语言的环境:框架、适应场合、需要解决的问题、持续的更新与升级还有使用群体的约定俗成。如果非让我加个期限的话,那会是,一万年。总结与吐槽对于一个初学者来说,学习语法往往是个很别扭的事情。因为大量的符号、关键字和标记需要逐个去记忆,而且还需要分门别类的明确这些符号分别是做什么用的。尤其是对于一个英语盲来说,将int、long、short、float、double、char、void归为一类比独立背下来这些单词还要再难上一分。而好不容易过了词汇关的我们,接下来面对的示例代码,全都是些陌生的单词,根本不知道在说什么好不好。记起来当初大神们为特性举例子总喜欢拿几个系统内置的生僻方法来举例,语法理解不了不说,还要特地先去查这些方法是什么,否则返回值根本莫名其妙啊= =。正因为这样的事情总是发生,所以总结一些语法特征,可以多多少少帮我们点忙。比如()是函数,[]是方法,{}是一大句话,标识符都是大神们戏谑我们特地起的人名地名(吐槽...吐槽= =)。阅读理解逼着我们挨个看单词,可读源代码,是可以先读符号的。这也是语法给我们带来的一点小便利。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量16272点击量10875点击量8664点击量8017点击量7488点击量7063点击量6588点击量6497点击量5716
&2016 Chukong Technologies,Inc.
京公网安备89[高级点的技术交流]什么叫语法(syntax)_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:456,184贴子:
[高级点的技术交流]什么叫语法(syntax)收藏
喂熊。按吧规3.11,没EOF前插楼的删。
自打入夏以来,就独得抱财恩宠,劝抱财要 雨-露-均-沾-
似乎以前发的主题都搜不到几个,所以窃点精。先声明,我不是撸这专业的;然而大都数吹逼材料在这个问题上的犯傻过于普遍,都不到点上,太不像样了,以至于熟练工还真能一本正经口胡……原因大概是从头就错惯了,以讹传讹(就像什么“变量”“堆栈”的意思一样)。0.体例引文使用&前缀。包括翻译的引文用[[ ]]标识。
1.词义中文维基被墙所以照搬英文维基解释翻译一下。词条syntax:[[& In linguistics, syntax is the set of rules, principles, and processes that govern the structure of sentences in a given language. The term syntax is also used to refer to the study of such principles and processes. In linguistics, syntax is the set of rules, principles, and processes that govern the structure of sentences in a given language. The term syntax is also used to refer to the study of such principles and processes. The goal of many syntacticians is to discover the syntactic rules common to all languages.在语言学中,语法是一个语言中控制句子结构中的规则、原理和过程。术语syntax也指对这些原理和过程的研究。(译注:syntax=语法学。)许多语法学家的目标是发现适用于所有语言的语法规则。]][[& In mathematics, syntax refers to the rules governing the behavior of mathematical systems, such as formal languages used in logic. (See logical syntax.)在数学中,语法指控制数学系统行为的规则,例如逻辑学使用的形式语言。(参见逻辑语法。)]][[& Etymology& From Ancient Greek: σύνταξις &coordination& from σύν syn, &together,& and τάξις táxis, &an ordering&.语源古希腊文σύνταξις“协调”,由词素σύν(syn)“在一起”和τάξις táxis“一种秩序”组成。]]语法学的历史非常悠久,公元前4世纪古印度语法学家波你尼(Pāṇini)撰写的梵语语法《八章书》(Aṣṭādhyāyī)是一个重要的代表……余略……事实上,抛开自然语言的历史,词条syntax (logic)给出了更贴近这里要讨论的上下文的定义:[[& In logic, syntax is anything having to do with formal languages or formal systems without regard to any interpretation or meaning given to them. Syntax is concerned with the rules used for constructing, or transforming the symbols and words of a language, as contrasted with the semantics of a language which is concerned with its meaning.在逻辑学中,语法是任何形式语言或形式系统中不考虑任何解释或含义的部分。语法和用于构造或转换一个语言中的符号和词的规则有关,这和语言的语义——和含义相关——相反。]][[& The symbols, formulas, systems, theorems, proofs, and interpretations expressed in formal languages are syntactic entities whose properties may be studied without regard to any meaning they may be given, and, in fact, need not be given any.在形式语言中表达的符号、公式、系统、定理、证明和解释是语法上的实体,它们的属性可以在不考虑解释和含义的情况下被研究——事实上也不需要。]][[& Syntax is usually associated with the rules (or grammar) governing the composition of texts in a formal language that constitute the well-formed formulas of a formal system.语法通常和控制形式语言中决定合式公式的文本的构造的规则(或文法)关联。]][[& In computer science, the term syntax refers to the rules governing the composition of meaningful texts in a formal language, such as a programming language, that is, those texts for which it makes sense to define the semantics or meaning, or otherwise provide an interpretation.在计算机科学中,术语“语法”指在形式语言中控制构造有意义的文本的规则,例如对一个程序语言,即明确对定义语义或含义有意义或提供一个解释的文本。]]关于形式语言的语法学,实际上是现代数学基础最重要的分支之一(数理逻辑)的主要组成部分。对此的延伸话题限于篇幅不作展开,有兴趣的读者可以查找词条内的链接和参考文献进一步了解术语之间的联系。2.文法(grammar)细心的读者可能会发现,实际上经常被称为语法的词语并不是指syntax,而是上面出现过的另一个容易混淆的词:grammar。仅涉及自然语言的话题中,grammar常被翻译成“语法”,而syntax则是“句法”(上面的logical syntax更惯于被翻译成“逻辑句法”),这并没有造成太大问题。不过在涉及更广的范围下,这样会造成一些误会。因为“句”的概念的微妙差异,导致“句法”这个词失去基础。这个情况下,作为泛指,通译grammar为“文法”,syntax为“语法”。按维基给的定义:& In linguistics, grammar is the set of structural rules governing the composition of clauses, phrases, and words in any given natural language. The term refers also to the study of such rules, and this field includes morphology, syntax, and phonology, often complemented by phonetics, semantics, and pragmatics.在语言学中,文法是指任意一个自然语言中控制组合分句、词组和词结构性规则的集合。这个术语(译注:语法学)也指对这些规则的研究,这个领域包括(词语)形态学、语法学和音韵学(译注:不要和后面讲的phonetics混淆),经常也涉及语音学、语义学和语用学。可见,至少在自然语言中,文法学的研究范围涵盖了语法学;作为研究对象,语法现象是文法现象的真子集。对于形式语言来说,没有系统的音韵学或语音学研究的必要。但是,其它重要的部分,尤其是语义和语用这样明确不属于语法学研究范围的内容,仍然是重要的文法现象。因此,随意混淆“语法”和“文法”是有问题的。在文法的范围内偷换“语法”是典型的缩小外延的逻辑谬误。
3.词法(lexical syntax/lexical grammar)在语法中,因为有些最基本的和字符序列直接相关的部分内容的含义相对固定,而不需要特别指定不同的规则,习惯上把这部分语法单独提出称为词法。在实现上,词法分析和其它更一般的语法分析也可以分离并单独配置;同时,也便于学习者理解语言的语法构造。实践证明这是自然的,因此这种惯例普遍存在。这样,也可以提升词法到和其它一般语法并列,直接使用文法描述。当然也不是所有语言都必要单独提出词法(除了指定允许什么字符以外),比如brainf*ck或者组合子逻辑以及这样的语法上异常“简单”的语言。4.实例在ISO C Clause 6中,语言的形式语法在标题Syntax下澄清,而剩余部分澄清非形式的翻译时检查的约束条件Constraints和一般的语义规则Semantics(对于库还有Runtime Constraints)。ISO C区分Constraints的要点是——这些规则和Syntax一样,必须在翻译时被检查和诊断(diagnostics)。WG14/N15702 If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint or runtimeconstraintis violated, the behavior is undefined. Undefined behavior is otherwiseindicated in this International Standard by the words ‘‘undefined behavior’’ or by theomission of any explicit definition of behavior. There is no difference in emphasis among they all describe ‘‘behavior that is undefined’’.这个意义下,Constraints的规则和语法规则具有同等效力,尽管其中有一部分是形式语法说不清楚的(constant-expression)。而剩下的,违反了就当未定义行为了。在ISO C++中,这里的设计更加明确。WG21/N45271.3.27 [defns.well.formed]well-formed programC++ program constructed according to the syntax rules, diagnosable semantic rules, and the One DefinitionRule (3.2).1.4 Implementation compliance [pliance]1 The set of diagnosable rules consists of all syntactic and semantic rules in this International Standard exceptfor those rules containing an explicit notation that “no diagnostic is required” or which are described asresulting in “undefined behavior.”同逻辑学的习惯,“合式”被作为构造性正确的标准,是可以明确决定的——只不过仍然不要求实现必须确定。有别于未定义行为,这里明确区分了诊断要求,表示了更精细的区别。ODR本质上来源于构造性语义规则,不过因为单独翻译链接模型和对于不同实体本身的复杂性,这里做了妥协,直接和语法规则、可诊断语义规则并列了。另外值得一提的是,虽然ISO C和ISO C++的Annex A都直接给出了类似的东西,但标题却不大一样:C是Language syntax summary,C++是Grammar summary。其实也不难理解:C++的语法和语义虽然在原则上多少是想要明确分离的,具体设计上却自己打脸。C的语法接近上下文无关语法(context-free grammar)(考虑到抽风的指针语法所以不纯粹),而C++的情况明显糟糕得多。因为语言要求的一些消歧义非形式文法规则,严格的、单纯的C++语法分析器事实上并不存在。比如说声明中的()表示一个函数声明符还是初值符的一部分,不判断现有实体的类型是不知道的,而类型需要经过进一步上下文相关的语义分析才能确定。现有的实现基本上用的是有效然而无奈的笨办法:假定每种文法正确都试一遍,最后留下一个没错的就说明没歧义了。换句话说,要说C++的“语法”烂,正是因为它连“语法”是什么都说不清楚——规则的边界本来就是模糊的。大概这个槽点,ISO C++的Annex A也就老实写grammar而不是syntax了,尽管和C一样,明明两者都没有给出形式语义……Java在这里就好得多,直接给出了文法定义,并明确使用上下文无关文法。(尽管实际上仍然只有形式语法……是Guy Steele参与起草的关系么?)JLS 82 Grammars 92.1 Context-Free Grammars 92.2 The Lexical Grammar 92.3 The Syntactic Grammar 102.4 Grammar Notation 10当然,Java的语义一锅乱七八糟的这里不展开了。C#大体上抄的Java,以及C艹的部分糟烂(又是关于&&的疼货)……ECMA-334 3 20059.1 Programs9.2 Grammars9.2.1 Lexical grammar9.2.2 Syntactic grammar9.2.3 Grammar ambiguitiesECMAScript总体上也是一路货(否则干嘛叫JavaScript……)ECMA-262 5.1 20115 Notational Conventions5.1 Syntactic and Lexical Grammars5.1.1 Context-Free Grammars5.1.2 The Lexical and RegExp Grammars5.1.3 The Numeric String Grammar5.1.4 The Syntactic Grammar5.1.5 The JSON Grammar5.1.6 Grammar NotationC++/CLI是直接照搬ISO C++偷懒了。Haskell 2010 Report则只是提了下notation,看起来都没说啥grammar……不知道对混乱的设计有多少自知之明呢。作为补充说明,Scheme的RnRS是少数给出了文法描述的形式语义的语言规范。正文符号太疼略。顺便,注意Scheme的语法和S-expression的语法是两回事。
5.结语抛开形式语法,没有一个实用语言的语法是足够简单到直接能一看就全记住的……那些提啥“只是语法”还有“语法书”的,真拿得出一本出来么。或者替我贴完ISO C的Annex A科普一下瞧瞧?(剩下的懒得写了自行脑补。)
插楼,来看帝球装逼(不对是真逼)。
果断插入,前排围观地球
除了结语都没看懂,难道这就是传说中的计算机语言学?
太长,不看
现金红包注册即送,在享10.5%预期收益
太长不看++}
超级厉害。
好久没来C吧发这种帖子了
最近是帝球活跃期呀。还不是说了,看帝球谈技术。
看不懂.还是灌水轻松
听说不可以占楼层,果断的插进
19楼的机智打动了我
估计用vc99的很多人都会跑来问,syntax error到底怎么改?
强势围观!!!
围观楼主年薪300
界过吊绝对叼
围观   --来自无所不能的安卓智能手机豪华助手版贴吧客户端
啥,啥,这说的都是啥。。。完全看不懂。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 c语言语法基础 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信