《C语言程序设计现代方法(第2版)》读书笔记 第二章(二)

简介: 《C语言程序设计现代方法(第2版)》读书笔记 第二章(二)

2.8 C 程序的书写规范

我们可以把C程序看成是一连串记号token),即许多在不改变意思的基础上无法再分割的

字符组。标识符和关键字都是记号。像 + 和 - 这样的运算符、逗号和分号这样的标点符号以及字 符串字面量,也都是记号。例如,语句

printf( "Height: %d \ n", height);

是由 7 个记号组成的:

image.png


问与答

问:GCC是什么的简称?p.8(选看)

答: GCC 最初是 GNU C compiler 的简称。现在指 GNU Compiler Collection ,这是因为最新版本的 GCC 能够编译用Ada 、 C 、 C++ 、 Fortran 、 Java 和 Objective-C 等多种语言编写的程序。


问:明白了,但GNU又是什么意思呢?(选看)


答: GNU 指的是“ GNU’s Not UNIX! ”(发音为 guh-NEW ),它是自由软件基金会( Free Software Foundation )的一个项目。自由软件基金会是由Richard M. Stallman 发起的一个组织,旨在抗议对 UNIX 软件授权的各种限制。从它的网站可以看出,自由软件基金会认为用户应该可以自由地“运行、复制、发布、研究、改变和改进”软件。GNU 项目从头开始重写了许多传统的 UNIX 软件,并使公众能够免费地获 得。

GCC 和其他 GNU 软件对于 Linux 操作系统来说是至关重要的。 Linux 本身只是操作系统的“内核”(处理程序调度和基本输入/ 输出服务的部分),为了获得具体完整功能的操作系统, GNU 软件是必要的。网站www.gnu.org 提供了更多有关 GNU 项目的信息。


问:GCC有什么过人之处呢?(选看)


答:我们说 GCC 重要,不仅仅是因为它能免费获取、能编译很多语言。 GCC 还可以在许多操作系统下运行,并为多种不同的CPU 生成代码(支持所有广为使用的操作系统和 CPU )。 GCC 是许多基于 UNIX的操作系统(包括Linux 、 BSD 和 Mac OS X )的主要编译器,并广泛用于商业软件开发。有关 GCC的更多信息请参考gcc.gnu.org 。



问:GCC发现程序中错误的能力如何?(选看)

答:GCC有多个命令行选项来控制程序检查的彻底程度。使用这些选项可以帮助我们有效地找出程序中潜在的故障区域。下面是一些比较常用的选项。


image.png


问:在某些C语言书中,main函数的结尾使用的是exit(0)而不是return 0,二者是否一样呢?p.10

答:当出现在main函数中时,这两种语句是完全等价的:二者都终止程序执行,并且向操作系统返回0值。使用哪种语句完全依据个人喜好而定。


问:如果main函数末尾没有return语句会产生什么后果?(p.10)


答: return 语句不是必需的;如果没有 return 语句,程序一样会终止。在 C89 中,返回给操作系统的值是未定义的。在C99 中,如果 main 函数声明中的返回类型是 int (如我们的例子所示),程序会向操作系统返回0 ;否则程序会返回一个不确定的值。



问:编译器是完全移除注释还是用空格替换掉注释呢?


答:一些早期的编译器会删除每条注释中的所有字符,使得语句

a/**/b = 0;

可能被编译器理解成

ab

= 0 ;

然而,依据 C 标准,编译器必须用一个空格字符替换每条注释语句,因此上面提到的技巧并不可行。

我们实际上会得到下面的语句:

a b = 0;


问:在一个注释中嵌套另一个注释是否合法?


答:传统风格的注释( /*...*/ )不允许嵌套。例如,下面的代码就是不合法的:

/*

/*** WRONG ***/

*/

第2行的符号*/会和第一行的/*相匹配,所以编译器将会把第3行的*/标记为一个错误。

C 语言禁止注释嵌套有些时候也是个问题。假设我们编写了一个很长的程序,其中包含了许多短小的注释。为了临时屏蔽程序的某些部分(比如在测试过程中),我们首先会想到用/* 和 */ “注释掉”相应的程序行。但是,如果这些代码行中包含有传统风格的注释,这种方法就行不通了。不过,C99 注释(以//开始的注释)可以嵌套在传统风格的注释中,这是这类注释的另一个优势。



问:float类型的名字由何而来?(p.12)


答: float 是 floating-point 的缩写形式,它是一种存储数的方法,而这些数中的小数点是“浮动的”。 float类型的值通常分成两部分存储:小数部分(或者称为尾数部分)和指数 部分。例如, 12.0 这个数可以以1.5 × 2 3 的形式存储,其中 1.5 是小数部分,而 3 是指数部分。有些编程语言把这种类型称为 real类型而不是float类型。


*问:对标识符的长度真的没有限制吗?(p.19)


答:是,又不是。 C89 标准声称标识符可以任意长,但却只要求编译器记住前 31 个字符(

C99中是 63个字符)。因此,如果两个名字的前31 个字符都相同,编译器可能会无法区别它们。更复杂的情况是,C 标准对于具有外部链接( 18.2 节)的标识符有特殊的规定,而大多数函数名都属于这类标识符。因为链接器必须能识别这些名字,而一些早期的链接器又只能处理短名字,所以在C89 中只有前 6 个字符才是有效的。此外,还不区分字母的大小写。因此 ABCDEFG 和 abcdefg可能会被作为相同的名字处理。(C99中,前 31 个字符有效,且字母区分大小写。)大多数编译器和链接器都比标准所要求的宽松,所以实际使用中这些规则都不是问题。不要担心标识符太长,还是注意不要把它们定义得太短吧。



最后的最后,创作不易,希望读者三连支持💖

赠人玫瑰,手有余香💖

相关文章
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
【一步一步了解Java系列】:Java中的方法对标C语言中的函数
22 3
|
2月前
|
C语言
C语言程序设计核心详解 第四章&&第五章 选择结构程序设计&&循环结构程序设计
本章节介绍了C语言中的选择结构,包括关系表达式、逻辑表达式及其运算符的优先级,并通过示例详细解释了 `if` 语句的不同形式和 `switch` 语句的使用方法。此外,还概述了循环结构,包括 `while`、`do-while` 和 `for` 循环,并解释了 `break` 和 `continue` 控制语句的功能。最后,提供了两道例题以加深理解。
|
2月前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
2月前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
2月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
2月前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
存储 关系型数据库 编译器
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
C++ Primer Plus 第6版 读书笔记(9)第 9章 函数——内存模型和名称空间
114 1