「宿題の解答」の解説ある朝、私の部屋の前に問題が貼られていた話をブログで書かせていただきました(リンク)。この記事は色々反響を呼んでいます。承認制ですが、コメントが書けるようになりました「最後の計算結果を返り値とする」のはRubyの仕様です。Rubyじゃあるまし、何故?とtwitterで話題に(リンク)前回の記事は、情報工学科の1年生の授業であるC言語の採点をしているTAの疑問からでした。同様に、情報メディア科の1年生の授業であるC言語の採点をしているTAから、同じような現象にあい、答えを知りたいという、質問があるそのため、解説記事を書かせていただきます。以前の貼紙(リンク)よりも丁寧に説明させていただきます。説明を貼り付けた状態です(再掲)■必要な知識1(レジスタとCPUの命令セットの知識)コンピュータはメモリ上にある値を直接計算することができません。レジスタと呼ばれるCPUの中にあるメモリに一旦コピーしてから計算します。以下の3段階の手順を踏んで計算します。■制限されたC言語でアセンブラ(レジスタ)の知識を学ぶx86の命令セットを、C言語の世界の代入文で表現すると、以下の制約を持っているC言語と解釈することができます。EAX;」の2行で表されます。EAX;」という3行の文で表されます。3;」という1行で表されます。レジスタには値が何も入りません。■必要な知識2(関数の返り値の受け渡し方)以下の話は、正確にはコンパイラ依存です。大体、以下のようになっています。関数に引数を渡すときは、スタックに値を積みます。関数の計算結果はレジスタを使って受け取ります。以下のような約束事で関数の値を受け取ります。関数が呼び出された側は、関数の終了直後に、計算結果をEAXレジスタに格納しておく関数を呼び出した側は、関数呼び出しから返ってきたら、すぐにEAXレジスタから値を取得する■ソースコードを読み解くソースコードとアセンブル結果とコメントを載せておきます。(EAXレジスタに入っている値を、呼び出し側が受け取る処理をする)■上記の予備知識を踏まえて解説つまり本来ならば「returnで渡す値はEAXレジスタに書き込んで置き」、そして、呼び出し側が受け取るわけです。returnがないので、EAXへの書き込みは、今回ありません。計算にも同じEAXレジスタを使うので、最後の計算結果が残ってしまっています。今回たまたま、「最後の計算結果の値」と「返す値」が同じなので、実際には値を返していないのに、返したのと同じ結果になっている、ということです。幾つか類題(?)を出しておきます。関数の中で、以下のようにローカル変数に代入したときは、a(b)の値が返ってきます。関数の中で、以下のようにローカル変数や引数に値を直接代入したときは、値は返しません。EAXレジスタを使わずに代入できるからです。関数の中で、以下のように比較して大きい値を返そうとしたときは、値を返します。比較するために、値をEAXレジスタに格納するためです。Cでは、return文が無いのでエラーになる。Studioと同様の結果を返す。(Atom)公開記事1,000号達成!(2014年1月)2019年10月現在、2500記事あります。