• ベストアンサー

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

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

  • 評価について質問

    質問1:式を構成する要素(変数やリテラル)の評価と演算について、左から右に評価していく過程で、その式の演算子の優先順位の高い順から、その演算子の取るリテラルの評価が終わり次第、計算をする。 よって、オペランドを取る演算子の位置によっては、評価と演算が交互に行われることもある。 たとえば a*b+cという式があれば、 aを評価→bを評価→*の演算→cを評価→+の演算という計算プロセス。 これはつまり、*は、この式において最も優先順位が高いから、aとbを評価した直後、演算を実行したといえる。 何故僕はこんな質問したかというと、全ての要素の評価が終わってから、演算が実行されるものだと思ったからです。 質問2:「式を評価する」とは、変数やリテラルの評価と優先順位を考慮した演算を実行し、そしてその式の答えを求める一連のプロセスのことでしょうか? 質問3:変数の評価とは、「ソースコードの中でその単語(token)を変数だと解釈することで、そのtokenがjavaの変数名の規約に従っていることかつ、それが事前に宣言されていることを 検査した上で、その変数の値を解釈する」こういうことですか?

    • ベストアンサー
    • Java
  • PHP の スペースシップ演算子について

    お世話になります。 PHP の スペースシップ演算子について、使い方をネットで調べていましたら、次のようなコードを見つけました。 この中で、配列の並べ替えのための usort( ) のコールバック関数としている my_sort( ) の中で、<=> 演算子が使われています。この演算子は左側と右側のオペランドを比べて -1, 0, 1 のいずれかを返すということなのですが、この戻り値がどのように配列の要素を並べ替えるのに使われているのか、そのメカニズムが理解できません。 どなたか詳しく説明していただけると有難く思います。どうかよろしくお願いいたします。 function my_sort($a, $b) { return $a <=> $b; } $ary = array(4, 2, 8, 6, 1, 3); usort($ary, 'my_sort'); echo "<pre>"; print_r($ary); echo "</pre>"; この結果は 以下の様です。 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 6 [5] => 8 )

    • ベストアンサー
    • PHP
  • Python in演算子について

    Pythonにin演算子があります。 これは、真偽値をとるため、if文等でつかわれています。 しかし、for文のin for i in a: aはオブジェクトでiはその要素ですが、この場合は真偽値をとりません。 この場合はin演算子としてのinとは考えないのが普通のような気がするのですが? 宜しくねがいます。

  • 数学I・Aについて

    高校数学I・A(新課程)についてお尋ねします。 数学の独学をしている社会人です。(訳あって高校を中退しました。) 単純に数学を楽しみたくて、最近新課程の数I・Aの参考書を入手し、 取り組み始めました。 そこで質問ですが、学校ではIとAは同時に授業をすすめるんですよね? Iは【式の計算】 → 【一次不等式】 → 【集合】・・・とあり、 Aは 【集合の要素の個数】 → 【場合の数】・・・ とあります。 参考書では数Iの【集合】の部分で詳しい説明がありますが、 数Aの【集合の要素の個数】はさらりとしか書いてありません。 まだ詳しく勉強していませんが、参考書を見る限り、数Iの【集合】には 部分集合や補集合など詳しい図解があります。 しかし、数I・Aを同時に授業が進んだ場合、数Aの【集合の要素の個数】を 先に勉強することになります。 なぜ、同じような勉強で数IとAに分かれているのでしょうか? 【集合の要素の個数】の次の【場合の数】に何か関連性があるのでしょうか?

  • 組合せに関する等式の解釈

    まず前ふり。 Σ(i=0,n)nCi=2^n と言う等式を考えます。 nCiはn個のものの中からi個のものを選ぶ選び方の数、 いわゆるコンビネーションだと思ってください。 この式の解釈として 「左辺はn個のものから0個を選ぶ、1個を選ぶ、2個を選ぶ、、、n個を選ぶ と言う風に全ての個数について選び方が何通りあるか数えている。それはn個 の中から自由に選ぶ場合の選び方を数えているのと同じだ。自由に選べるとす れば個々の要素について選ぶ、選ばないの2択があるわけだから2^n通りの選 び方がある。よって左辺と右辺は等しい。」 というのが考えられます。解釈があれば複雑な式もふむなるほどと納得できる 物です。 さて、本題。 1、要素数nの集合A、Bがあるとき、AとBから同じ数だけ物を選ぶ選び方。 2、2n個の中からn個の物を選ぶ選び方。 この2つがどうやら同じになりそうなんです。式で書くと Σ(i=0,n)(nCi)^2=2nCn となります。なりそう、というのはちゃんと証明したわけではないのですが 計算機でnが小さいときの値を計算したら一致したのでおそらく成り立つ だろう、と思うわけです。 で、この式が成り立つとして、どう解釈したら良いのでしょう。 どなたかウマイ解釈をお願いします。 ついでに式の証明もお願いします。

  • 高分子の質問です。

    高分子の質問です。 問1 酢酸ビニルの水溶液に過硫酸カリウムを加え、70℃に加温するとポリ酢酸ビニルが得られる。ポリ酢酸ビニルをケン化するとポリマーAがえられる。完全ケン化物は部分ケン化物と違って水に溶けにくい。Aの二つの水酸基と1分子のブチルアルデヒドとから1分子の水がはずれる反応でポリマーBが生成する。 1)過硫酸カリウムの役割を述べなさい    理由は過硫酸カリウムが水溶性だから。 2)70℃で起こる反応を式で示しなさい。 一般に反応を式で書きなさいというのはどこまでを書くことなのでしょうか。ラジカルが生じるところから書くのでしょうか? 3)Aが完全ケン化物であり、Aのすべての水酸基がブチルアルデヒドとの反応に使われたとしてAとBの分子量比を求めなさい。 考え方がわからないです。 問2 分子量が100000の高分子Aと分子量が未知の高分子Bがある。AとBは同種の直鎖高分子で、ともに分子量分布はないとする。10000分子のAと40000分子のBを混合した溶液を調整した。この溶液の浸透圧を測定して平均分子量を求めたところ、60000となった 1)高分子Bの分子量を答えなさい。 数平均分子量の式から 60000=100000 + x / 0.1 + 40000 / x これを解の公式でといて Bの分子量2487 以上の問題の考え方があってるかどうかわからないです。回答よろしくお願いします。

  • C言語における前置演算子と後置演算子

    C言語では ++a と a++ は違う意味を持つらしいので、実行結果がどのように変わるのか試してみました。 (1) int a = 10 ;    int b = ++a ; (2) int a = 10 ;    int b = a++ ; (1)と(2)では、aとbの値はそれぞれ次のようになりました。 (1) a: 11    b: 11 (2) a: 11    b: 10 (1)と(2)は予想通りの結果になりました。今度は次の式を試してみました。 (3) int a = 10 ;    int b = ++a + ++a ; (4) int a = 10 ;    int b = ++a + a++ ; (5) int a = 10 ;    int b = a++ + ++a ; (6) int a = 10 ;    int b = a++ + a++ ; (3)~(6)のbの値は次のように予想しました。 (3) (10+1) + (11+1) = 23 (4) (10+1) + 11 = 22 (5) 10 + (11+1) = 22 (6) 10 + 11 = 21 しかし、実際は次の値になりました。 (3) a: 12    b: 24 (4) a: 12    b: 22 (5) a: 12    b: 22 (6) a: 12    b: 20 (4)と(5)は予想通りの結果になりましたが、(3)と(6)は予想と違っていました。 どうしてこのような値になったのでしょうか?

  • 前置と後置について

    前置と後置について知りたいことがあります。 コードは下記のようなものを例にします。 いちばん左の数字はコードの数字ではなく、わかりやすいように つけた番号です。ブラウザに表示した場合は (1)=1、(2)=2、(3)=1、(4)=1になりますよね。 (4)についてなのですが、このブラウザ表示以降にコード内で2になるということですか?その辺の解釈の仕方がよくわかりません。ご教授、よろしくお願いします。 (1) print $x = $a = 1; (2) print $x = ++$a; (3) print $x = $a =1; (4) print $x = $a++;

    • 締切済み
    • PHP
  • 前置と後置

    下記のようにfor文でインクリメントを先につけてる人をたまにみかけるのですが for( itr = m_v.begin() ; itr != m_v.end() ; ++itr ) for文でインクリメント(デクリメント)を先につけるのと後につけるので 結果が異なる場合ってありますか? 宜しくお願いします。

  • 配列について質問です。

    学校で以下のような内容のプログラムを組む課題が出されました。 「数を格納した配列の各要素の和を出力せよ。」 一応組むことはできたのですが、引っかかることがあります。 私が組んだのは下のような要素の個数は引数で定義、 各要素は標準入力で読み込むというものです。 import java.io.*; class main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); int n =Integer.parseInt(args[0]); int[] a = new int[n]; for(int i=0;i<n;i++){ a[i] = Integer.parseInt(br.readLine()); } int b=0; for(int i=0;i<n;i++){ b+=a[i]; } System.out.println("sum = "+b); } } ここで質問なのですが、仮に引数で5と入力すると 配列a[]はa[0]~a[5]の計6個できると思うんです。 でも、実行してみると要素数はa[4]の5個までしかできず、 最後のa[5]はどこに行ったのだろう?というものです。

    • ベストアンサー
    • Java

専門家に質問してみよう