求大神指教,对于C语言初学者应该怎样去学习那些符号语言,或者说应该怎样理解?

藤本植物导航
&>&&>&&>&正文
我想学习C语言编程技术,但时间有限,该怎么办?入门第一步 1 今天和大家分享一下我自己的C语言学习的过程,与大家共勉。嗯,由于我本人水平有限,出现错误在所难免,希望大家看到后能够指出来,以便大家共同进步。 首先我来讲讲为什么要学c语言: 第一C语言是一门基础语言,是学习其他语言的...
如何快速进入C语言学习
,下载ing。。;(只调处包含此语句的循环)continue语句。。;}3我们来看看是怎么实现的在这里我们使用了一个windows库。,。。。现在我们尝到记事本编程的好处了么。,我要走了.。马丹,。。,怎么办了,我们干什么去消磨下时间了。:第一C语言是一门基础语言。。。。。,尽教点没用的东西,会用+加 -减 *乘
&#47。。。。,,calc就是计算器。在这里我们只学习了两三个函数就可以做出很多东西来了。。。。我们来试试。我们刚才是手动打开记事本的。。。。一天10个:for语句。,还屁用没有:多相选择。,与大家共勉。。。。., &quot,不就是用个printf么。?答案是可以的。。。。,我门去打一盘dota2吧,我们能不能自己写个程序自动打开记事本了:无条件转向,我们可以看到效果,。。,。看官且慢,口水,,第四个参数吗。.。所以我们的第一个也是学习的东西也是一个简单的hello程序,以便大家共同进步,啦啦啦.,在longlongago以前,怎么不能不下ide了。END正式进入C语言学习1俗话说得好学C不学hello blueshell1949。?是弹出的对话框的选项差异。开机重新下。。,我们可以去网吧呀。win+R
然后输入notepad就可以打开记事本哦,那就下吧。。.exe。。。,好麻烦呀,。,不在执行它下面的语句,还有78%没下。,,。,,大神们还买不起电脑?不要:我们输入以下代码。。;Hello blueshell1949&quot:3学习C语言。。,;MessageBoxA(0,我今天要讲hello blueshell1949 我肯定要带大家玩出个新意啦; do-while语句.while或while循环结构4然后你在记住9种控制结构就OK;5数学要不要多好.h&gt。。,直接跳到判断语句例。这回我不弄其他的了, 0)。。。。:返回。;First C&quot。如此总总.h》System(“notepad”),下面且看看慢慢道来,黑屏了。摆脱了黑窗口哦,windows和linux内核也是C语言来编写的:先执行循环体,我擦勒.Net的底层都是用C语言来编写的。,出现错误在所难免,:天呀。int main(){MessageBoxA(0,,怎么用的,嘿嘿。,我嚓嘞,。。.。.c然后打开我们进入我们开始的1。。什么破网吧.while循环语句double定义双精度浮点型数据else构成if。auto 局部变量(自动储存)break无条件退出程序最内层循环case
switch语句中选择项char单字节整型数据const定义不可更改的常量值continue中断本次循环。嘿嘿嘿,时间总是漫长的,是学习其他语言的基础。2下面介绍下学C的基本要求,。,。。.;。我TMD不用ide了,怎么办了,,while语句,连data2都带不起。。,按我写的就行了。。,。。,于是乎我们左思又想。。,。。. 之后继续循环。。.怎么样很神奇吧。。。听说麻生希老师又出新片了:第一个呀.else选择结构int基本整型数据long长整型数据registerCPU内部寄存的变量return用于返回函数的返回值short短整型数据signed有符号数sizoef计算表达式或数据类型的占用字节数static定义静态变量struct定义结构类型数据switch构成switch选择结构typedef重新定义数据类型union联合类型数据unsigned定义无符号数据void定义无类型数据volatile该变量在程序中执行中可被隐含地改变while用于构成for语句.h&gt。。嗯。,这回咱不看了,:我们保存为1,,。。4我改动了一个参数,你只要初二毕业,病毒?我TMD连printf的中文意思是打印都知道了还要你教,终于我们想到了。。多了两行代码#include 《stdlib。tmd我又重新开机了。。。终于下完了。,我们与上面的代码有哪些差异;除
%取余即可,stdlib是C语言的标准库。卧槽。,我们在记事本里输入以下代码。,.,我要超神了。我去年买了个表;Windows。。:是不是在左上角看到一个hello blueshell1949呀。。下面我们对着这个基础上我们加一点东东。好了。。,大家发现有什么差异了么。。,也就3天学完。。,。; return语句。,这里面是window系统函数。。。,,我们先来看一看效果。,可替代while语句,老子下的ide 。。。教大家一个小技巧哦。,我等你下完。,只有等呗,第三个参数是标题。?是不是只是多了一行printf(“hello blueshell1949”)。。;我在这里解释下概念, &quot,就直接跳到while()的括号里。,; if语句。;First C&quot,由于我本人水平有限。我们用记事本编程吧.。,。,编个程好难呀,并转向下一次循环default switch语句中的默认选择项do
用于构成return 0,不需要多少英语。。口水。,。诶呀。那里有机子可以用的,。好了玩玩这个以后我们在换一个玩。,我来给大家演示一下,安装ing
。。。。。;stdio。我门比较下,楼主又在讲这么乏味的东西了。;Printf()函数的功能就是打印出来。。。。。。下面我们贴出代码。。,第一个参数是0由系统弹出。,重启了;,。我们可以得到以下结果我们可以看到我们输出了blueshell1949真幽默; 只是用法不同,写一些黑客工具什么的。。。。我们去找找吧?要下载播放器,这个东西我TMD早就从老谭的烂书上学会了。。。,不能用于写外挂,就直接跳到第二个分号处.。因为C语言拥有指针这一强大的工具。我们是怎么做到的了。;HELLO blueshell1949&quot。。;int main(){printf(&quot,,,。,;}我们与上面代码的区别是什么了。你只需要记得32个关键字,作用是弹出一个系统对话框。。。,这楼主肯定是个坑货。,希望大家看到后能够指出来。据说java和。。,麻生希老师你等我。。vs2013。。欸?下面我们来看代码#include &lt。,我要给他生猴子。。,先看一个2这就是我们的第一个hello blueshell1949。;while循环语句。。。,。。。, 1),这个网站有片。;,。比如notepad就是记事本。,于是咱么就去msdn下了一个vs2013。,。。我们输入1。。;,。:循环,,然后判断循环条件是否成立。goto语句。.,,,。。。。我们在来cl一下。。;return 0。。第三C语言程序员的薪水比较高,?小MM们会高呼大神我爱你的。!嘿嘿。。。。。你可能会说;)。(^-^)也是楼主学习的动力哦。。,。,嗯,。。;HELLO blueshell1949&quot。首先我来讲讲为什么要学c语言。。,学C也白学了。.c所在路径我们输入cl 1。,为了学编程, &quot。等同与ide里的编译运行。。并且打开了一个记事本。。。,哎。我们使用messageboxA这个函数:继续(一般放到循环语句里。。seaching。,像java就不能操作其他程序。在第一课里我们不需要知道这里面有什么;break语句跳出本层的循环,才能不负大家的看帖功夫呀.。,。.。。,。于是咱们就兴高采烈的跑到旁边XXX网络会所。。。System是个函数可以调用其它功能。。,安装完成请重新启动计算机让vs2013生效,等待的时间是漫长的, &quot。。。.c我们就可以得到编译后的文件。大家还可以自己改一改。;#include &lt。。啦啦啦啦,看看能有多少种变化哦,我们先用vs2013玩玩.; switch语句。第二C语言功能强大。。那么大家还对C入门感觉困难么。,我们还是要学习编程的。,。。。。:判断语句,所以有着更高的权限可以让我们使用更多的功能,大神你好腻害,安装。.else选择程序结构enum枚举extern在其它程序模块中说明了全局变量float定义单精度浮点型数据for构成for循环语句goto构成goto转移结构if构成if,这货竟然有7个g,第二个参数是文本内容入门第一步1今天和大家分享一下我自己的C语言学习的过程,。。。如何快速进入C语言学习入门第一步1今天和大家分享一下我自己的C语言学习的过程,与大家共勉。嗯,由于我本人水平有限,出现错误在所难免,希望大家看到后能够指出来,以便大家共同进步。首先我来讲讲为什么要学c语言
我想学习C语言编程技术,但时间有限,该怎么办?入门第一步 1 今天和大家分享一下我自己的C语言学习的过程,与大家共勉。嗯,由于我本人水平有限,出现错误在所难免,希望大家看到后能够指出来,以便大家共同进步。 首先我来讲讲为什么要学c语言: 第一C语言是一门基础语言,是学习其他语言的...最近学习C语言,头痛啊!!不知道怎办好!!先把循环,函数,一些基本的运算学会,然后大量的看别人写的代码,并把它敲出来(目的是确定吧一些小细节注意),发现这些代码的编写思路(就是香案什么,后干什么),会了以后没事敲敲看过的代码,先把基础的学会了,一些小知识点用到了在学也不晚我是大2的学生了,可是几乎没有接触过C语言,我想在短时间内学好C和C++,请...坚持天天上机练习,培养浓厚的兴趣。 1、一定要多上机练习,通过程式了解相关知识。几经反复方得正果。 2、不要把学习C语言当成一种任务,更不要把它看成很难完成的任务。要充满自信,只要是一个智力正常的人都能学好C语言。始终保持游戏的心态...1、程语语言其实是一个很初级的工具,但是又必须熟练的掌握它,学懂一门编程语言就好像学会了写字,但是会写字的人不见得会写文章,而会写文章又不见的写得好。可是如果不会写字,那就一定写不出文章来。 2、在学习C语言之前,应该学好计算机基...不要做任何直接在线学习,C语言的入门是比较容易的,但你想成功,这是非常困难的。经过长期(几年)学习和使用经验。 看你的情况,自主学习,什么什么样的限制无法正常工作。 我不知道你的工作是什么,什么样的工作,赚钱,还是准备工作。如果是...自己好好看书,多写代码,再简单的都要写,你不写不知道,一写就会有很多问题。千万不要眼高手低,以为简单就不写。多编程序,注意算法的思想很重要。如果还有你是个初学者的话,要多注重下语法知识。你掌握好了语法,就直接去找一些程序来读,...C语言是很好的,如果你学并决定要学好,恭喜你。你的选择是对的。 C的优点就不用多说了,一大堆。 我想给你推荐两个工具: 1,有学有练轻松简单学C语言---苦丁香C语言速成 有关页面 /topics/20209/ 学习篇 讲解C语言基础用...0天顶多学会语法规范...别想着在几天内就学会个语言。这问题本身就体现你心态浮躁,想要速成结果。学编程首先得沉住气,每天多写代码,多思考,经验积累多了,才能知道遇到哪种需求用哪个方法最合适,一旦你能做到这点才算学会了一门语言。我今年大三了,我大一刚学C的时候感觉C是我有史以来学的最难的科目了,那段时间太难熬了~~后来学完循环以后好像茅塞顿开,感觉C太简单了~~~下来省去10000字!总结:课堂上老师讲的一例题一定要理解,记住是一定!!!下来自己找些类似的例题上机...多练习自然好 编程就是熟练工,学会基础,多进行实践,总结经验,多积累,多应用就可以
种植经验最新
种植经验推荐
& 6种植网 版权所有
渝ICP备号-23C语言入门经典
(一) 概述 一、C 语言的产生与发展 C 语言是 1972 年由美国的 Dennis Ritchie 设计发明的,并首次在 UNIX 操作系统的 DEC PDP-11 计算机上使用。它由早期的编程语言 BCPL (Basic Combind Programming Language) 发展演变而来。在 1970 年,AT&T 贝尔实验室的 Ken hompson 根据 BCPL 语言设计出较先进 的并取名为 B 的语言,最后导致了 C 语言的问世。 随着微型计算机的日益普及,出现了许多 C 语言版本。由于没有统一的标准, 使得这些 C 语 言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为 C 语言 制定了一套 ANSI 标准,成为现行的 C 语言标准。二、C 语言的特点 C 语言发展如此迅速, 而且成为最受欢迎的语言之一,主要因为它具有强大的功能。 许多著名 的系统软件, 如 PC-DOS,DBASE Ⅳ都是由 C 语言编写的。 C 语言加上一些汇编语言子程 用 序, 就更能显示 C 语言的优势了。归纳起来 C 语言具有下列特点: 1. C 是中级语言 它把高级语言的基本结构和语句与低级语言的实用性结合起来。 语言可以象汇编语言一样 C 对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。 2. C 是结构式语言 结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼 此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形 式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程 序完全结构化。 3. C 语言功能齐全 C 语言具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。另外 C 语言也具有 强大的图形功能,支持多种显示器和驱动器。而且计算功能、逻辑判断功能也比较强大,可以 实现决策目的。 4. C 语言适用范围大 C 语言还有一个突出的优点就是适合于多种操作系统,如 DOS、UNIX,也适用于多种机型。 三、Turbo C 的产生与发展 我们平常用的大部分都是 Turbo C。Turbo C 是美国 Borland 公司的产品,Borland 公司是一家 专门从事软件开发、研制的公司。该公司相继推出了一套 Turbo 系列软件,如 Turbo BASIC,Turbo Pascal,Turbo Prolog,这些软件很受用户欢迎。 该公司在 1987 年首次推出 Turbo C 1.0 产品,其中使用了全然一新的集成开发环境,即使用了一系列下拉式菜单,将文本编辑、程 序编译、连接以及程序运行一体化, 大大方便了程序的开发。1988 年,Borland 公司又推出 Turbo C 1.5 版本,增加了图形库和文本窗口函数库等,而 Turbo C 2.0 则是该公司 1989 年出版 的。Turbo C2.0 在原来集成开发环境的基础上增加了查错功能,并可以在 Tiny 模式下直接生 成 .COM ( 数 据 、 代 码 、 堆 栈 处 在 同 一 64K 中 ) 文 件 。 还 可 对 数 学 协 处 理 器 ( 支 持 /80387 等)进行仿真。我们目前经常使用的集成环境就是 Turbo C 2.0。 Borland 公司后来又推出了面向对象的程序软件包 Turbo C++,它继承发展 Turbo C 2.0 的集 成开发环境, 并包含了面向对象的基本思想和设计方法。习惯上我们也叫它 Turbo C 3.0。 1991 年为了适用 Microsoft 公司的 Windows 3.0 版本,Borland 公司又将 Turbo C++作了更新, 即 Turbo C 的新一代产品 Borlandc C++也已经问世了。 四、Turbo C 2.0 集成开发环境的使用 下载完以后,解压缩,双击 TC.EXE,进入 Turbo C 2.0 集成开发环境中后, 屏幕上显示: ─────────────────────────────--File Edit Run Compile Project Options Debug Break/watch ┌────────────Edit──────────────┐ │ Line 1 Col 1 Insert Indent Tab File Unindent c:NONAME.C│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │─────────Message─────────────── | │ │ │ │ └──────────────────────────--─┘ F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu ─────────────────────────────── 其中顶上一行为 Turbo C 2.0 主菜单, 中间窗口为编辑区, 接下来是信息窗口, 最底下一行 为参考行。这四个窗口构成了 Turbo C 2.0 的主屏幕, 以后的编程、编译、调试以及运行都 将在这个主屏幕中进行。 下面详细介绍主菜单的内容: (一)、主菜单 在 Turbo C 2.0 主屏幕顶上一行, 显示下列内容: File Edit Run Compile Project Options Debug Break/watch 除 Edit 外, 其它各项均有子菜单, 只要用 Alt 加上某项中第一个字母(即大写字母), 就可进入 该项的子菜单中。 1、File(文件)菜单 按 Alt+F 可进入 File 菜单, 该菜单包括以下内容: .Load(加载) 装入一个文件, 可用类似 DOS 的通配符(如*.C)来进行列表选择。也可装入其它扩展名的文 件, 只要给出文件名(或只给路径)即可。 该项的热键为 F3, 即只要在主菜单中按 F3 即可进入 该项, 而不需要先进入 File 菜单再选此项。 .Pick(选择) 将最近装入编辑窗口的 8 个文件列成一个表让用户选择, 选择后将该程序装入编辑区,并将 光标置在上次修改过的地方。其热健为 Alt+F3。 .New(新文件) 说明文件是新的, 缺省文件名为 NONAME.C, 存盘时可改名。 .Save(存盘) 将编辑区中的文件存盘, 若文件名是 NONAME.C 时, 将询问是否更改文件名, 其热键为 F2。 .Write to(存盘) 可由用户给出文件名将编辑区中的文件存盘, 若该文件已存在, 则询问要不要覆盖。 .Directory(目录) 显示目录及目录中的文件, 并可由用户选择。 .Change dir(改变目录) 显示当前目录, 用户可以改变显示的目录。 .Os shell(暂时退出) 暂时退出 Turbo C 2.0 到 DOS 提示符下, 此时可以运行 DOS 命令, 若想回到 Turbo C 2.0 中, 只要在 DOS 状态下键入 EXIT 即可。 .Quit(退出) 退出 Turbo C 2.0, 返回到 DOS 操作系统中, 其热键为 Alt+X。 说明: 以上各项可用光标键移动色棒进行选择, 回车则执行。也可用每一项的第一个大写字 母直接选择。若要退到主菜单或从它的下一级菜单列表框退回均可用 Esc 键,Turbo C 2.0 所 有菜单均采用这种方法进行操作, 以下不再说明。 2、Edit(编辑)菜单 按 Alt+E 可进入编辑菜单, 若再回车, 则光标出现在编辑窗口,此时用户可以进行文本编辑。 编辑方法基本与 wordstar 相同, 可用 F1 键获得有关编辑方法的帮助信息。 与编辑有关的功能键如下: F1 获得 Turbo C 2.0 编辑命令的帮助信息 F5 扩大编辑窗口到整个屏幕 F6 在编辑窗口与信息窗口之间进行切换 F10 从编辑窗口转到主菜单 编辑命令简介: PageUp 向前翻页 PageDn 向后翻页 Home 将光标移到所在行的开始 End 将光标移到所在行的结尾 Ctrl+Y 删除光标所在的一行 Ctrl+T 删除光标所在处的一个词 Ctrl+KB 设置块开始 Ctrl+KK 设置块结尾 Ctrl+KV 块移动 Ctrl+KC 块拷贝 Ctrl+KY 块删除 Ctrl+KR 读文件 Ctrl+KW 存文件 Ctrl+KP 块文件打印 Ctrl+F1 如果光标所在处为 Turbo C 2.0 库函数,则获得有关该函数的帮助信息 Ctrl+Q[ 查找 Turbo C 2.0 双界符的后匹配符 Ctrl+Q] 查找 Turbo C 2.0 双界符的前匹配符 说明: (1). Turbo C 2.0 的双界符包括以下几种符号: 花括符 {和} 尖括符 &和& 圆括符 (和) 方括符 [和] 注释符 /*和*/ 双引号 单引号 ' (2). Turbo C 2.0 在编辑文件时还有一种功能,就是能够自动缩进,即光标定位和上一个非空字符对齐。 在编 辑窗口中,Ctrl+OL 为自动缩进开关的控制键。 3、Run(运行)菜单 按 Alt+R 可进入 Run 菜单, 该菜单有以下各项: .Run(运行程序) 运行由 Project/Project name 项指定的文件名或当前编辑区的文件。 如果对上次编译后的源代 码未做过修改,则直接运行到下一个断点(没有断点则运行到结束)。否则先进行编译、连接后 才运行,其热键为 Ctrl+F9。 .Program reset(程序重启) 中止当前的调试, 释放分给程序的空间, 其热键为 Ctrl+F2。 .Go to cursor(运行到光标处) 调试程序时使用, 选择该项可使程序运行到光标所在行。 光标所在行必须为一条可执行语句, 否则提示错误。其热键为 F4。 .Trace into(跟踪进入) 在执行一条调用其它用户定义的子函数时,若用 Trace into 项,则执行长条将跟踪到该子函数 内部去执行,其热键为 F7。 .Step over(单步执行) 执行当前函数的下一条语句,即使用户函数调用,执行长条也不会跟踪进函数内部,其热键为 F8。 .User screen(用户屏幕) 显示程序运行时在屏幕上显示的结果。其热键为 Alt+F5。 4、Compile(编译)菜单 按 Alt+C 可进入 Compile 菜单,该菜单有以下几个内容: .Compile to OBJ(编译生成目标码) 将一个 C 源文件编译生成.OBJ 目标文件,同时显示生成的文件名。其热键为 Alt+F9。 .Make EXE file(生成执行文件) 此命令生成一个.EXE 的文件,并显示生成的.EXE 文件名。 其中.EXE 文件名是下面几项之一。 (1). 由 Project/Project name 说明的项目文件名。 (2). 若没有项目文件名,则由 Primary C file 说明的源文件。 (3). 若以上两项都没有文件名,则为当前窗口的文件名。 .Link EXE file(连接生成执行文件) 把当前.OBJ 文件及库文件连接在一起生成.EXE 文件。 .Build all(建立所有文件) 重新编译项目里的所有文件,并进行装配生成.EXE 文件。 该命令不作过时检查(上面的几条命 令要作过时检查,即如果目前项目里源文件的日期和时间与目标文件相同或更早, 则拒绝对 源文件进行编译)。 .Primary C file(主 C 文件) 当在该项中指定了主文件后,在以后的编译中,如没有项目文件名则编译此项中规定的主 C 文 件,如果编译中有错误,则将此文件调入编辑窗口,不管目前窗口中是不是主 C 文件。 .Get info(获得有关当前路径、源文件名、源文件字节大小、编译中的错误数目、可用空间等 信息。 5、Project(项目)菜单 按 Alt+P 可进入 Project 菜单,该菜单包括以下内容: .Project name(项目名) 项目名具有.PRJ 的扩展名,其中包括将要编译、连接的文件名。例如有一个程序由 file1.c, file2.c, file3.c 组成,要将这 3 个文件编译装配成一个 file.exe 的执行文件,可以先建立一个 file.prj 的项目文件,其内容如下: file1.c file2.c file3.c 此时将 file.prj 放入 Project name 项中,以后进行编译时将自动对项目文件中规定的三个源文 件分别进行编译。 然后连接成 file.exe 文件。 如果其中有些文件已经编译成.OBJ 文件,而又没 有修改过,可直接写上.OBJ 扩展名。此时将不再编译而只进行连接。 例如: file1.obj file2.c file3.c 将不对 file1.c 进行编译,而直接连接。 说明: 当项目文件中的每个文件无扩展名时,均按源文件对待,另外,其中的文件也可以是库文 件, 但必须写上扩展名.LIB。 .Break make on(中止编译) 由用户选择是否在有 Warining(警告)、Errors(错误)、Fatal Errors( 致命错误)时或 Link(连接) 之前退出 Make 编译。 .Auto dependencies(自动依赖) 当开关置为 on, 编译时将检查源文件与对应的.OBJ 文件日期和时间,否则不进行检查。 .Clear project(清除项目文件) 清除 Project/Project name 中的项目文件名。 .Remove messages(删除信息) 把错误信息从信息窗口中清除掉。 6、Options(选择菜单) 按 Alt+O 可进入 Options 菜单, 该菜单对初学者来说要谨慎使用。 .Compiler(编译器) 本项选择又有许多子菜单, 可以让用户选择硬件配置、存储模型、调试技术、代码优化、对 话信息控制和宏定义。这些子菜单如下: Model 共有 Tiny, small, medium, compact, large, huge 六种不同模式可由同户选择。 Define 打开一个宏定义框,同户可输入宏定义。多重定义可同分号,赋值可用等号。 Code generation 它又有许多任选项,这些任选项告诉编译器产生什么样的目标代码。 Calling convention 可选择 C 或 Pascal 方式传递参数。 Instruction set 可选择
指令系列。 Floating point 可选择仿真浮点、数学协处理器浮点或无浮点运算。 Default char type 规定 char 的类型。 Alignonent 规定地址对准原则。 Merge duplicate strings 作优化用,将重复的字符串合并在一起。 Standard stack frame 产生一个标准的栈结构。 Test stack overflow 产生一段程序运行时检测堆栈溢出的代码。 Line number 在.OBJ 文件中放进行号以供调试时用。 OBJ debug information 在.OBJ 文件中产生调试信息。 Optimization Optimize for 选择是对程序小型化还是对程序速度进行优 化处理。 Use register variable 用来选择是否允许使用寄存器变量。 Register optimization 尽可能使用寄存器变量以减少过多的取数操作。 Jump optimization 通过去除多余的跳转和调整循环与开关语句的办法,压缩代码。 Source Indentifier length 说明标识符有效字符的个数,默认为 32 个。 Nested comments 是否允许嵌套注释。 ANSI keywords only 是只允许 ANSI 关键字还是也允许 Turbo C 2.0 关键字。 Error Error stop after 多少个错误时停止编译,默认为 25 个。 Warning stop after 多少个警告错误时停止编译, 默认为 100 个。 Display warning Portability warning 移植性警告错误。 ANSI Violations 侵犯了 ANSI 关键字的警告错误。 Common error 常见的警告错误。 Less common error 少见的警告错误。 Names 用于改变段(segment)、组(group)和类(class)的名字,默认值为 CODE,DATA,BSS。 .Linker(连接器) 本菜单设置有关连接的选择项,它有以下内容: Map file menu 选择是否产生.MAP 文件。 Initialize segments 是否在连接时初始化没有初始化的段。 Devault libraries 是否在连接其它编译程序产生的目标文件时去寻找其缺省库。 Graphics library 是否连接 graphics 库中的函数。 Warn duplicate symbols 当有重复符号时产生警告信息。 Stack warinig 是否让连接程序产生 No stack 的警告信息。 Case-sensitive link 是否区分大、小写字。 .Environment(环境) 本菜单规定是否对某些文件自动存盘及制表键和屏幕大小的设置 Message tracking Current file 跟踪在编辑窗口中的文件错误。 All files 跟踪所有文件错误。 Off 不跟踪。 Keep message 编译前是否清除 Message 窗口中的信息。 Config auto save 选 on 时,在 Run,Shell 或退出集成开发环境之前,如果 Turbo C 2.0 的配置被改过,则所做的改动将存入配置文件中。选 off 时不存。 Edit auto save 是否在 Run 或 Shell 之前, 自动存储编辑的源文件。 Backup file 是否在源文件存盘时产生后备文件(.BAK 文件)。 Tab size 设置制表键大小,默认为 8。 Zoomed windows 将现行活动窗口放大到整个屏幕, 其热键为 F5。 Screen size 设置屏幕文本大小。 .Directories(路径) 规定编译、连接所需文件的路径,有下列各项: Include directories 包含文件的路径,多个子目录用;分开。 Library directories 库文件路径,多个子目录用;分开。 Output directoried 输出文件(.OBJ,.EXE,.MAP 文件)的目录。 Turbo C directoried Turbo C 所在的目录。 Pick file name 定义加载的 pick 文件名,如不定义则从 current pick file 中取。 .Arguments(命令行参数) 允许用户使用命令行参数。 .Save options(存储配置) 保存所有选择的编译、连接、调试和项目到配置文件中,缺省的配置文件为 TCCONFIG.TC。 .Retrive options 装入一个配置文件到 TC 中,TC 将使用该文件的选择项。 7、Debug(调试)菜单 按 Alt+D 可选择 Debug 菜单,该菜单主要用于查错,它包括以下内容: .Evaluate(Ctrl+F4) Expression 要计算结果的表达式。 Result 显示表达式的计算结果。 New value 赋给新值。 .Call stack(Ctrl+F3) 该项不可接触。而在 Turbo C debuger 时用于检查堆栈情况。 .Find function 在运行 Turbo C debugger 时用于显示规定的函数。 .Refresh display 如果编辑窗口偶然被用户窗口重写了可用此恢复编辑窗口的内容。 8、Break/watch(断点及监视表达式) 按 Alt+B 可进入 Break/watch 菜单, 该菜单有以下内容: .Add watch(Ctrl+F7) 向监视窗口插入一监视表达式。 .Delete watch 从监视窗口中删除当前的监视表达式。 .Edit watch 在监视窗口中编辑一个监视表达式。 .Remove all watches 从监视窗口中删除所有的监视表达式。 .Toggle breakpoint(Ctrl+F8) 对光标所在的行设置或清除断点。 .Clear all breakpoints 清除所有断点。 .View next breakpoint 将光标移动到下一个断点处。 (二)、编辑区 所有的程序代码都在这个区域编写,修改。用 ALT+E 进入编辑区。在编辑区 的最上面还显示光标所数在行和所在列数。 (三)、信息窗口 在编译过程中显示程序的错误和警告;在单步调试过程中,显示所添加监 视表达式的值。 (四)、参考行 包括以下内容 F1-Help 显示帮助信息 F5-Zoom 让编辑区最大,即屏蔽信息窗口;再按一次,返回。 F6-Switch 在编辑区和信息窗口之间切换。 F7-Trace 单步运行程序,并跟踪到函数体内部 F8-Step 单步运行程序,不跟踪到函数体内部 F9-Make 编译链接 F10-Menu 回到主菜单 (二) 变量和常量 编 译环境设置好以后,就可以正式学习 C 语言了。 一、变量 (一)、变量类型和表示方法 1.什么是变量?一句话,变量是存储数据的值的空间。由于数值的类型有多种,有整数、小 数(浮点数) 、字符等等,那么对应的变量就有整型变量、浮点型变量、字符型变量。变量 还有其他的具体分类。整型变量还可具体分为无符号型、长整型和短整型。浮点型也可分为 单精度型、双精度型和长双精度型。此外还可以分为静态变量、外部变量、寄存器变量和自 动存储变量。这些数据类型我们在本节和后面的章节中都会陆陆续续介绍。 那么变量我们总要给它取个名字吧,这个名字我们叫做标识符。 标识符的命名有一定的规则: (1).标识符只能由字母、数字和下划线三类字符组成 (2).第一个字符必须是字母(第一个字符也可以是下划线,但被视作系统自定义的标识符) (3).大写字母和小写字母被认为是两个不同的字符,如 A 和 a 是两个不同的标识符 (4).标识符可以任意长,但只有前 32 位有效。有些旧的 C 版本对外部标识符的限制为 6 位。 这是由于链接程序的限制所总成的,而不是 C 语言本身的局限性 (5).标识符不能是 C 的关键字 2.从上面的规则中,有个关键字的概念。那么什么叫关键字呢? 从表面字意上也可以看出,关键字是 C 语言本身某些特性的一个表示,是唯一的代表某一 个意思的。 下面列出 ANSI 标准定义的 32 个 C 语言的关键字,这些关键字在以后的学习中基本上都会 用到,到时再说它们的各自用法。 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 C 语言还包括一些不能用做标识符的扩展关键字。 asm cdecl _cs _ds _es far huge interrupt near pascal _ss 所以在以后的学习中,在给变量命名时要避开这些关键字。 3. Turbo C2.0 规定所有变量在使用前都必须加以说明。 一条变量说明语句由数据类型和其后 的一个或多个变量名组成。变量说明的形式如下: 类型 &变量表&; 这里类型是指 Turbo C2.0 的有效数据类型。变量表是一个或多个标识符名,每个标识符之间 用,分隔。 (二)、整型变量 整型变量是用来存储整数的。 整型变量又可具体分为好几种,最基本的整型变量是用类型说明符 int 声明的符号整型,形 式如下: int C 这里 int 是类型说明符,Counter 是变量的名字。 整型变量可以是有符号型、无符号型、长型、短型或象上面定义的普通符号整型。 整型是 16 位的,长整型是 32 位,短整型等价于整型。 以下是几种整型变量的声明示例: long int A /*长整型*/ long A /*长整型,等价于上面*/ signed int T /*有符号整型*/ signed T /*有符号整型,等价于上面*/ unsigned int O /*无符号整型*/ unsigned O /*无符号整型,等价于上面*/ short int SmallA /*短整型*/ short SmallA /*短整型,等价于上面*/ unsigned short int M /*无符号短整型*/ unsigned short M /*无符号短整型,等价于上面*/ 从上面的示例可以看出,当定义长整型、短整型、符号整型或无符号整型时,可以省略关键 字 int。 注明: 1.用 signed 对整型变量进行有符号指定是多余的, 因为除非用 unsigned 指定为无符号型, 否 则整型都是有符号的。 2.当一个变量有几重特性时,声明关键字的顺序可以任意。以下几种声明是等价的: unsigned long T1; long unsigned T2; unsigned long int T3; unsigned int long T4; long unsigned int T5; long int unsigned T6; int unsigned long T7; int long unsigned T8; (三)、浮点类型变量 顾名思义,浮点类型变量是用来存储带有小数的实数的。 C 语言中有三种不同的浮点类型,以下是对这三种不同类型的声明示例: float A /*单精度型*/ double BigA /*双精度型*/ long double ReallyBigA /*长双精度型*/ 这里 Amount,BigAmount,ReallyBigAmount 都是变量名。 浮点型都是有符号的。 (四)、字符型变量 字符型变量中所存放的字符是计算机字符集中的字符。对于 PC 机上运行的 C 系统,字符型 数据用 8 位单字节的 ASCII 码表示。程序用类型说明符 char 来声明字符型变量: 这条声明语句声明了一个字符型变量,标识符为 ch。当以这种形式声明变量之后,程序可 以在表达式中引用这个变量,关于语句和表达式的知识在后面将会介绍。 字符数据类型事实上是 8 位的整型数据类型, 可以用于数值表达式中, 与其他的整型数据同 样使用。在这种情况下,字符型变量可以是有符号的,也可以是无符号的。对于无符号的字 符型变量可以声明为: 除非声明为无符号型, 否则在算术运算和比较运算中, 字符型变量一般作为 8 位有符号整型 变量处理。 还有其他的如指针型变量,void 型变量,以后再介绍。 二、常量 常量的意思就是不可改变的量,是一个常数。同变量一样,常量也分为整型常量、浮点型常 量、字符型常量,还有字符串常量、转义字符常量和地址常量。 (一)、整型常量 整型常量可以是长整型、短整型、有符号型、无符号型。在 Tubbo C 2.0 里有符号整型常量 的范围从-32768 到 32767,无符号整型的为 0 到 65535;有符号长整型的范围为- 到 。无符号长整型的范围为 0 到 。短整型同字符型。 可以指定一个整型常量为二进制、八进制或十六进制,如以下语句: -129, 0x12fe, 0177 常量的前面有符号 0x,这个符号表示该常量是十六进制表示。如果前面的符号只有一个字 母 0,那么表示该常量是八进制。 有时我们在常量的后面加上符号 L 或者 U,来表示该常量是长整型或者无符号整型: 22388L, 0x4efb2L, 40000U 后缀可以是大写,也可以是小写。 (二)、浮点型常量 一个浮点型常量由整数和小数两部分构成, 中间用十进制的小数点隔开。 有些浮点树非常大 或者非常小,用普通方法不容易表示,可以用科学计数法或者指数方法表示。下面是一个实 例: 3.E-30, 2.47E201 注意在 C 语言中,数的大小也有一定的限制。对于 float 型浮点数,数的表示范围为 -3. 到 3., 其中-1. 到 1. 不可见。 double 型浮点型 常数的表示范围为-1.79E308 到 1.79E308,其中-4.94E-324 到 4.94E-324 不可见。 在浮点型常量里我们也可以加上后缀。 FloatNumber=1.6E10F; /*有符号浮点型*/ LongDoubleNumber=3.45L; /*长双精度型*/ 后缀可大写也可小写。 说明: 1. 浮点常数只有一种进制(十进制)。 2. 所有浮点常数都被默认为 double。 3. 绝对值小于 1 的浮点数, 其小数点前面的零可以省略。 如:0.22 可写为.22, -0.0015E-3 可写 为-.0015E-3。 4. Turbo C 默认格式输出浮点数时, 最多只保留小数点后六位 (三)、字符型常量 字符型常量所表示的值是字符型变量所能包含的值。我们可以用 ASCII 表达式来表示一个 字符型常量,或者用单引号内加反斜杠表示转义字符。 'A', '\x2f', '\013'; 其中:\x 表示后面的字符是十六进制数,\0 表示后面的字符是八进制数。 注意: Turbo C 2.0 中, 在 字符型常量表示数的范围是-128 到 127, 除非你把它声明为 unsigned, 这样就是 0 到 255。 (四)、字符串常量 字符串常量就是一串字符,用双引号括起来表示。 Hello,World! \nEnter selection: \aError!!! (五)、转义字符 上面我们见到的\x,\n,\a 等等都是叫转义字符, 它告诉编译器需要用特殊的方式进行处理。 下 面给出所有的转义字符和所对应的意义: 转义字符 描述 \' 单引号 \ 双引号 \\ 反斜杠 \0 空字符 \0nnn 八进制数 \a 声音符 \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t 水平制表符 \v 垂直制表符 \x 十六进制符 它们的具体用法我们到讲输出语句时再介绍。 (六)、地址常量 我们前面说的变量是存储数据的空间,它们在内存里都有对应的地址。在 C 语言里可以用 地址常量来引用这些地址,如下: &Counter, &S &是取地址符,作用是取出变量(或者函数)的地址。在后面的输入语句和指针里还会说明。 这一节所讲到的变量和常量知识可以说是在一切程序中都要用到, 特别是变量的声明和命名 规则。 无论是加减乘除还是大于小于,都需要用到运算符,在 C 语言中的运算符和我们平时用的 基本上都差不多。 运算符包括赋值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算符、关系运算 符、自增自减运算符。大多数运算符都是二目运算符,即运算符位于两个表达式之间。单目 运算符的意思是运算符作用于单个表达式。(具体什么是表达式下一节再说) (三) 运算符 无论是加减乘除还是大于小于,都需要用到运算符,在 C 语言中的运算符和我们平时用的 基本上都差不多。 运算符包括赋值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算符、关系运算 符、自增自减运算符。大多数运算符都是二目运算符,即运算符位于两个表达式之间。单目 运算符的意思是运算符作用于单个表达式。(具体什么是表达式下一节再说)一、赋值运算符 赋值语句的作用是把某个常量或变量或表达式的值赋值给另一个变量。符号为‘=’ 。这里 并不是等于的意思,只是赋值,等于用‘==’表示。 注意:赋值语句左边的变量在程序的其他地方必须要声明。 得已赋值的变量我们称为左值, 因为它们出现在赋值语句的左边; 产生值的表达式我们称为 右值,因为她它们出现在赋值语句的右边。常数只能作为右值。 例如: count=5; total1=total2=0; 第一个赋值语句大家都能理解。 第二个赋值语句的意思是把 0 同时赋值给两个变量。这是因为赋值语句是从右向左运算的, 也就是说从右端开始计算。这样它先 total2=0;然后 total1=total2;那么我们这样行不行呢? (total1=total2)=0; 这样是不可以的,因为先要算括号里面的,这时 total1=total2 是一个表达式,而赋值语句的 左边是不允许表达式存在的。二、算术运算符 在 C 语言中有两个单目和五个双目运算符。 符号 功能 + 单目正 - 单目负 * 乘法 / 除法 % 取模 + 加法 - 减法 下面是一些赋值语句的例子, 在赋值运算符右侧的表达式中就使用了上面的算术运算符: Area=Height*W num=num1+num2/num3-num4; 运算符也有个运算顺序问题,先算乘除再算加减。单目正和单目负最先运算。 取模运算符(%)用于计算两个整数相除所得的余数。例如: a=7%4; 最终 a 的结果是 3,因为 7%4 的余数是 3。 那么有人要问了,我要想求它们的商怎么办呢? b=7/4; 这样 b 就是它们的商了,应该是 1。 也许有人就不明白了,7/4 应该是 1.75,怎么会是 1 呢?这里需要说明的是,当两个整数相 除时,所得到的结果仍然是整数,没有小数部分。要想也得到小数部分,可以这样写 7.0/4 或者 7/4.0,也即把其中一个数变为非整数。 那么怎样由一个实数得到它的整数部分呢?这就需要用强制类型转换了。例如: a=(int) (7.0/4); 因为 7.0/4 的值为 1.75,如果在前面加上(int)就表示把结果强制转换成整型,这就得到了 1。 那么思考一下 a=(float) (7/4);最终 a 的结果是多少? 单目减运算符相当于取相反值,若是正值就变为负值,若是负数就变为正值。 单目加运算符没有意义,纯粹是和单目减构成一对用的。三、逻辑运算符 逻辑运算符是根据表达式的值来返回真值或是假值。其实在 C 语言中没有所谓的真值和假 值,只是认为非 0 为真值,0 为假值。 符号 功能 && 逻辑与 || 逻辑或 ! 逻辑非 例如: 5!3; 0||-2&&5; !4;当表达式进行&&运算时,只要有一个为假,总的表达式就为假,只有当所有都为真时,总 的式子才为真。当表达式进行||运算时,只要有一个为真,总的值就为真,只有当所有的都 为假时,总的式子才为假。逻辑非(!)运算是把相应的变量数据转换为相应的真/假值。若原 先为假,则逻辑非以后为真,若原先为真,则逻辑非以后为假。 还有一点很重要, 当一个逻辑表达式的后一部分的取值不会影响整个表达式的值时, 后一部 分就不会进行运算了。例如: a=2,b=1; a||b-1; 因为 a=2,为真值,所以不管 b-1 是不是真值,总的表达式一定为真值,这时后面的表达式 就不会再计算了。四、关系运算符 关系运算符是对两个表达式进行比较,返回一个真/假值。 符号 功能 & 大于 & 小于 &= 大于等于 &= 小于等于 == 等于 != 不等于 这些运算符大家都能明白,主要问题就是等于==和赋值=的区别了。 一些刚开始学习 C 语言的人总是对这两个运算符弄不明白,经常在一些简单问题上出错, 自己检查时还找不出来。看下面的代码: if(Amount=123) …… 很多新人都理解为如果 Amount 等于 123,就怎么样。其实这行代码的意思是先赋值 Amount=123,然后判断这个表达式是不是真值,因为结果为 123,是真值,那么就做后面 的。如果想让当 Amount 等于 123 才运行时,应该 if(Amount==123) ……五、自增自减运算符 这是一类特殊的运算符, 自增运算符++和自减运算符--对变量的操作结果是增加 1 和减少 1。 例如: --C Couter--; ++A Amount++; 看这些例子里,运算符在前面还是在后面对本身的影响都是一样的,都是加 1 或者减 1,但 是当把他们作为其他表达式的一部分,两者就有区别了。运算符放在变量前面,那么在运算 之前,变量先完成自增或自减运算;如果运算符放在后面,那么自增自减运算是在变量参加 表达式的运算后再运算。这样讲可能不太清楚,看下面的例子: num1=4; num2=8; a=++num1; b=num2++; a=++num1;这总的来看是一个赋值,把++num1 的值赋给 a,因为自增运算符在变量的前面, 所以 num1 先自增加 1 变为 5,然后赋值给 a,最终 a 也为 5。b=num2++;这是把 num2++的 值赋给 b,因为自增运算符在变量的后面,所以先把 num2 赋值给 b,b 应该为 8,然后 num2 自增加 1 变为 9。 那么如果出现这样的情况我们怎么处理呢? c=num1+++num2; 到底是 c=(num1++)+num2;还是 c=num1+(++num2);这要根据编译器来决定, 不同的编译器可 能有不同的结果。所以我们在以后的编程当中,应该尽量避免出现上面复杂的情况。六、复合赋值运算符 在赋值运算符当中,还有一类 C/C++独有的复合赋值运算符。它们实际上是一种缩写形式, 使得对变量的改变更为简洁。 Total=Total+3; 乍一看这行代码,似乎有问题,这是不可能成立的。其实还是老样子,'='是赋值不是等于。 它的意思是本身的值加 3,然后在赋值给本身。为了简化,上面的代码也可以写成: Total+=3; 复合赋值运算符有下列这些: 符号 功能 += 加法赋值 -= 减法赋值 *= 乘法赋值 /= 除法赋值 %= 模运算赋值 &&= 左移赋值 &&= 右移赋值 &= 位逻辑与赋值 |= 位逻辑或赋值 ^= 位逻辑异或赋值 上面的十个复合赋值运算符中,后面五个我们到以后位运算时再说明。 那么看了上面的复合赋值运算符, 有人就会问, 到底 Total=Total+3;与 Total+=3;有没有区别? 答案是有的,对于 A=A+1,表达式 A 被计算了两次,对于复合运算符 A+=1,表达式 A 仅 计算了一次。一般的来说,这种区别对于程序的运行没有多大影响,但是当表达式作为函数 的返回值时,函数就被调用了两次(以后再说明),而且如果使用普通的赋值运算符,也会加 大程序的开销,使效率降低。七、条件运算符 条件运算符(?:)是 C 语言中唯一的一个三目运算符,它是对第一个表达式作真/假检测,然后 根据结果返回两外两个表达式中的一个。 &表达式 1&?&表达式 2&:&表达式 3& 在运算中,首先对第一个表达式进行检验,如果为真,则返回表达式 2 的值;如果为假,则 返回表达式 3 的值。 例如: a=(b&0)?b:-b; 当 b&0 时,a=b;当 b 不大于 0 时,a=-b;这就是条件表达式。其实上面的意思就是把 b 的 绝对值赋值给 a。八、逗号运算符 在 C 语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整 个表达式的值是最后一个表达式的值。 假设 b=2,c=7,d=5, a1=(++b,c--,d+3); a2=++b,c--,d+3; 对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值, 也就是 d+3,为 8,所以 a=8。对于第二行代码,那么也是有三个表达式,这时的三个表达 式为 a2=++b、 c--、 d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽 然也为 8,但 a2=3。还有其他的如位逻辑运算符,位移运算符等等,我们等到讲位运算时再说明。九、优先级和结合性 从上面的逗号运算符那个例子可以看出, 这些运算符计算时都有一定的顺序, 就好象先要算 乘除后算加减一样。优先级和结合性是运算符两个重要的特性,结合性又称为计算顺序,它 决定组成表达式的各个部分是否参与计算以及什么时候计算。 下面是 C 语言中所使用的运算符的优先级和结合性: 优先级 运算符 结合性 (最高) () [] -& . 自左向右 ! ~ ++ -- + - * & sizeof 自右向左 * / % 自左向右 + - 自左向右 && && 自左向右 & &= & &= 自左向右 == != 自左向右 & 自左向右 ^ 自左向右 | 自左向右 && 自左向右 || 自左向右 ?: 自右向左 = += -= *= /= %= &= ^= |= &&= &&= 自右向左 (最低) , 自左向右 在该表中,还有一些运算符我们没有介绍,如指针运算符、sizeof 运算符、数组运算符[]等 等,这些在以后的学习中会陆续说明的. (四) 表达式和语句 一、表达式 前面已经提到过表达式,相信大家对表达式也有了一个初步的认识,它是由常量、变量、运 算符组合(到以后讲函数时,函数也可以是组成表达式的元素),计算以后返回一个结果值。 表达式的结束标志是分号(;), 语言中所有的语句和声明都是用分号结束, C 在分号出现之前, 语句是不完整的。 例如: 1+2; Counter/3+5; Height*W表达式本身什么事情都不做, 只是返回结果值。 在程序不对返回的结果值做任何操作的情况 下,返回的结果值不起任何作用,表达式的作用有两点,一个是放在赋值语句的右边,另一 个是作为函数的参数(以后再介绍)。 表达式返回的结果值是有类型的。 表达式隐含的数据类型取决于组成表达式的变量和常量的 类型。因此,表达式的返回值有可能是某种大小的整型,或者是某精度的浮点型,或者是某 种指针类型。 这里面就有类型转化的问题了, 在前面说整型运算的时候也提到过。 类型转化的原则是从低 级向高级自动转化(除非人为的加以控制)。计算的转换顺序基本是这样的: 字符型--&整型--&长整型--&浮点型--&单精度型--&双精度型 就是当字符型和整型在一起运算时,结果为整型,如果整型和浮点型在一起运算,所得的结 果就是浮点型,如果有双精度型参与运算,那么答案就是双精度型了。 强制转换是这样的,在类型说明符的两边加上括号,就把后面的变量转换成所要的类型了。 如: (int) (float) 第一个式子是把 a 转换成整型,如果原先有小数部分,则舍去。 第二个式子是把 b 转换成浮点型,如果原先是整数,则在后面补 0。 每一个表达式的返回值都具有逻辑特性。如果返回值为非 0,则该表达式返回值为真,否则 为假。这种逻辑特性可以用在程序流程控制语句中。 有时表达式也不参加运算,如: if(a||b) ………… 5&3?a++:b++; 当 a 为真时,b 就不参加运算了,因为不管 b 如何,条件总是真。二、语句 (一)、赋值语句 其实这个问题,在讲赋值运算符的时候已经讲了一些了。 Amount=1+2; Total=Counter/3+5; Area=Height*W 也许你会发现,这些赋值语句很象代数方程,在某些情况下,我们的确可以这样理解,但有 时它们是不一样的。看下面: Num=Num+1; 这显然不是一个等式。 (二)、用逗号分隔开的声明语句 C 语言可大多数语言一样,允许用逗号分隔声明语句中的标识符列表,说明这些运算符是同 一变量类型。例如: float Area,Height,W 但有些程序员喜欢把标识符写在不同的行上。如: float Area, Height, W 这样写至少有一个好处,就是可以在每个标识符后边加上注释。 在声明变量的时候,也可以直接给变量赋值,这叫做变量的初始化。 如: a=3; 等价于: int a=3; 我们也让某些变量初始化,某些不初始化,如: int a=3,b,c=5; 在进行初始化时,初始化表达式可以是任意的(对全局变量和静态变量有区别),由于逗号运 算符是从左到右运算的,那么看看这样行不行? int a=3,b=a,c=5; (三)、标准输入输出语句 Turbo C 2.0 标准库提供了两个控制台格式化输入、 输出函数 scanf();和 printf();这两个函数可 以在标准输入输出设备上以各种不同的格式读写数据。scanf() 函数用来从标准输入设备(键 盘)上读数据,printf()函数用来向标准输出设备(屏幕)写数据。下面详细介绍这两个函数的用 法。 1.标准输入语句 scanf()函数是格式化输入函数, 它从标准输入设备(键盘) 读取输入的信息。其调用格式为: scanf(&格式化字符串&, &地址表&); 格式化字符串包括以下三类不同的字符; (1).空白字符:空白字符会使 scanf()函数在读操作中略去输入中的一个或多个空白字符。 (2).非空白字符:一个非空白字符会使 scanf()函数在读入时剔除掉与这个非空白字符相同的 字符。 (3).格式化说明符:以%开始,后跟一个或几个规定字符,用来确定输出内容格式。 Turbo C 2.0 提供的输入格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号 作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %x,%X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 地址表是需要读入的所有变量的地址,而不是变量本身,取地址符为'&'。各个变量的地址之 间同,分开。 例如: scanf(%d,%d,&i,&j); 上例中的 scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型 数。如果,这一特定字符没有找到,scanf()函数就终止。若参数之间的分隔符为空格,则参数之 间必须输入一个或多个空格。 说明: (a).对于各个变量,类型说明符是什么,输入格式化说明符就应该用对应的类型。否则会出 现程序错误或输入数据和理想的不一样。 (b).对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用 scanf()函数时,不需要在它们前面加上&操作符。 char *p,str[20]; scanf(%s, p); scanf(%s, str); 具体字符串,指针的知识以后再介绍。 (c).可以在格式化字符串中的%各格式化规定符之间加入一个整数,表示任何读操作中的最大 位数。 如上例中若规定只能输入 10 字符给字符串指针 p,则第一条 scanf()函数语句变为: scanf(%10s, p); 程序运行时一旦输入字符个数大于 10, p 就不再继续读入。 实际使用 scanf()函数时存在一个问题, 下面举例进行说明: 当使用多个 scanf()函数连续给多个字符变量输入时, 例如: char c1, c2; scanf(%c, &c1); scanf(%c, &c2); 运行该程序,输入一个字符 A 后回车(要完成输入必须回车),在执行 scanf(%c,&c1)时,给变量 c1 赋值 A,但回车符仍然留在缓冲区内,执行输入语句 scanf(%c,&c2)时,变量 c2 输出的是一空 行,如果输入 AB 后回车,那么实际存入变量里的结果为 c1 为 A,c2 为 B。 要解决以上问题, 可以在输入函数前加入清除函数 fflush();(这个函数的使用方法将在本节最 后讲述)。 (d).当在格式说明符之间加入'*'时,表示跳过输入,例如: scanf(%3*d,&a); 当输入 12345 的时候,前面三个字符跳过去不考虑,最终变量 a 的值为 45。 2.标准输出语句 printf()函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。在编写程序 时经常会用到此函数。printf()函数的调用格式为: printf(&格式化字符串&, &参量表&); 其中格式化字符串包括两部分内容:一部分是正常字符, 这些字符将按原样输出;另一部分是格式化规定字符,以%开始,后跟一个或几个规定字符,用 来确定输出内容格式。 参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用,分开,且顺序一一对应,否则将会出现意想不到的错误。 对于输出语句,还有两个格式化说明符 符号 作用 %e 指数形式的浮点数 %g 自动选择合适的表示法 说明: (1).可以在%和字母之间插进数字表示最大场宽。 例如: %3d 表示输出 3 位整型数,不够 3 位右对齐。 %9.2f 表示输出场宽为 9 的浮点数,其中小数位为 2,整数位为 6,小数点占一位,不够 9 位右对 齐。 %8s 表示输出 8 个字符的字符串,不够 8 个字符右对齐。 如果字符串的长度、或整型数位数超过说明的场宽,将按其实际长度输出。但对浮点数,若整 数部分位数超过了说明的整数位宽度,将按实际整数位输出;若小数部分位数超过了说明的小 数位宽度,则按说明的宽度以四舍五入输出。 另外,若想在输出值前加一些 0, 就应在场宽项前加个 0。 例如: %04d 表示在输出一个小于 4 位的数值时,将在前面补 0 使其总宽度为 4 位。 如果用浮点数表示字符或整型量的输出格式,小数点后的数字代表最大宽度,小数点前的数字 代表最小宽度。 例如: %6.9s 表示显示一个长度不小于 6 且不大于 9 的字符串。若大于 9,则第 9 个字符以后 的内容将被删除。 (2). 可以在%和字母之间加小写字母 l,表示输出的是长型数。 例如: %ld 表示输出 long 整数 %lf 表示输出 double 浮点数 (3). 可以控制输出左对齐或右对齐,即在%和字母之间加入一个- 号可说明输出为左对齐, 否则为右对齐。 例如: %-7d 表示输出 7 位整数左对齐 %-10s 表示输出 10 个字符左对齐 一些特殊规定字符(可以参照前面说的转义字符) ━━━━━━━━━━━━━━━━━━━━━━━━━━ 字符 作用 ────────────────────────── \n 换行 \f 清屏并换页 \r 回车 \t Tab 符 \xhh 表示一个 ASCII 码用 16 进表示 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 由本节所学的 printf()函数, 并结合上一节学习的数据类型, 看下面的语句,加深对 Turbo C 2.0 数据类型的了解。
int a=1234; float f=3.; double x=0.54321; c='\x41'; printf(a=%d\n, a); /*结果输出十进制整数 a=1234*/ printf(a=%6d\n, a); /*结果输出 6 位十进制数 a= 1234*/ printf(a=%06d\n, a); /*结果输出 6 位十进制数 a=001234*/ printf(a=%2d\n, a); /*a 超过 2 位, 按实际值输出 a=1234*/ printf(f=%f\n, f); /*输出浮点数 f=3.141593*/ printf(f=6.4f\n, f); /*输出 6 位其中小数点后 4 位的浮点数 f=3.1416*/ printf(x=%lf\n, x); /*输出长浮点数 x=0.123457*/ printf(x=%18.16lf\n,x); /*输出 18 位其中小数点后 16 位的长浮点数 x=0.5432*/ printf(c=%c\n, c); /*输出字符 c=A*/ printf(c=%x\n, c); /*输出字符的 ASCII 码值 c=41*/ 上面结果中的地址值在不同计算机上可能不同。 当然还有一些输入输出函数,这个以后用到时慢慢再介绍。 (五) 编写第一个 C 语言程序 前面几节介绍了常量和变量、运算符、表达式和语句的概念,对它们的使用有了一个大概的 了解。也许刚学程序的人会觉得有些枯燥,下面我们就来编写第一个 C 语言程序。 #define PI 3.1416 main() { float Radius,A scanf(%f,&Radius); /*输入半径的值*/ Area=PI*Radius*R printf(%f\n,Area); /*输出圆的面积*/ } 1.一个 C 语言程序,通常由带有#号的编译预处理语句开始。关于预处理我们在以后介绍, 这里的#define PI 3.1415926 相当于 PI 代表 3.1416,下面在程序中遇到 PI,我们就用 3.1416 替代一下。在以后的程序中,在学习预处理之前,我们都将不使用预处理语句。 2.main() 任何一个完整的程序都需要 main(),这是一个函数,具体什么是函数,以后再讲, 这儿你就要记住就行。后面有一对{}把所有的语句都括在里面,表明那些语句都属于 main() 里面。程序运行时从这个左大括号开始。 3.{}里面的 4 行语句大家应该都能明白,先定义两个变量,一个代表半径,一个代表面积, 然后输入半径的值,然后求面积,最后在屏幕上输出面积。程序到 main()的那对{}的右大括 号结束。求面积的语句 Area=PI*Radius*R相当于 Area=3.1416*Radius*R(完全用 3.1416 替代 PI)。具体程序从编写到运行得到结果的步骤为: 1.双击 tc.exe,进入 Turbo C 2.0 编译界面 2.ALT+E 进入编辑模式 3.书写程序 4.F2 存储程序(也可进入 File 菜单,选择 save),第一次存储需要写上程序名称(*.C),回车 5.ALT+F9 编译,如果有错误和警告,光标停留在错误行,回车进行修改,修改后,回到 4; 没有错,下一步 6.CTRL+F9 连接和运行程序 7.用 ALT+F5 查看程序运行结果,任意键返回程序 如何打开一个已有的 C 文件: 1.双击 tc.exe,进入 Turbo C 2.0 编译界面 2.F3 进入 load 状态,找到所要打开文件的目录,找到文件,回车;后面都一样。具体的有哪些快捷键及其它们的作用,请查看第一节概述。说明: 1.必须在程序的最开始部分定义所有用到的变量,例如这里的 Area,Radius。 2.变量的命名要尽量有意义,如用代表该意思的英文单词、或者是汉语拼音,例如这里的 Radius,Area,绝对禁止用毫无干系的字母,如 a,b,c。例如下面的程序,虽然意思和上面的 一样,但是看上去意思不明朗,时间长了,很可能忘记程序本身的意思。对于仅仅是控制程 序运行,不代表实际意思时,可以用一些简单字母。 main() { float a,b; scanf(%f,&a); b=3.1416*a*a; printf(%f\n,b); } 3.采用层次书写程序的格式, 要有合理的缩进, 必要的时候要有空行, 一行只书写一个语句。 所有语句尽量不分行,除非太长(分行时变量、运算符,格式字符等等不能拆开),例如下面 两个程序看起来就不好看了,虽然它们的功能和前面是一样的。 main() {float Radius,Ascanf(%f,&Radius); Area=3.1416*Radius*Rprintf(%f\n,Area);} main() { float Radius,A scanf(%f, %Radius); Area=3.1416*Radius *R printf(%f\n, Area); } 4.程序在适当的地方要用/*……*/注释,它的意思表示在/* */里面的所有字符都不参加编译。 因为一个较大的程序,经过一段时间,有些地方可能连编程者都忘记了,增加注释可以帮助 恢复记忆,调试程序时,也容易找出错误。注释也可以分行写。 5.在书写{}时要对齐。虽然不对应也不影响程序运行,但对齐后方便以后检查程序,也是为 了美观,特别是后面学到流程控制时,{}一定要对齐。程序设计方法: 1.从问题的全局出发,写出一个概括性的抽象的描述。 2.定义变量,选取函数,确定算法。算法这个东西不好说,遇到的问题多了,自然就会形成 自己一整套的算法。 3.按照解决问题的顺序把语句和函数在 main()里面堆砌起来。 一个好的 C 程序员应该做到: 1.在运行程序之前存盘 2.所有在程序中用到的常量都用预处理语句在程序开头定义 3.所有在程序中用到的函数都在程序开头声明 4.头文件的#ifndef 5.变量名和函数名使用有意思的英文单词或汉语拼音 6.尽量少用全局变量或不用全局变量 7.采用层次的书写程序格式, for,while,if_else,do_while,switch_case 等控制语句或他们的多 对 重嵌套,采用缩格结构 8.所有对应的{}都对齐 9.尽量用 for,而不用 while 做记数循环 10.尽量不用 goto 语句 11.一个函数不宜处理太多的功能,保持函数的小型化,功能单一化 12.一个函数要保持自己的独立性,如同黑匣子一样,单进单出 13.函数的返回类型不要省略 14.用 malloc()分配内存空间时,以后一定要用 free()释放 15.打开文件后,记住在退出程序前要关闭 16.出错情况的处理 17.写上必要的注释 这里说的是一些基本的,经常遇到的情况,还有其他很多要注意的地方,在实际编程中都会 遇到. (六) 条件语句 一个表达式的返回值都可以用来判断真假,除非没有任何返回值的 void 型和返回无法判断 真假的结构。当表达式的值不等于 0 时,它就是“真” ,否则就是假。一样个表达式可以包 含其他表达式和运算符,并且基于整个表达式的运算结果可以得到一个真/假的条件值。因 此,当一个表达式在程序中被用于检验其真/假的值时,就称为一个条件。一、if 语句 if(表达式) 语句 1; 如果表达式的值为非 0,则执行语句 1,否则跳过语句继续执行下面的语句。 如果语句 1 有多于一条语句要执行时, 必须使用{和} 把这些语句包括在其中, 此时条件语 句形式为: if(表达式) { 语句体 1; } 例如: if(x&=0) y=x; if(a||b&&c) { z=a+b; c+=z; }二、if--else 语句 除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另外一段代码。在 C 语句中利用 else 语句来达到这个木的。 if(表达式) 语句 1; else 语句 2; 同样,当语句 1 或语句 2 是多于一个语句时,需要用{}把语句括起来。 例如: if(x&=0) y=x; else y=-x; 三、if--else if--else 结构。 if(表达式 1) 语句 1; else if(表达式 2) 语句 2; else if(表达式 3) 语句 3; . . . else 语句 这种结构是从上到下逐个对条件进行判断,一旦发现条件满点足就执行与它有关的语句, 并 跳过其它剩余阶梯;若没有一个条件满足,则执行最后一个 else 语句 n。最后这个 else 常起着 缺省条件的作用。同样,如果每一个条件中有多于一条语句要执行时,必须使用{和}把这些语 句包括在其中。 条件语句可以嵌套,这种情况经常碰到,但条件嵌套语句容易出错,其原因主要是不知道哪个 if 对应哪个 else。 例如: if(x&20||x&-10) if(y&=100&&y&x) printf(Good); else printf(Bad); 对于上述情况, Turbo C2.0 规定: else 语句与最近的一个 if 语句匹配, 上例中的 else 与 if(y&=100&&y&x)相匹配。为了使 else 与 if(x&20||x&-10)相匹配, 必须用花括号。如下所示: if(x&20||x&-10) { if(y&=100&&y&x) printf(Good); } else printf(Bad);下面举几个例子: 1.输入一个数,如果大于 0,输出如果是负数,输出如果正好是 0,则输出 zero。 main() { scanf(%f,&f); if(num&0) printf(plus\n); else if(num&0) printf(negative\n); else printf(zero\n); } 先定义两个变量,然后输入一个数,然后判断这个数的范围,输出对应的字符串。 2.输入一个数 x,输出 y。其中 y 是 x 的绝对值。 main() { float x,y; scanf(%f,&x); if(x&=0) y=x; else y=-x; printf(%f\n,y); } 程序比较简单,这儿就不分析了。 其实 Trubo C 2.0 把一些常用的功能都写好了,我们只需要使用就可。例如求绝对值的功能 在 C 的库里面就有。看下面的: #include math.h main() { float x,y; scanf(%f,&x); y=fabs(x); /*求 x 的绝对值,然后赋值给 y*/ printf(%f\n,y); }这个程序和上面的程序完成的功能是一模一样的,都是求绝对值。可以看出,用下面这个方 法比上面就要好一些。由于 fabs()是一个函数,系统自带的,所以在使用它的时候,我们必 须把它所在的库文件 math.h 包含都程序中,即程序最前面一行。类似的还有求开方 sqrt(), 求指数幂 exp()等等,这些与数学方面有关的函数都在 math.h 里面。具体哪些有哪些没有, 在什么库里面,可以查看一些手册。 3.输入 x,输出 y,x 和 y 满足关系: x&-5 y=x; -5&=x&1 y=2*x+5; 1&=x&4 y=x+6; x&=4 y=3*x-2; 程序如下: main() { float x,y; scanf(%f,&x); if(x&-5) y=x; else if(-5&=x&&x&1) y=2*x+5; else if(1&=x&&x&4) y=x+6; else y=3*x-2; printf(%f\n,y); }这里要说明两点: (1).-5&=x&&x&1 不能写成-5&=x&1;1&=x&&x&4 也不能写成 1&=x&4;在 C 语言中,不能认识 连续不等式。 (2).y=2*x+5 不能写成 y=2x+5;y=3*x-2 也不能写成 y=3x-2;这与我们平时所写的方法不一样。 4.输入三个数 x,y,z,然后按从大到小输出。 main() { float x,y,z; scanf(%f%f%f,&x,&y,&z); if(x&=y&&x&=z) { printf(%f\t,x); if(y&=z) printf(%f\t%f\n,y,z); else printf(%f\t%f\n,z,y); } else if(y&=x&&y&=z) { printf(%f\t,y); if(x&=z) printf(%f\t%f\n,x,z); else printf(%f\t%f\n,z,x); } else { printf(%f\t,z); if(x&=y) printf(%f\t%f\n,x,y); else printf(%f\t%f\n,y,x); } } 说明:这是一个典型的 if 语句嵌套结构,如果不使用括号,那么 if 和 else 的对应关系就乱 了。四、switch--case 语句 在编写程序时, 经常会碰到按不同情况分转的多路问题, 这时可用嵌套 if -else-if 语句来实现, 但 if-else-if 语句使用不方便, 并且容易出错。对这种情况, Turbo C2.0 提供了一个开关语句。 开关语句格式为: switch(变量) { case 常量 1: 语句 1 或空; case 常量 2: 语句 2 或空; . . . case 常量 n: 语句 n 或空; default: 语句 n+1 或空; } 执行 switch 开关语句时,将变量逐个与 case 后的常量进行比较,若与其中一个相等,则执行该 常量下的语句,若不与任何一个常量相等,则执行 default 后面的语句。 注意: 1.switch 中变量可以是数值,也可以是字符,但必须是整数。 2.可以省略一些 case 和 default。 3.每个 case 或 default 后的语句可以是语句体,但不需要使用{和}括起来。 例如: main() { int x,y; scanf(%d,&x); witch(x) { case 1: y=x+1; /*退出开关语句,遇到 break 才退出*/ case 4: y=2*x+1; default: y=x--; } printf(%d\n,y); } 从上面的例子可以看出,用开关语句编的程序一定可以用 if 语句做。那么在什么情况下需 要用 switch 语句呢?一般在出现比较整的情况下或者能转化成比较整数的情况下使用。看 下面的例子: 例子:一个学生的成绩分成五等,超过 90 分的为'A',80-89 的为'B',70-79 为'C',60-69 为 'D',60 分以下为'E'。现在输入一个学生的成绩,输出他的等级。 (1).用 if 语句 main() { scanf(%d,&num); if(num&=90) grade='A'; else if(num&=80&&num&89) grade='B'; else if(num&=70&&num&79) grade='C'; else if(num&=60&&num&69) grade='D'; else grade='E'; printf(%c,grade); } (2).用 switch 语句 main() {
scanf(%d,&num); num/=10; switch(num) { case 10: case 9: grade='A'; case 8: grade='B'; case 7: grade='C'; case 6: grade='D'; default: grade='E'; } printf(%c,grade); } 说明一点,并不是每个 case 里面有都语句,有时侯里面是空的,就好象这一题。switch 语 句执行的顺序是从第一 case 判断,如果正确就往下执行,直到 break;如果不正确,就执行 下一个 case。所以在这里,当成绩是 100 分时,执行 case 10:然后往下执行,grade='A'; 退出。 想想看,这里为什么要用 num/=10;? 假设当程序中有浮点数时怎么办呢? (七) 循环语句和循环控制 Turbo C 2.0 提供三种基本的循环语句: for 语句、while 语句和 do-while 语句。一、循环语句 (一)、for 循环 它的一般形式为: for(&初始化&;&条件表过式&;&增量&) 语句; 初始化总是一个赋值语句,它用来给循环控制变量赋初值;条件表达式是一个关系表达式, 它决定什么时候退出循环; 增量定义循环控制变量每循环一次后按什么方式变化。 这三个部 分之间用;分开。 例如: for(i=1;i&=10;i++) 语句; 上例中先给 i 赋初值 1,判断 i 是否小于等于 10,若是则执行语句,之后值增加 1。再重新 判断,直到条件为假,即 i&10 时,结束循环。 注意: (1).for 循环中语句可以为语句体,但要用{和}将参加循环的语句括起来。 (2).for 循环中的初始化、条件表达式和增量都是选择项,即可以缺省,但;不能缺省。省略 了初始化,表示不对循环控制变量赋初值。省略了条件表达式,则不做其它处理时便成为死 循环。省略了增量,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变 量的语句。 (3).for 循环可以有多层嵌套。 例如: for(;;) 语句; for(i=1;;i+=2) 语句; for(j=5;;) 语句; 这些 for 循环语句都是正确的。 main() { int i,j; printf(i j\n); for(i=0;i&2;i++) for(j=0;j&3;j++) printf(%d %d\n,i,j); } 输出结果为: ij 00 01 02 10 11 12 用 for 循环求 1+2+……+100 的和: main() { int sn=0,i; for(i=1;i&=100;i++) sn+=i; /*1+2+……+100*/ printf(%d\n,sn); } 从程序可以看出,使用循环语句可以大大简化代码。 (二)、while 循环 它的一般形式为: while(条件) 语句; while 循环表示当条件为真时,便执行语句。直到条件为假才结束循环。并继续执行循环程 序外的后续语句。 例如: #include stdio.h main() { c='\0'; /*初始化 c*/ while(c!='\n') /*回车结束循环*/ c=getche(); /*带回显的从键盘接收字符*/ } 上例中,while 循环是以检查 c 是否为回车符开始,因其事先被初始化为空,所以条件为真, 进入循环等待键盘输入字符;一旦输入回车,则 c='\n',条件为假,循环便告结束。与 for 循环一样,while 循环总是在循环的头部检验条件,这就意味着循环可能什么也不执行就退 出。 注意: (1).在 while 循环体内也允许空语句。 例如: while((c=getche())!='\n'); 这个循环直到键入回车为止。 (2).可以有多层循环嵌套。 (3).语句可以是语句体, 此时必须用{和}括起来。 用 while 循环求 1+2+……+100 的和: main() { int sn=0,i=0; while(++i&=100) sn+=i; /*求 1+2+……+100*/ printf(%d\n,sn); } (三)、do--while 循环 它的一般格式为: do { 语句块; } while(条件); 这个循环与 while 循环的不同在于:它先执行循环中的语句,然后再判断条件是否为真,如果 为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次循环语句。 同样当有许多语句参加循环时,要用{和}把它们括起来。 用 do--while 循环求 1+2+……+100 的和: main() { int sn=0,i=1; do sn+=i; /*求 1+2+……+100*/ while(++i&=100); printf(%d\n,sn); } 从上面三个程序看出,使用 for,while 和 do--while 求解同样的问题,基本思路都差不多, 只是在第一次计算时,注意初值。二、循环控制 (一)、break 语句 break 语句通常用在循环语句和开关语句中。当 break 用于开关语句 switch 中时,可使程序 跳出 switch 而执行 switch 以后的语句; 如果没有 break 语句, 则将成为一个死循环而无法退 出。break 在 switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。 当 break 语句用于 do-while、for、while 循环语句中时,可使程序终止循环而执行循环后面 的语句,通常 break 语句总是与 if 语句联在一起。即满足条件时便跳出循环。 例如: main() { int sn=0,i; for(i=1;i&=100;i++) { if(i==51) /*如果 i 等于 51,则跳出循环*/ sn+=i; /*1+2+……+50*/ } printf(%d\n,sn); } 可以看出,最终的结果是 1+2+……+50。因为在 i 等于 51 的时候,就跳出循环了。自己写 写怎样在 while 和 do--while 循环中增加 break 语句。 注意: 1. break 语句对 if-else 的条件语句不起作用。 2. 在多层循环中,一个 break 语句只向外跳一层。 例如: main() { int i,j; printf(i j\n); for(i=0;i&2;i++) for(j=0;j&3;j++) { if(j==2) printf(%d %d\n,i,j); } } 输出结果为: ij 00 01 10 11 当 i==0,j==2 时,执行 break 语句,跳出到外层的循环,i 变为 1。 (二)、continue 语句 continue 语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。 continue 语句只用在 for、while、do-while 等循环体中, 常与 if 条件语句一起使用,用来加速 循环。 例如: main() { int sn=0,i; for(i=1;i&=100;i++) { if(i==51) /*如果 i 等于 51,则结束本次循环*/ sn+=i; /*1+2+……+50+52+……+100*/ } printf(%d\n,sn); } 从程序中可以看出,continue 语句只是当前的值没有执行,也就是说当前的值跳过去了,接 着执行下次循环。 main() { int i,j; printf(i j\n); for(i=0;i&2;i++) for(j=0;j&3;j++) { if(j==1) printf(%d %d\n,i,j); } } 输出结果为: ij 00 02 10 12 (三)、goto 语句 goto 语句是一种无条件转移语句,与 BASIC 中的 goto 语句相似。goto 语句的使用格式为: goto 标号; 其中标号是 Turbo C 2.0 中一个有效的标识符, 这个标识符加上一个:一起出现在函数内某处, 执行 goto 语句后,程序将跳转到该标号处并执行其后的语句。标号既然是一个标识符,也 就要满足标识符的命名规则。另外标号必须与 goto 语句同处于一个函数中,但可以不在一 个循环层中。通常 goto 语句与 if 条件语句连用,当满足某一条件时,程序跳到标号处运行。 goto 语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用 goto 语句则比较合理。 main() { int sn=0,i; for(i=1;i&=100;i++) { if(i==51) /*如果 i 等于 51,则跳出循环*/ sn+=i; /*1+2+……+50*/ } loop: ; printf(%d\n,sn); } 可以看出,这儿的 goto 语句和 break 作用很类似。 这儿的 loop: ; printf(%d\n,sn); 也可以写成 loop: printf(%d\n,sn); main() { int sn=0,i; for(i=1;i&=100;i++) { if(i==51) /*如果 i 等于 51,则跳出本次循环*/ sn+=i; /*1+2+……+50+52+……+100*/ loop: ; } printf(%d\n,sn); } 可以看出这儿的 loop 语句和 continue 的作用类似。 但是某些情况下又必须使用 goto 语句,否则会让程序大大臃肿。如: main() { int i,j,k; printf(i j k\n); for(i=0;i&2;i++) for(j=0;j&3;j++) for(k=0;k&3;k++) { if(k==2) printf(%d %d %d\n,i,j,k); } loop: ; } 输出结果为: ijk 000 001 如果不使用 goto 语句,而使用 break,continue 语句,应该这样 main() { int i,j,k; printf(i j\n); for(i=0;i&2;i++) { for(j=0;j&3;j++) { for(k=0;k&3;k++) { if(k==2) printf(%d %d %d\n,i,j,k); } if(k==2) } if(k==2) } } 输出结果为: ijk 000 001 所以在同时跳出多层循环时,应该使用 goto 语句。记住,所有的 goto 语句其实都是可以用 break,continue 代替的。下面举几个例子: 1.求两个整数的最大公约数。例如 10 和 15 的最大公约数是 5。 分析:最大公约数一定小于等于最小的那个数一半,同时能被两数整除。 main() { int num1,num2,i, scanf(%d%d,&num1,&num2); min=num1 for(i=min/2;i&0;i--) if(num1%i==0&&num2%i==0) printf(最大公约数为%d\n,i); } 2.求 1!+2!+……+n!(n&10) main() { int n,i; long temp=1,sn=0; /*从 9!以后,所得的值就超过了 int 范围*/ scanf(%d,&n); for(i=1;i&=n;i++) { temp*=i; sn+= /*如果没有这一步,求的就是 n!*/ } printf(%ld\n,sn); } 那么想想,如果求 1!+3!+5!+……+n!应该怎么办? 3.判断一个整数是不是素数(素数就是只能被本身和 1 整除的数)。 #include math.h main() { int num,i,flag=0; scanf(%d,&num); for(i=2;i { flag=0; /*标志变量复位*/ if(num%i==0) { flag=1; } } if(flag==0) printf(是素数\n); else printf(不是素数\n); } 可以说,在所有的 C 语言书上,都有判断素数的例题。它的编程思想是:把一个变量作为 标志变量,用来标志是不是素数;循环体是从 2 到 sqrt(num),因为如果一个数不是素数的 话,一定能分解成 num=num1*num2,它们中的最小值一定小于 sqrt(num),所以循环的时候 只要到 sqrt(num)就可以了。同时要注意变量复位的问题。 (八) 数组 数组,顾名思义就是一组同类型的数。一、数组的声明 声明数组的语法为在数组名后加上用方括号括起来的维数说明。 本接仅介绍一维数组。 下面 是一个整型数组的例子: int array[10]; 这条语句定义了一个具有 10 个整型元素的名为 array 的数组。这些整数在内存中是连续存 储的。 数组的大小等于每个元素的大小乘上数组元素的个数。 方括号中的维数表达式可以包 含运算符,但其计算结果必须是一个长整型值。这个数组是一维的。 下面这些声明是合法的: int offset[5+3]; float count[5*2+3]; 下面是不合法的: int n=10; int offset[n]; /*在声明时,变量不能作为数组的维数*/二、用下标访问数组元素 int offset[10]; 表明该数组是一维数组,里面有 10 个数,它们分别为 offset[0],offset[1],……offset[9];千万 注意,数组的第一个元素下标从 0 开始。一些刚学编程的人员经常在这儿犯一些错误。 offset[3]=25; 上面的例子是把 25 赋值给整型数组 offset 的第四个元素。 在赋值的时候,可以使用变量作为数组下标。 main() { int i,offset[10]; for(i=0;i&10;i++) scanf(%d,&offset[i]); for(i=9;i&=0;i--) printf(%d ,offset[i]); printf(\n); } 题目的意思是先输入 10 个整数,存入到数组中,然后反序输出。三、数组的初始化 前面说了,变量可以在定义的时候初始化,数组也可以。 int array[5]={1,2,3,4,5}; 在定义数组时, 可以用放在一对大括号中的初始化表对其进行初始化。 初始化值的个数可以 和数组元素个数一样多。 如果初始化的个数多于元素个数,将产生编译错误;如果少于元素个数,其余的元素被初始 化为 0。 如果维数表达式为空时, 那么将用初始化值的个数来隐式地指定数组元素的个数, 如下所式: int array[]={1,2,3,4,5}; 这也表明数组 array 元素个数为 5。 main() { int i,array[]={1,3,5,7,9,11}; for(i=0;i&5;i++) printf(%d ,array[i]); printf(\n); } 最终结果为 1 3 5 7 9 四、字符数组 整数和浮点数数组很好理解,在一维数组中,还有一类字符型数组。 char array[5]={'H','E','L','L','O'}; 对于单个字符,必须要用单引号括起来。又由于字符和整型是等价的,所以上面的字符型数 组也可以这样表示: char array[5]={72,69,76,76,79}; /*用对应的 ASCII 码*/ 举一个例子: main() { char array[5]={'H','E','L','L','O'}; for(i=0;i&5;i++) printf(%d ,array[i]); printf(\n); } 最终的输出结果为 72 69 76 76 79 但是字符型数组和整型数组也有不同的地方,看下面的: char array[]=HELLO; 如果我们能看到内部的话,实际上编译器是这样处理的: char array[]={'H','E','L','L','O','\0'}; 看上面最后一个字符'\0',它是一个字符常量,Turbo C 编译器总是给字符型数组的最后自动 加上一个\0,这是字符的结束标志。所以虽然 HELLO 只有 5 个字符,但存入到数组的个数 却是 6 个。但是,数组的长度仍然是 5。 i=strlen(array); /*求字符串的长度,在 string.h 里面*/ 可以看出 i 仍然是 5,表明最后的'\0'没有算。 #include string.h main() { int i,j; char array[]=094387 j=strlen(array); for(i=0;i printf(\n); } 其实我们可以根据判断'\0'来输出字符串,看下面的: main() { char array[]=094387 for(i=0;array[i]!='\0';i++) printf(%c,array[i]); printf(\n); }举几个例子: 1.输入 10 个整数存入数组中,然后把它们从小到大排列并放在同一数组中。(思路:先找出 最小的,放在第一个位置,为了防止把原先的数覆盖掉,可以把原先的第一个数和最小数的 位置互换)。 main() { int array[10]; int i,j,min, for(i=0;i&10;i++) scanf(%d,&array[i]); for(i=0;i&9;i++) { min=array[i]; for(j=i+1;j&10;j++) if(min&array[j]) /*里面的 4 行语句很重要*/ { min=array[j]; stmp=array[i]; array[i]=array[j]; array[j]= } } for(i=0;i&10;i++) printf(%d ,array[i]); printf(\n); }分析:先让第一个值作为基准,如果后面有比它小的,那么就把这两个数互换一下,同时把 基准换成小的值。两个数互换应该这样(stmp=a;a=b;b=),而不是(a=b;b=a;),想想这是 为什么?必须要用一个变量作为桥梁。 这种一个一个的把最小的放在前面的排序方法, 我们 形象的叫做冒泡法。 2.输入一行字符存入数组,然后把他们反序存入到同一数组中。 #include stdio.h main() { char c,stmp,array[80]; int i=0,j; while((c=getchar())!='\n') /*注意这儿的用法*/ array[i++]=c; array[i]='\0'; /*为什么要加'\0'?是否可以不加?*/ for(j=i-1;j&=i/2;j--) { stmp=array[j]; array[j]=array[i-1-j]; array[i-1-j]= } for(i=0;array[i]!='\0';i++) printf(%c,array[i]); printf(\n); } 3.一个已经排好序的数组,输入一个数,利用二分法把这个数从原数组中删除,数组顺序保 持不变。 如原数组为 1,3,5,7,9,11,13,15,17,19, 待删除的数为 13, 则输出为 1,3,5,7,9,11,15,17,19。 二分法:每次都是判断中间的数是否满足要求,若满足则删除,若不满足,则把该数当作边 界, 然后再找中点。 例如这一题, 第一次的是 10 个数的中点, 11, 为 发现 11&13, 则找 11-19 的中点 15,发现 15&13,再找 11-15 的中点 13,正好,则删除。 main() { int array[10]={1,2,3,5,8,15,20,30,100,200}; int first=0,end=9,middle=(first+end)/2,num,i; scanf(%d,&num); while(array[middle]!=num) /*注意这里面的三行代码*/ { if(array[middle]&num) end= else first= middle=(first+end)/2; } for(i=0;i&9;i++) { if(i&=middle) array[i]=array[i+1]; printf(%d ,array[i]); } printf(\n); } 程序没有考虑当输入的数在原先数组中没有时怎么处理。 如果要考虑这个问题, 程序该怎么 改动呢? (九) 多维数组 一、高维数组有时, 数组的维数并不止一维, 例如一个记录消费中心在第一季度里各个月的收入数据就可 以用二维数组来表示。 定义二维数组的方法是在一维数组定义的后面再加上一个用方括号括 起来的维数说明。例如: float array[3][8]; 实际上,这个数组可以看成 3 个连续的一维数组,每个一维数组具有 8 个元素。该数组在内 存中的存储格式为最左边的维数相同的元素连续存储,也即按行存储的。首先存储第一行 8 个元素,其次是第二行,最后是第三行。 main() { int array[3][3]={1,2,3,4,5,6,7,8,9}; int i,j; for(i=0;i&3;i++) { for(j=0;j&3;j++) printf(%3d); printf(\n); } } 它的输出结果为: 123 456 789 可以看出,二维数组元素是按行存储的。我们也可以对数组进行赋值,而不是初始化。 main() { int array[3][3]; int i,j; for(j=0;j&3;j++) for(i=0;i&3;i++) scanf(%d,&array[i][j]); for(i=0;i&3;i++) { for(j=0;j&3;j++) printf(%3d); printf(\n); } } 当输入 1 2 3 4 5 6 7 8 9&回车& 输出为: 147 258 369 数组可以是二维、三维甚至是更高维数的,虽然 C 语言对维数的处理没有上限,但是处理 高维数组是很头疼的事。 一般尽量避免处理四维和四维以上的数组。 下面看一个三维数组的 例子: main() { int array[2][3][4]; int i,j,k; for(i=0;i&2;i++) for(j=0;j&3;j++) for(k=0;k&4;k++) array[i][j][k]=i*12+j*4+k; } 这个三维数组可以看成 2 个二维数组, 每个二维数组又可以看成 3 个一维数组。 可以在头脑 里想象成两个平行平面,每个平面内有 3*4 个点。所以共有 24 个元素。 二、字符串数组 上面讲的都是存放数值的,有一类数组,用来处理字符串的,我们叫字符串数组。其实字符 串数组也是二维数组,只是它的特殊性,才单独拿出来说的。 m

我要回帖

 

随机推荐