• ベストアンサー

後置増分演算子と前置減算演算子についての質問です。

dist[a[i].price]++; ……1 b[--dist[a[i].price]]=a[i]; ……2 1式についてはa[i].priceである要素の個数を数えているそうですが、1式は後置演算増分子で dist[a[i].price]=dist[a[i].price]+1 となると思うので、違うと思うのですが…… また、2式については,分かりやすく書き直すとどのようになるのでしょうか? これは、分布数え上げソートのソースコード中にでてきたのですが、この部分の解釈ができなくて、困っています。宜しくお願い致します。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 dist[] は、価格別の集計テーブルです。  たとえば、商品 a[i] という物品の価格が3円であった場合(つまり a[i].price = 3 の場合)、   dist[3] の値が1つ増えます。  増分(減算)演算子の前置と後置の違いは優先順位だけですので、単体で出てきた場合、前置でも後置でも同じ動作をします。  また、『2』の場合、   c = a[i].price;   dist[c] = dist[c] - 1;   b[dist[c]]=a[i];  となり、テーブル dist の要素 [c] から1つ値を減らした上で、その瞬間の集計値が dist[c] である商品 a[i] を、商品スタックテーブル b[] へ格納します。

linuxbeginner
質問者

お礼

ありがとうございます。理解できました。

その他の回答 (1)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

2の場合 b[--dist[a[i].price]]=a[i]; 分割すると 最初にする計算は dist[a[i].price] = dist[a[i].price] - 1; となることはわかると思いますが 次の計算 b[dist[a[i].price]]=a[i]; a[]は構造体(あるいはクラス)の配列ですが b[dist[a[i].price]]=a[i]; の場合後ろの部分=a[i]が指定されてないため先頭のものをさします。 例えば typedef struct{ int nanika; int price; }AAA; int main() { AAA a[50]; a[0].nanika = 10; a[0].price = 20; printf("nanika=%d price=%d",a[0],a[0].price); } とすれば結果はnanika=10 price=20になります。 が普通は素直に printf("nanika=%d price=%d",a[0].nanika,a[0].price); としたほうが良いです。

linuxbeginner
質問者

お礼

ありがとうございます。

関連するQ&A