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

第4章 表达式计算

本章涵盖了:

  • 执行算术运算
  • 修改对象
  • 使用布尔值
  • 使用三元运算符的条件编译
  • 求值顺序

我们已经使用了一些简单的表达式C示例。这些是根据其他值来计算值的代码片段。最简单的表达式是算术表达式,它与我们在学校学到的类似。但是,还有其他一些运算,特别是比较运算,如我们之前看到的==!=运算。

在本章中,我们将要进行计算的值和对象主要是我们已经见过的类型size_t。这些值对应于“大小”,因此它们是不能为负的数字。它们的取值范围从0开始。我们想要表示的是所有的非负整数,通常表示为NN0或数学中的“自然数”。不幸的是,计算机是有限的,所以我们不能直接表示所有的自然数,但可以做一个合理的近似。有一个很大的上限SIZE_MAX,它是我们可以在size_t中表示的上限。

要点4.1 类型size_t表示范围[0,SIZE_MAX]内的值。

SIZE_MAX的值非常大。根据平台的不同,它是下列其中之一

216 - 1 = 65535

232 - 1 = 4294967295

264 - 1 = 18446744073709551615

第一个值是最低要求。现在,这么小的值只会出现在一些嵌入式平台上。另外两个值现在更常用:第二个值仍然可以在一些PC和笔记本电脑上找到,大多数较新的平台都有第三个值。这种值的选择对于不太复杂的计算来说已经足够大了。标准头文件stdint.h提供了SIZE_MAX,这样你就不必自己找出那个值,相应地也就不必让你的程序那么专业。

我们在size_t中提到的“不能为负的数字”的概念对应于C所称的无符号整数类型C。像+!=这样的符号和组合称为运算符C,它们所应用的对象称为操作数C。因此,在a + b中,+是运算符,ab是操作数。

有关所有C运算符的概述,请参见下表:表4.1列出了对值进行操作的运算符,表4.2列出了对操作对象进行操作的运算符,表4.3列出了对操作类型进行操作的运算符。要使用它们,你可能需要从一个表跳到另一个表。例如,如果你想计算a + 5这样的表达式,其中a是类型为unsigned的变量,那么你首先到表4.2中的第三行查看,发现a是要求值的。然后,你可以使用表4.1中的第三行来推断出a5的值是用一个算术运算组合起来的:a +。如果你不理解这些表格中的所有内容,不必感到沮丧。很多提到的概念还没有介绍,在这里把它们列出来是为了作为整本书的一个参考。

表4.1 值运算符

046-01

表4.1的形式列给出了操作的语法形式,其中@表示运算符,ab表示用作操作数的值。对于算术和位操作,结果类型是一种可以协调ab类型的类型。对于一些运算符,别名列给出了预算符的另一种形式,或者列出了具有特殊意义的运算符的组合。大多数运算符和术语将在稍后讨论。

表4.2的形式列给出了操作的语法形式,其中@表示运算符,o表示对象,a表示作为操作数的适当附加(如果有的话)。类型列中额外的*要求对象o是可寻址的。

表4.2 对象运算符

047-01

表4.3的这些运算符返回一个类型为size_t的整数常量(ICE)。它们具有类似函数的语法,操作数在括号中。

表4.3 类型运算符

047-02