• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:演算子の結合性)

演算子の結合性とは何か?

このQ&Aのポイント
  • 演算子のリストには結合性という項目があります。演算子のリストは上にある順から優先的に計算されるため、掛けるまたは足すオペランドの結合性が重要です。
  • 例えば、int i = hoge + bar * baz; とした場合、bar * baz が先に計算されます。しかし、掛けるまたは足すオペランドの結合性が不明です。C言語を何年か使っていますが、コンパイラが文をどのように解釈しているのかよくわかりません。
  • 演算子の結合性は演算子がどのような順番で計算されるかを示すものです。具体的には、左から右または右から左という表記が使われます。ただし、どの方向が左または右なのかは言語やコンパイラによって異なる場合があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

同位の演算子の場合の解釈ですが計算に影響するのは/*位でしょうか。 c/f. a / b * c → (a/b) * c ただし実際の演算順序は規定外ですから最適化も含めてコンパイラの仕様次第です。 コンパイラがどのように解釈しているかはアセンブリリストを出して検証するよりないでしょう。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

すみません, 1点だけ突っ込ませてください>#2. 「上のものほど強くて、下のものほど弱くなり」はおそらく逆ですよね. なお, i = hoge + bar * baz という式において「bar * baz が先に計算される」のは正しいのですが, 「いつ hoge を評価する (この場合だと値を取り出すくらい?)」のかについては規格では決まっていません. つまり ・hoge の値を先に求めておき, それと bar*baz を加算する ・先に bar*baz を計算し, そのあとで hoge の値を取り出して加算する のどちらの順序でも正しく計算できるようにプログラムを書く必要があります.

回答No.2

左から右の場合、同じ優先度の演算子のグループの中で、左から右です。右から左の場合も同じく。 例えば、 a / b * c だと * と / が出てきますが、どちらも同じ優先度なので(a / b) * cと計算されます。 a + b * c だと、+ よりも *のほうが演算子の優先度が高いので a + (b*c)と計算されます。 コンパイラーを作るときにどの演算子とどの演算子が同じ優先度かや、どの演算子のほうが優先度が高いかというのを指定します。 コンパイラがどうやってこれをやるかというと、演算子の順序を元に還元して、抽象構文木に落としこむことでやっています。 http://www.hpcs.is.tsukuba.ac.jp/~msato/lecture-note/comp-lecture/note4.html ちなみに、簡単な電卓ソフトくらいだったら、ここで出てくるLR構文解析を出すまでもなく、演算子順位構文解析で作れますし、昔試しに書いたときはJavaScriptで数百行くらいだったように思います。 C言語でわかり易い例が見つからなかったので、Unix系のOSで標準装備されている電卓ソフトから、実際にどういうソースコードを書くのかの一例を示します。 http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/contrib/bc/bc/Attic/bc.y?rev=1.1.1.1.6.1;content-type=text%2Fplain これはyaccというソフトに渡すソースコードですが、下記の部分で演算子の強さを示しています。 /* precedence */ %left OR %left AND %nonassoc NOT %left REL_OP %right ASSIGN_OP %left '+' '-' %left '*' '/' '%' %right '^' %nonassoc UNARY_MINUS %nonassoc INCR_DECR これは、上のものほど強くて、下のものほど弱くなり、左から右や右から左というのは同じ優先度の中だけで行います。 例えば、2 + 2 * 3^4^5^6だと、上記のルールから2 + (2 * (3^(4^(5^6))))と計算することがわかります。そして、yaccはそういう構文木を作るようなC言語のソースコードを上記のソースコードから作ります。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

左から右 というのは 同じ順序の演算子が A * B * C とあったときに ((A * B) * C) の順で計算すること(左にある演算子を先に) だったとおもいます。 2/3*4 (2/3)*4 2/(3*4) の結果を比較してみてください(/と*は同じ優先度)