|
常州网站建设【常州互联网公司】常州网站建设、常州微信公众号开发、常州网站设计、常州小程序制作
常州,简称“常”,又称龙城,是江苏省地级市。是国务院批准的中国长江三角洲地区中心城市之一、先进制造业基地和文化旅游名城[1]。截至2018年,全市辖5个区、1个县级市,总面积4385平方公里,常住人口472.9万人,城镇人口342.8万人,城镇化率为72.5% [2-3]。流动人口达到170万。 [4]
常州位于江苏省南部、长三角腹地,东与无锡接壤,西与南京、镇江接壤,南与无锡、安徽宣城接壤[5]。常州市地处长江平原下游,既有高沙平原,又有丘陵湖泊。属北亚热带季风气候。 [6] 有围墩新石器遗址、春秋砚城、天宁寺、红梅阁、文笔塔、腾华老殿、泗州阁、太平天国护国府、瞿秋白纪念馆、中华恐龙园、天目湖、金坛茅山等景点、嬉戏谷、东方盐湖城、华夏宝胜园等景点[7]。
常州是一座有着3200多年历史的文化古城。春秋末年(公元前547年),武王守孟四子季札赐鄢陵,开始了2500多年的历史,年代准确,地名准确。西汉高祖五年(公元前202年)改称毗陵。西晋武帝太康二年(281年),改置毗陵县。从此,常州历代为郡、州、道、衙署。曾有鄢陵、毗陵、陂滩、金陵、长春、常州、武进等地名。隋文帝建国九年(589年)始称常州[7]。
2020年,常州市实现地区生产总值(GDP)7805.3亿元,按可比价格计算增长4.5%,位居全省第三位。
ANSI C制定后,函数定义如下。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号 prettyprint prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Courier, "Courier New", monospace; font-size: 0.9em; padding: 10px 10px 10px 30px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; border: 0px; border-radius: 4px; position: relative;">void func(int a, double b){
…}复制代码</pre></p>
在ANSI C之前的C语言中,是这样的:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号 prettyprint prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Courier, "Courier New", monospace; font-size: 0.9em; padding: 10px 10px 10px 30px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; border: 0px; border-radius: 4px; position: relative;">void func(a, b)int a;double b;{
…}复制代码</pre></p>
说到这里,关于C语言中大括号{}的位置,有人将其写在if等语句的右侧,如下(这是K&R中的写法,所以这里称为“K&R风格”) 。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号 prettyprint prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Courier, "Courier New", monospace; font-size: 0.9em; padding: 10px 10px 10px 30px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; border: 0px; border-radius: 4px; position: relative;">if (a == 0) {复制代码</pre></p>
但是在定义函数时,他们在代码行的开头写了{,这很混乱6。其实这是ANSI C之前的C语言写法的遗留(也是因为有些工具使用代码行开头的大括号作为判断函数开始的依据)。
6毕竟Java等语言的方法定义也是把{写在右边。
另外,旧的C语言没有函数的原型声明。如果在 ANSI C 中编写以下原型声明,则在调用该函数时,如果参数的数量或类型不正确,编译器将报告错误。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号 prettyprint prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Courier, "Courier New", monospace; font-size: 0.9em; padding: 10px 10px 10px 30px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; border: 0px; border-radius: 4px; position: relative;">void func(int a, double b);复制代码</pre></p>
然而,由于旧的 C 语言中没有此功能,因此正确指定参数的责任就落在了程序员身上。现在看来这是一条非常危险的规则,但归根结底,当时的C语言只是汇编程序的替代品,所以没有人认为它不合适。
但对于有返回值的函数,如果返回值的类型不明确,编译器就无法生成接收返回值部分的机器码。因此,例如对于三角函数sin(),只需声明返回值类型7,如下所示。
7如果没有声明,函数整体将被视为返回int的函数。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号 prettyprint prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Courier, "Courier New", monospace; font-size: 0.9em; padding: 10px 10px 10px 30px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; border: 0px; border-radius: 4px; position: relative;">double sin(); ⬅️请注意,括号中是空的复制代码</pre></p>
现代C语言中,声明不带参数的函数原型时,必须在括号内写上void,如下所示。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="代码无行号 prettyprint prettyprinted" style="box-sizing: border-box; overflow: auto; font-family: Courier, "Courier New", monospace; font-size: 0.9em; padding: 10px 10px 10px 30px; margin-top: 0px; margin-bottom: 1.1em; line-height: 1.42857; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; border: 0px; border-radius: 4px; position: relative;">void func(void);复制代码</pre></p>
这是为了兼容旧式C语言中的函数声明(以便区分是否是由于使用了老式的声明而不进行参数检查,或者是否明确声明了该函数不接收参数)8.
8C++ 放弃了与旧 C 的兼容性,因此不需要这个 void。
1-1-5ANSI C (C89/90)
前面说过,K&R第一版并没有记录发布后实现的功能,介绍也不一定严格,所以程序的动作会根据运行环境的不同而有所不同。
鉴于这些情况,经过一番争论,终于在1989年,美国国家标准协会(ANSI)通过了C语言的标准规范。
顾名思义,美国国家标准协会是美国的标准。 ANSI C 后来被国际标准化组织 (ISO) 采用,成为标准 ISO/IEC 9899:19909。由于ANSI C于1989年发布,ISO标准于1990年发布,所以这个版本的C有时被称为C89,有时被称为C90。看起来有点混乱,但内容其实是一样的。
9相应的中国国家标准为GB/T 15272-1994。 ——译者注
由于C89和C90的名称很容易与后面介绍的C95和C99混淆,因此本书将这个版本的C称为ANSI C10。
10事实上,C95、C99和C11都是ANSI认可的标准,但通常当提到ANSI C时,会提到C89和C90,所以本书也会效仿。
随后,ISO/IEC 9899:1990被日本JIS标准采用,成为JIS X3010:1993。
1-1-6C95
ISO/IEC 9899:1990 在 1995 年添加了处理宽字符的库,成为 ISO/IEC 9899/AMD1:1995。所谓AMD1指的是“标准修改”的意思。
此版本添加了一组可以处理宽字符并实现宽字符和多字节字符之间转换的函数。
在C语言中,字符串基本上就是一个char数组,char类型的长度为1个字节(通常为8位)。对于美国人来说,这已经可以满足使用需求,但是由于我们使用汉字等多种字符,无法用1个字符对应1个字节来表示。
我们大多使用GBK或UTF-8等字符编码,并使用多个字节来构造中文字符串。例如,如果字符串“”用2个字节表示,则这种表示方法是多字节字符串。但在使用这种方法的情况下,每个字符的长度是可变的,因此以字符为单位分割字符串时会很麻烦。例如,如果我们要制作一个像文本编辑器一样的程序,当我们来回移动光标时,我们无法立即判断代表字符位置的变量是需要移动1个字节还是前进2个字节。
常州网站建设【常州互联网公司】常州网站建设、常州微信公众号开发、常州网站设计、常州小程序制作 |
|