31

C 演算子の結合性のトピックを調べていました。

()そこで、関数呼び出し演算子には左から右への結合性があるという事実に出くわしました。ただし、結合性は、同じ優先順位の複数の演算子が式に出現する場合にのみ機能します。しかし、結合性が重要な役割を果たす関数呼び出し演算子を含む例は見つかりませんでした。

たとえば、ステートメントa = f(x) + g(x);では、結果は評価順序に依存し、2 つの関数呼び出しの結合性には依存しません。同様に、呼び出しは最初にf(g(x))function を評価g()し、次にfunction を評価しますf()。ここではネストされた関数呼び出しがあり、ここでも結合性は何の役割も果たしません。

この優先度グループの他の C 演算子は、配列添字[]postfix ++ですpostfix --。しかし、これらの演算子の組み合わせと、結合()性が式の評価に関与する例を見つけることができませんでした。

だから私の質問は、左から右に定義されている関数呼び出しの結合性は、C の式に影響しますか? ()関数呼び出し演算子の結合性が式の評価に関係する例を誰か提供できますか?

4

3 に答える 3

3

関数適用が左側に関連付けるステートメントは、C 言語定義では完全に冗長です。この「結合性」は、関数の引数リストが関数式自体の右側に表示され、括弧で囲まれている必要があるという事実によって暗示されます。これは、与えられた関数式について、その引数リストの範囲について疑いの余地がないことを意味します: 関数式の後の義務的な開き括弧から対応する閉じ括弧まで拡張されます。

関数式 (多くの場合、単なる識別子ですが、より複雑な場合もあります) は、 のように、それ自体が (素の) 関数呼び出しである場合がありますf(n)(1,0)。(もちろん、これには によって返される値f(n)が引数 list で呼び出せるものである必要が(1,0)あり、C にはいくつかの可能性があり、C++ にはさらに多くの可能性がありますが、これらは意味論的な考慮事項であり、後でのみ機能します。これは、関数呼び出しの構文規則が左再帰であることを意味します (関数部分自体が関数呼び出しである可能性があります)。これは「関数呼び出しは左に関連付ける」と定式化されるかもしれませんが、事実は明らかです。対照的に、右側の部分 (引数リスト) は、必要な括弧のために (そのままの) 関数呼び出しにすることはできません。したがって、右側の再帰はあり得ません。

たとえば、考えてみて(a)(b)(c)ください(対称性とあいまいさを示唆するために冗長な括弧を入れました)。ここでは、それ自体が(冗長に括弧で囲まれた) 引数付き(b)(c)の呼び出しであると見なされる可能性があります。ただし、そのような呼び出しは、のように追加の括弧が必要になるため、 の引数であると解釈することはできません。したがって、結合性について言及しなくても、が引数で呼び出され、結果の値が引数で呼び出されることを意味するだけであることは明らかです。bca(a)((b)(c))(a)(b)(c)abc

于 2015-08-11T05:44:56.350 に答える