现代C:概念剖析和编程实践
上QQ阅读APP看书,第一时间看更新

2.1 语法

从其整体结构来看,C程序是由不同类型的文本元素组成的,这些文本元素按照某种语法组合在一起。这些元素是:

  • 特殊词语:在清单1.1中,我们使用了以下特殊的词语[1]#includeintvoiddoubleforreturn。在本书的程序文本中,它们通常会以粗体字表示。这些特殊的词语代表了C语言所强加的、不可改变的概念和特性。
  • 标点符号C:C使用几种标点符号来构造程序文本。
  • 有5种括号:{ ... }( ... )[ ... ]/* ... */< ... >。括号将程序的某些部分组合在一起,并且总是成对出现。幸运的是,< ... >括号在C中很少见,就像在我们的示例中一样,仅在同一逻辑行文本中使用。其他4种不限于在一行中,它们的内容可能跨越多行,就像我们在前面使用printf时所做的那样。
  • 有两个不同的分隔符或终止符:逗号和分号。当我们使用printf时,我们看到逗号将函数的4个参数分隔开。在第12行,我们看到逗号也可以跟在元素列表的最后一个元素的后面。
023-01

对于初学C语言的人来说,困难之一是使用相同的标点符号来表达不同的概念。例如,在清单1.1中,{}[]对分别用于3个不同的目的[练习1]

要点2.1 标点符号可以有几种不同的含义。

  • 注释C:我们前面看到的结构/* ... */告诉编译器,其中的所有内容都是注释。例如,参见第5行:
023-02

编译器会忽略注释。它是解释和记录代码的最佳场所。这样的文档可以(也应该)极大地提高代码的可读性和可理解性。另一种形式的注释是所谓的C++风格的注释,如第15行所示。它们用//标记。C++风格的注释从//扩展到行尾。

  • 字面量C:我们的程序包含几个引用固定值的项,这些固定值是程序的一部分:013459.02.93.E+25.00007"element %zu is %g, \tits square is %g\n"。这些被称为字面量C
  • 标识符C:这些是我们(或C标准)给程序中的某些实体的“名称”。这里有Aimainprintfsize_tEXIT_SUCCESS

标识符可以在程序中扮演不同的角色,但它们也可能指向其他一些东西。

  • 数据对象C(如Ai)。这些也被称为变量C
  • 类型C别名,如size_t,指定了一个新对象的“类别”,这里是i。观察名称末尾的_t。C标准使用这种命名约定来提醒你,标识符指向一个类型。
  • 函数,例如mainprintf
  • 常量,例如EXIT_SUCCESS
  • 函数C:有两个标识符指向函数,分别是mainprintf。正如我们已经看到的,程序使用printf来生成一些输出。然后定义Cmain函数,也就是说,声明Cint main(void)后面跟着一个包含在{ ... }中的C,它用来描述这个函数应该做什么。在我们的例子中,这个函数定义C的范围是第6行到第24行。main在C程序中有一个特殊的角色,正如我们将看到的,它必须始终存在,因为它是程序执行的起点。
  • 运算符C:在众多C运算符中,我们的程序只使用了几个。
  • =用于初始化C赋值C
  • <用于比较。
  • ++使变量递增(使其值增加1)。
  • *使两个值相乘。

就像在自然语言中一样,我们在这里看到的C程序的词法元素和语法必须与这些结构所表达的实际含义区分开来。然而,与自然语言不同的是,这种意义是严格规定的,通常没有产生歧义的余地。在下面的小节中,我们将深入探讨C所区分的三个主要语义类别:声明、定义和语句。


[1]在C jargon中,这些是指令C关键字C保留C标识符。

[练习1]找出这两种括号的3种不同用法。