:: wikimiki.org ::
| 源程序 |
源程序源代码(也称源程序),是指一系列人类可读的计算机语言指令。
在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。
作用
源代码主要功用有如下2种作用:
#生成目标代码,即计算机可以识别的代码。
#对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。
需要指出的是,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。
代码组合
源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分为了达到比较高的运行效率,则可以用汇编语言编写。
较为复杂的软件,一般需要数十种甚至上百种的源代码的参与。为了降低种复杂度,必须引入一种可以描述各个源代码之间联系,并且如何正确编译的系统。在这样的背景下,修订控制系统(RCS)诞生了,并成为研发者对代码修订的必备工具之一。
还有另外一种组合:源代码的编写和编译分别在不同的平台上实现,专业术语叫做软件移植。
版权
如果按照源代码类型区分软件,通常被分为两类:自由软件和非自由软件。自由软件一般是不仅可以免费得到,而且公开源代码;相对应地,非自由软件则是不公开源代码。所有一切通过非正常手段获得非自由软件源代码的行为都将被视为非法。
质量
对于计算机而言,并不存在真正意义上的“好”的源代码;然而作为一个人,好的书写习惯将决定源代码的好坏。源代码是否具有可读性,成为好坏的重要标准。软件文档则是表明可读性的关键。
效率
虽然我们可以通过不同的语言来实现计算机的同一功能,但在执行效率上则存在不同。普遍规律是:越高级的语言,其执行效率越低。这也是为什么汇编语言生成的文件比用VB语言生成文件普遍要小的原因。
Category:程序设计
ja:ソースコード
ms:Kod sumber
人类
人属(学名Homo,来自拉丁语人)是灵长目人科中的一个属。今天生活在世界上的现代人是其唯一幸存的一个种。然而,有动物学家認为黑猩猩亦应归入人属。
人属最大的特点是其发达的脑。在二百万年的进化中其脑的含量扩大了三倍。
在人科中人属的特点是:
- 特别大的头颅容量
- 前额直立
- 不断增大的脑,尤其是大脑
- 咀嚼肌肉的退缩
- 牙齿的大小逐渐相近,逐渐减小
- 上下颌逐渐变小
- 手逐渐灵活
- 出生道变阔
- 妇女乳房变大(无法在化石中验证这是否也适应于已灭绝的人种)
人属中的人种:
- 卢多尔夫人(Homo rudolfensis),约240至160万年前,东非
- 能人(Homo habilis),190至160万年前,东非
- Homo antecessor(前人?),90万年前,西班牙
- 直立人(Homo erectus),170至30万年前,阿尔及利亚,中国,爪哇
- Homo ergaster(巨人、东非直立人、匠人等多种翻译),180至140万年前,东非,南非,格鲁吉亚
- 海德堡人(Homo heidelbergensis),60至10万年前,欧洲,东非
- 尼安德塔人(Homo neanderthalensis),20至3万年前,中东,欧洲
- 智人(Homo sapiens),自20万年来
Category:人科
指令由于你的文章更类似于一个词典的释义或者只是一个定义,因此该页面已经移动到维基词典,你可以从这里访问,如果你觉得你需要基于该作品写成一个百科全书条目,请点击左上角的"重定向自"然后进行编辑。编辑时请在页面中加入如下的一行。
如果您对一个运行Wiki软件的辞典有与趣,请参与维基词典工程!
参看
- wikipedia:不适合维基百科的文章
- Wikipedia:维基百科不是词典
- Wikipedia:什么是条目
ja:核子
编译器编译器,是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能识别,运行的低级机器语言的程序。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源程序一般为高级语言(High-level language),如Pascal,C++等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。
一个现代编译器的主要工作流程如下:
- 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables])
工作原理
翻译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。
编译器种类
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。
预处理器(preprocessor)
作用是通过代入预定义等程序段将源程序补充完整。
编译器前端(frontend)
前端主要负责解析(parse)输入的源程序,由词法分析器和语法分析器协同工作。词法分析器负责把源程序中的‘单词’(Token)找出来,语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。
例如“a = b + c;”前端词法分析器看到的是“a, =, b , +, c;”,语法分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。
前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在次基础上进一步优化,处理。
编译器后端(backend)
编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。
一般说来所有的编译器分析,优化,变型都可以分成两大类: 函数内(intraprocedural)还是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。
编译器分析(compiler analysis)的对象是前端生成并传递过来的中间代码,现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序,高层的中间代码(high level IR)接近输入的源程序的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与机器语言类似。 不同的分析,优化发生在最适合的那一层中间代码上。
常见的编译分析有函数调用树(call tree),控制流程图(Control flow graph),以及在此基础上的 变量定义-使用,使用-定义链(define-use/use-define or u-d/d-u chain),变量别名分析(alias analysis),指针分析(pointer analysis),数据依赖分析(data dependence analysis)等等。
上述的程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变新有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(array padding),等等。 优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threaded code)。
机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)的策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。
编译语言与解释语言对比
许多人将高级程序语言分为两类: 编译型语言 和 解释型语言 。然而,实际上,这些语言中的大多数既可用编译型实现也可用解释型实现,分类实际上反映的是那种语言常见的实现方式。(但是,某些解释型语言,很难用编译型实现。比如那些允许 在线代码更改 的解释型语言。)
历史
上世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如现在所称的Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。现在它已是编译原理中的一个标准部分。
有限状态自动机(Finite Automaton)和正则表达式(Regular Expression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。
人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code Improvement Technique)。
当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(Parser Generator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由Steve Johnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由Mike Lesk为Unix系统开发)是这其中的佼佼者。
在70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。
编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它现在正迅速地成为计算机科学课程中的中心环节。
在九十年代,作为GNU项目或其它开放源代码项目的一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感性趣的人可以很容易的得到它们的免费源代码。
大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。
参见
- 计算机科学课程列表
category:系统软件
Category:程序设计工具
ja:コンパイラ
ko:컴파일러
simple:Compiler
th:ตัวแปลโปรแกรม
学习学习(Learning)
词源
學習最早可追溯至孔子在論語中所言:學而時習之,不亦悅乎?學是指知識和經驗的累積,習是指知識和經驗的實踐。學屬知,習屬行。中國大儒王陽明曾提倡知行合一。
定义
學習是一個透過教授或體驗而獲得知識、技術、態度或價值的過程,從而導致可量度的穩定的行為變化,更準確一點來說是建立新的精神結構或審視過去的精神結構。學習必須倚賴經驗才可以有長遠成效。
學習是受外在環境刺激引起的行為的变化,要有可观察、可测量的外在变化。古典制約和操作制約的研究。
学习是内在倾向或能力的变化,内在变化与外显行为并不完全一致。(当然内在的变化还必须由外在的变化来推测)
这种变化应是后天经验习得的,不是先天的反应或者生理成熟的作用。
这种变化要能保持一段时期。
综合两大学派可以这样来定义学习:学习是因经验而引起的行为或内在倾向与能力的较为持久的变化。
学习的类型
布卢姆的教育目标分类
- 认知领域
- 知识
- 领会
- 运用
- 分析
- 综合
- 评价
- 情感领域
- 接受
- 反应
- 价值化
- 组织
- 性格化
- 心因动作技能领域
- 知觉
- 定向
- 反应
- 机械动作
- 复杂的外显反应
- 适应
- 创新
加涅的学习结果分类
- 言语信息
- 智慧技能
- 辨别
- 具体概念
- 定义性概念
- 规则
- 高级规则
- 认知策略
- 动作技能
- 态度
学习过程模型
加涅的学习结果分类
梅耶的学习过程模型
有效学习的条件
内部条件
- 适当的知识准备
- 主动加工的心理倾向
外部条件
category:教育
category:學習
category:心理学
ja:学習
ko:학습
软件复用软件复用是一种计算机软件工程方法和理论。60年代的“软件危机”使程序设计人员明白难于维护的软件成本是极其高昂的,当软件的规模不断扩大时,这种软件的综合成本可以说是没有人能负担的,并且即使投入了高昂的资金也难以得到可靠的产品,而软件重用的思想是解决这一问题的根本方法。
软件复用的主要思想是,将软件看成是由不同功能部分的“组件”所组成的有机体,每一个组件在设计编写时可以被设计成完成同类工作的通用工具,这样,如果完成各种工作的组件被建立起来以后,编写一特定软件的工作就变成了将各种不同组件组织连接体来的简单问题,这对于软件产品的最终质量和维护工作都有本质性的改变。
Category:软件工程
C语言C,是一种通用的程序设计语言,它主要用来进行系统程序设计。具有高效、灵活、功能丰富、表达力强和移植性好等的特点,在程序员中备受青睐。
C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)和肯·汤普逊(Ken Thompson)于1970年研制出的B语言的基础上发展和完善起来的。C语言可以广泛应用于不同的操作系统,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言是一种面向过程的语言,同时具有高级语言和汇编语言的优点。在C语言的基础上发展起来的有支持多种程序设计风格的C++语言,网络上广泛使用的Java、JavaScript,微软的C#等。
1983年,美国国家标准委员会(ANSI)对C语言进行了标准化,于1983年颁布了第一个C语言标准草案(83 ANSI C),后来于1987年又颁布了另一个C语言标准草案(87 ANSI C)。最新的C语言标准是在1999年颁布并在2000年3月被ANSI采用的 C99 ,但由于未得到主流编译器厂家的支持,直到2004年C99 并未被广泛使用,增加了若干新特性后 C99 已经逐渐让C语言和C++分道扬镳。
C语言的特色
- C语言是系统程序语言。
- C语言保留了低级语言的特性,例如涉及内存的指针。
- 使用了预处理机制,使得程序里可以通过包含例如宏处理的方式来处理源程序。
C语言的不足可以由C语言发展而来的更新的编程语言改进。Cyclone语言的拥有提防对于内存错误的特性。C++和Objective C提供了用于面向对象的编程结构。Java和C#增加了面向对象的结构使得对内存的管理自动化。
C語言的主要特性
- C語言保留了低階語言的特性,例如涉及記憶體的指针。
- C語言通過參數在函數裏傳遞數值。
- 使用了預處理機制,使得程式裏可以通過包含例如巨集處理的方式來處理根源程式。
- C語言提供了一套標準庫,這些庫裏提供了十分有用的功能。
但是並不是所有的這些特性都是有效的。例如,預處理通常作爲一個獨立的程式被處理,這使得预處理的程式並不一定被完全編譯。
雖然C是高階語言,但是它同時擁有一些組合語言的特性,對其他的語言來說這是接近低階語言的特點。例如,在C語言裏,程式師可以對電腦記憶體進行管理。在默認的情況下,C語言不會對陣列的範圍進行檢查,也就是說即使陣列越界,C語言也不會作出錯誤提示。對電腦記憶體的管理使得程式员可以编出更快捷、更有效的程式,這對於設備驅動程式來說尤爲重要。但是這也使得程式容易産生令人討厭的“臭蟲”,例如緩衝器溢出錯誤。然而,這些錯誤可以由一些工具來避免。
C語言的不足可以由从C語言發展而來的更新的編程語言改進。Cyclone語言的擁有提防對於記憶體錯誤的特性。C++和Objective C提供了用於面向物件的編程結構。Java和C#增加了面向物件的結構使得對記憶體的管理自動化。
近年来,由于Java的编译技术有了极大的提高,采取许多C和C++不能采用的动态编译技术,使得Java的性能日益突出。
C语言的历史
C语言的第一次发展在1969年到1973年之间。C之所以被称为C是因为C语言的很多特性是由一种更早的被称为B语言的编程语言中发展而来的。
到了1973年,C语言已经可以用来编写Unix操作系统的内核。这是第一次用C语言来编写操作系统的内核。丹尼斯·里奇和Brian Kernighan在1978年出版了《C程序设计语言》(The C Programming Language,经常简称为“白皮书”或“K&R”)。
1980年以后,贝尔实验室使得C变得更为广泛的流行,使得C一度成为了操作系统和应用程序编程的首选。甚至到今天,它仍被广泛用于编写操作系统以及作为广泛的计算机教育的语言。但目前Java程序员的数量已经超过了C程序员和C++程序员的总和。2005年4月,C++之父称C++用户超过300万。
分析机构EvansData定期对开发人员展开调查,其调查结果与Stroustrup提出的C++正在扩张的说法相违背。EvansData的数据显示,以C++为工具的开发人员在整个开发界所占的比例由1998年春天的76%下降至2004年秋的46%。
Forrester最新的调查显示,C++、微软VisualBasic和Java是众多公司产品体系的首选语言。对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。
http://tech.sina.com.cn/it/2005-04-25/1042592385.shtml
http://www.yesky.com/SoftChannel/72343471356116992/20050425/1940294.shtml
而据路透社2004年6月报道,java程序员在那时就已经超过了420万,java程序员在一年内增长了120万。按最保守的估计,现在java程序员也有500万
http://news.ccidnet.com/pub/article/c1366_a125565_p1.html
1980年代晚期,布贾尼·斯特劳斯特卢普和贝尔实验室为C语言添加了面向对象的特性.这种语言成为了C++。C++现在广泛应用的在Microsoft Windows下运行的商业应用程序的编制,然而C仍然是UNIX世界的热门编程语言。
C语言的版本
K&R C
C不断的从它的第一版本进行改进。在1978年,Kernighan和里奇的《C程序设计语言》第一版出版。它介绍了下面的有关C语言版本的特性:
- struct数据类型
- long int数据类型
- unsigned int数据类型
- 把运算符=+改为+=,依次类推。因为=+使得编译器混淆。
在以后的几年里,《C程序设计语言》一直被广泛作为C语言事实上的规范。在这本书中,C语言通常被表述成“K&R C”。(第二版的包括了ANSI C标准)
K&R C通常被作为C编译器所支持的最基本的C语言部分。虽然现在的编译器并不一定都完全遵循ANSI标准,但K&R C作为C语言的最低要求仍然要编程人员掌握。但是无论怎样,现在使用广泛的C语言版本都已经与K&R C相距甚远了,因为这些编译器都使用ANSI C标准。
//....
ANSI C和ISO C
1989年,C语言被ANSI标准化。(ANSI X3.159-1989)。标准化的一个目的是扩展K&R C。这个标准包括了一些新的特性。在K&R出版后,一些新的特征被“非官方”的加到C语言中。
- void函数
- 函数返回struct或union类型
- void - 数据类型
在ANSI标准化自己的过程中,一些新的特征被加了进去。ANSI也标准了函数库。ANSI C标准被ISO(国际标准化组织)采纳成为ISO 9899。ISO的第一个版本文件在1990年出版。
C99
在ANSI标准化后,C语言的标准在一段相当的时间内都保持不变,尽管C++继续在改进。(实际上,Normative Amendment1在1995年已经开发了一个新的C语言版本。但是这个版本很少为人所知。)标准在90年代才经历了改进,这就是ISO9899:1999(1999年出版)。这个版本就是通常提及的C99。它被ANSI于2000年三月采用。
在C99中包括的特性有:
- 对编译器限制增加了,比如源程序每行要求至少支持到 4095 字节,变量名函数名的要求支持到 63 字节 (extern 要求支持到 31)
- 预处理增强了。例如:
- 宏支持取参数 #define Macro(...) __VA_ARGS__
- 使用宏的时候,参数如果不写,宏里用 #,## 这样的东西会扩展成空串。(以前会出错的)
- 支持 // 行注释(这个特性实际上在C89的很多编译器上已经被支持了)
- 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool
- 支持 long long, long double _Complex, float _Complex 这样的类型
- 支持 <: :> <% %> %: %:%: ,等等奇怪的符号替代,D&E 里提过这个
- 支持了不定长的数组。数组的长度就可以用变量了。声明类型的时候呢,就用 int a[ - ] 这样的写法。不过考虑到效率和实现,这玩意并不是一个新类型。所以就不能用在全局里,或者 struct union 里面,如果你用了这样的东西,goto 语句就受限制了。
- 变量声明不必放在语句块的开头,for 语句提倡这么写 for(int i=0;i<100;++i) 就是说,int i 的声明放在里面,i 只在 for 里面有效。
- 当一个类似结构的东西需要临时构造的时候,可以用 (type_name) 这有点像 C++ 的构造函数
- 初始化结构的时候现在可以这样写:
struct hehe[] = ;
struct hehe = // 3,4 是对 .c,.d 赋值的
- 字符串里面,\u 支持 unicode 的字符
- 支持 16 进制的浮点数的描述
- 所以 printf scanf 的格式化串多支持了 ll / LL (VC6 里用的 I64) 对应新的 long long 类型。
- 浮点数的内部数据描述支持了新标准,这个可以用 #pragma 编译器指定
- 除了已经有的 __line__ __file__ 以外,又支持了一个 __func__ 可以得到当前的函数名
- 对于非常数的表达式,也允许编译器做化简
- 修改了对于 / % 处理负数上的定义,比如老的标准里 -22 / 7 = -3, -22 % 7 = -1 而现在 -22 / 7 = -4, -22 % 7 = 6
- 取消了不写函数返回类型默认就是 int 的规定
- 允许 struct 定义的最后一个数组写做 [] 不指定其长度描述
- const const int i; 将被当作 const int i; 处理
- 增加和修改了一些标准头文件, 比如定义 bool 的 定义一些标准长度的 int 的 定义复数的 定义宽字符的 有点泛型味道的数学函数 跟浮点数有关的 。 里多了一个 va_copy 可以复制 ... 的参数。 里多了个 struct tmx 对 struct tm 做了扩展
- 输入输出对宽字符还有长整数等做了相应的支持
但是各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的时候,微软和Borland却似乎对此不感兴趣。
C语言的Hello World程序
下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:
#include
int main(void)
进一步了解C
C语言由函数和变量组成。C的函数就像是Fortran中的子程序和函数。
在C语言中,程序从main开始执行。main函数通过调用和控制其他函数进行工作。例如上面的printf。程序员可以自己写函数,或从库中调用函数。在上面的return 0;使得main返回一个值给调用程序的外壳,表明程序已经成功运行。
一个C语言的函数由返回值、函数名、参数列表(或void表示没有返回值)和函数体组成。函数体的语法和其它的复合的语句部分是一样的。
复合语句
C语言中的复合语句的格式为:
复合语句可以使得几个语句变成一个语句。
但一般情况下,我们不推荐这样多个语句顺序书写, 因为这样会使其可读性减弱,加大代码维护难度。
条件语句
C语言有三种条件语句形式。两种是if,另一种是switch。
两种if包括:
if (条件表达式)
语句;
以及
if (条件表达式)
语句;
else
语句;
在条件表达式中,任何非零的值表示条件为真;如果条件不满足,程序将跳过if后面的语句,直接执行if后面的语句。但是如果if后面有else,则当条件不成立时,程序跳到else处执行。
switch通常用于对几种有明确值的条件进行控制。它要求的条件值通常是整数或字符。与switch搭配的条件转移是case。使用case后面的标值,控制程序将跳到满足条件的case处一直往下执行,直到语句结束或遇到break。通常可以使用default把其它例外的情况包含进去。如果switch语句中的条件不成立,控制程序将跳到default处执行。switch是可以嵌套的。
switch (<表达式>)
循环语句
C语言有三种形式的循环语句:
do
<语句>
while (<表达式>);
while (<表达式>)
<语句>;
for (<表达式1> ; <表达式2> ; <表达式3>)
<语句>;
在while和do中,语句将执行到表达式的值为零时结束。在do...while语句中,循环体将至少被执行一次。这三种循环结构可以互相转化:
for (e1; e2; e3)
s;
相当于
e1;
while (e2)
当循环条件一直为真时,将产生死循环。
跳转语句
跳转语句包括四种:goto,continue,break和return。
goto语句是无条件转移语句:
goto 标记
标记必须在当前函数中定义,使用“标记:”的格式定义。程序将跳到标记处继续执行。由于goto容易产生阅读上的困难,所以应该尽量少用。
continue语句用在循环语句中,作用是结束当前一轮的循环,马上开始下一轮循环。
break语句用在循环语句或switch中,作用是结束当前循环,跳到循环体外继续执行。但是使用break只能跳出一层循环。在要跳出多重循环时,可以使用goto使得程序更为简洁。
当一个函数执行结束后要返回一个值时,使用return。return可以跟一个表达式或变量。如果return后面没有值,将执行不返回值。
在C99中运算符号
数据类型
基础数据类型
注意:以下是典型的数据位长和范围。但是编译器可能使用不同的数据位长和范围。这取决于使用的编译器。请参考具体的参考手册。
在头文件和中说明了基础数据的长度。float,double和long double的范围就是在IEEE 754标准中提及的典型数据。
数组
如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NUL作为数组的结束。
例如:
:int myvector [100];
:char mystring [80];
:float mymatrix [3] [2] =
:int notfull [3][3] = ( - )
:char lexicon [10000] [300] ; / - 共一万个最大长度为300的字符数组。 - /
:int a[3][4];
上面最后一个例子创建了一个数组,但也可以把它看成是一个多维数组。注意数组的下标从0开始。这个数组的结构如下:
例子( - )创建了一个3 - 3的二维数组,初始化时有些元素并未赋值.如下:
:1 0 0
:1 2 3
:4 5 0
为0的位置的数值是随机的.
指针
如果一个变量声明时在前面使用 - 号,表明这个变量是一个指针。
例如:
:int - pi; / - 指向整型数据的指针 - /
:int - api[3]; / - 由指向整型数据的指针构成的数组,长度为3 - /
:char - argv; / - 指向一个字符指针的指针 - /
储存在指针中的地址所指向的数值在程序中可以由 - 读取。例如,在第一个例子中, - pi是一个整型数据。这叫做引用一个指针。
另一个运算符&,叫做取地址运算符,它将返回一个变量、数组或函数的存储地址。因此,下面的例子:
:int i, - pi; / - int and pointer to int - /
:pi = &i;
i和 - pi在程序中可以相互交替使用,直到pi被改变成指向另一个变量的指针。
字符串
要使用字符串并不需要引用库,但是C标准库确实包含了一些用于对字符串进行操作的函数,使得它们看起来就像字符串而不是数组。使用这些函数需要引用头文件。
- strcat(dest, source) - 连接两个字符串,把source加到dest末尾。
- strchr(s, c) -在字符串c中找出字符s第一次出现的位置。当没有找到时,返回Null。
- strcmp(a, b) - 比较字符串a和b的大小。如果两个字符串相同,返回0;如果a>b,返回正数;如果a,返回负数。
- <- 把source中的n个字符追加到dest后面。null后面的值将不会被添加。
- strncmp(a, b, n) - 比较字符串a和b中n个字符的大小。如果两个字符串相同,返回0;如果a>b,返回正数;如果a,返回负数。
- strncpy(dest, source, n) - 把字符串source拷贝到字符串dest中。(最多拷贝n个)
- strrchr(s, c) - 在s中查找最后一次出现c的位置。返回这个位置。如果找不到,返回null。
文件输入/输出
在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI/ISO C中,这些函数被定义在头文件中。
标准输入/输出
有三个标准输入/输出是预定义的:
- stdin 标准输入
- stdout 标准输出
- stderr 输入输出错误
这些定义在运行过程中是自动的打开和关闭的,所以它们并不需要进行显式定义。
下面的这个例子显示了一个过滤程序(filter program)是怎样构成的。
#include
int main()
传递命令行参数
在命令行赋予程序的参数将通过在main()函数中定义一个整型参数(int)和一个指向字符指针的指针型参数(char - )来实现,前者传递命令行参数的个数,后者传递命令行参数内容。习惯上将这两个参数分别命名为argc和argv。程序文件名被作为第一个命令行参数。
对于下列程序:
#include
int main(int argc, char - argv)
输入命令(假设该程序生成C:\TC\a.exe):
a one two three
则会得到下面的输出结果:
0:C:\TC\A.EXE
1:one
2:two
3:three
C语言的标准库
以下列出由C语言提供的标准函数库,函数库通过#include进行引用。
在C89标准中:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
在95年的修正版中
-
-
-
在C99中增加了六个函数库
-
-
-
-
-
-
C语言的保留关键字
参见
- 计算机科学课程列表
ja:C言語
ko:C 프로그래밍 언어
ms:Bahasa pengaturcaraan C
th:ภาษาซี
自由软件自由软件是由自由軟體基金會所提出的,他是指一件可以让用户自由复制、使用、研究、修改、分发等等,而不附带任何条件的软件。自由软件的主要许可证有GPL许可证和BSD许可证兩種。
以下是自由软件更詳細的規範:
- Freedom 0: 任何人皆有因任何目的執行該軟體的自由。
- Freedom 1: 任何人皆可自由的研究該程式的源代碼並且依照自己的需求加以更改。
- Freedom 2: 任何人皆可自由的再將該軟體散發來幫助自己周遭的人。
- Freedom 3: 任何人皆可自由的改進該程式,並將改變對大眾發表,如此整個社群都將受惠。
如要滿足Freedom 1以及Freedom 3則該軟體必需讓使用者能夠觀看/修改源代碼。也就是說,滿足Freedom 1以及Freedom 3的軟體可被稱為開放源代碼軟件。但是如果是要成為自由軟件則 Freedom 0~3 皆需滿足。
開放源代碼軟件與自由軟件
嚴格地說來,開放源代碼軟件(開源軟件)與自由軟件是兩個不同的概念,只要符合開源軟件定義的軟件就能被稱為開放源代碼軟件。自由軟件是一個比開源軟件更嚴格的概念,因此所有自由軟件都是開放源代碼的,但不是所有的開源軟件都能被稱為「自由」。但在現實上,絕大多數開源軟件也都符合自由軟件的定義。比如,遵守GPL和BSD許可的軟件都是開放的並且是自由的。
參看
- Copyleft
- GNU
- GNU宽通用公共许可证
- Richard Stallman
- GNU/Linux
- 开放源代码
站外链接
- [http://www.gnu.org/philosophy/linux-gnu-freedom.zh.html Linux、GNU 和自由]
- [http://www.gnu.org/gnu/thegnuproject.zh.html GNU计划]
- [http://www.gnu.org/gnu/gnu-history.zh.html GNU计划概述]
- [http://www.gnu.org/philosophy/philosophy.zh.html GNU专案之哲学]
ja:フリーソフトウェア
ko:자유 소프트웨어
simple:Free software
th:ซอฟต์แวร์เสรี
zh-min-nan:Chū-iû nńg-thé
Category:程序设计
Category:计算机软件
Category:软件工程 Dziadowskie czwartkiDziadowskie czwartki - powstała w 1986 r. cykliczna amatorska impreza kabaretowa na zadany temat, związana z zielonogórskim klubem studenckim Gęba. Jej organizatorem jest Władysław Sikora. Dziadowskie czwartki są naturalnym źródłem pozyskiwania nowych artystów do Zielonogórskiego Zagłębia Kabaretowego.
Zobacz też
Premiera w trzy dni
kategoria:polskie kabarety
sylwester darmowe statystyki House apartment madrid tablice
|
|
|
| :: RELATED NEWS :: |
Portail:Alsace/Section:Politique
- Généralités :Cinquième république – Politique en Alsace – Strasbourg - Colmar
----
- Collectivités territoriales :
- Région, Département,
|
Marcel Treich-Laplène
L'explorateur français Marcel Treich-Laplène (1860-1890) est né à Ussel, en Corrèze, et mort devant Grand-Bassam, capitale administrative de la Côte d'Ivoire. Engagé en 1883 comme premier commis à Élima de la plantation du Rochelais Arthur Verdier, alors R
|
Link: Faces of Evil
Link: Faces of Evil est un jeu vidéo de Philips sorti en 1992 sur CD-I. Il reprend l'univers de la série the Legend of Zelda mais contrairement à la plupart des jeux de cette série il n'est pas réalisé par Nintendo. Le jeu fait partie d'une série de trois jeux avec Zelda's Adventure et
La Cité du train est le principal musée ferroviaire de France. Située à Mulhouse (Haut-Rhin), elle est la continuation du « musée français du chemin de fer », du nom de l'association chargée de conserver l
|
Comté de Longford
Le Comté de Longford (en gaélique : Contae an Longfoirt) est une circonscription de la République d’Irlande située dans les Midlands, au nord ouest de la province du Leinster. Il est entouré des Comtés de Leitrim, Cavan, Roscommon et Dake - @ 23:36, 10 novembre 2005 (CET)
1407, morte le 1476, était fille de Jean sans Peur, duc de Bourgogne, comte de Nevers, de Bourgogne et de Flandre, et de roches magmatiques, résultant du refroidissement rapide d'une lave, magma arrivé à la surface, d'où leurs autres noms de roches extrusives ou roches effusives.
Leur structure (ou texture)
Elle est généralement microlitique, caractérisée par la présence de
|
|