Sun Studio 12:C 用户指南

6.10.2 K&R C 重新整理许可证

由于加法在算术上可交换并且关联,因此 K&R C 重新整理许可证适用于以上表达式。为了区别常规圆括号和表达式的实际分组,左、右花括号指定分组。表达式的三种可能的分组为:


i = { {*++p + f()} + g() };
i = { *++p + {f() + g()} };
i = { {*++p + g()} + f() };

给定 K&R C 规则,所有这些分组均有效。此外,即使表达式是按以下任意方式编写的,所有这些分组仍有效:


i = *++p + (f() + g());
i = (g() + *++p) + f();

如果在溢出导致异常的体系结构上对该表达式求值,或者加法和减法在溢出时不是互逆运算,则当一个加法运算溢出时,这三种分组表现不同。

对于这些体系结构上的此类表达式,K&R C 中唯一可用的求助措施是分割表达式以强制进行特定的分组。以下是分别强制执行以上三种分组的可能重写:


i = *++p; i += f(); i += g()
i = f(); i += g(); i += *++p;
i = *++p; i += g(); i += f();