C ユーザーズガイド

K&R C の再配置ライセンス

上記の式では加算が数学的に交換可能で、また結合可能であるため、K&R C の再配置の権利が上記式に適用されます。通常の括弧と実際の式のグループ化を区別するために、左右の中括弧でグループ化を示します。この式の場合、次の 3 つのグループ化が考えられます。


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

上記すべてのグループ化は、K&R C の規則であれば有効です。さらに、たとえば、次のように式を書き換えた場合でも、上記すべてのグループ化は有効です。


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

オーバーフローによって例外が発生するか、あるいは、オーバーフローで加算と減算が逆にならないアーキテクチャ上でこの式が評価される場合、加算の 1 つがオーバーフローしたとき、上記 3 つのグループ化の動作は異なります。

このようなアーキテクチャ上では、K&R C では、式を分割することによって強制的にグループ化するしか方法がありません。次に、上記 3 つのグループ化を強制的に行うために式を分割した例を示します。


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