
第4章 表达式计算
本章涵盖了:
- 执行算术运算
- 修改对象
- 使用布尔值
- 使用三元运算符的条件编译
- 求值顺序
我们已经使用了一些简单的表达式C示例。这些是根据其他值来计算值的代码片段。最简单的表达式是算术表达式,它与我们在学校学到的类似。但是,还有其他一些运算,特别是比较运算,如我们之前看到的==
和!=
运算。
在本章中,我们将要进行计算的值和对象主要是我们已经见过的类型size_t
。这些值对应于“大小”,因此它们是不能为负的数字。它们的取值范围从0
开始。我们想要表示的是所有的非负整数,通常表示为N
、N0
或数学中的“自然数”。不幸的是,计算机是有限的,所以我们不能直接表示所有的自然数,但可以做一个合理的近似。有一个很大的上限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
中,+
是运算符,a
和b
是操作数。
有关所有C运算符的概述,请参见下表:表4.1列出了对值进行操作的运算符,表4.2列出了对操作对象进行操作的运算符,表4.3列出了对操作类型进行操作的运算符。要使用它们,你可能需要从一个表跳到另一个表。例如,如果你想计算a + 5
这样的表达式,其中a
是类型为unsigned
的变量,那么你首先到表4.2中的第三行查看,发现a
是要求值的。然后,你可以使用表4.1中的第三行来推断出a
和5
的值是用一个算术运算组合起来的:a +
。如果你不理解这些表格中的所有内容,不必感到沮丧。很多提到的概念还没有介绍,在这里把它们列出来是为了作为整本书的一个参考。
表4.1 值运算符

表4.1的形式列给出了操作的语法形式,其中@
表示运算符,a
和b
表示用作操作数的值。对于算术和位操作,结果类型是一种可以协调a
和b
类型的类型。对于一些运算符,别名列给出了预算符的另一种形式,或者列出了具有特殊意义的运算符的组合。大多数运算符和术语将在稍后讨论。
表4.2的形式列给出了操作的语法形式,其中@
表示运算符,o
表示对象,a
表示作为操作数的适当附加值(如果有的话)。类型列中额外的*
要求对象o
是可寻址的。
表4.2 对象运算符

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