• ベストアンサー

値呼出しや参照呼出しについて。

今、ちょうど下記の問題を解きながら、値呼出しと参照呼出しを勉強しています。 https://www.ap-siken.com/s/kakomon/25_haru/q20.html メインプログラムには、X=2、Y=2、ここまでは分かります。 add(X,Y)がありますが、これは手続きadd(X,Y)を呼出しているのですか? 関数名が違うのに、add(X,Y)で、なぜ手続きadd(X,Y)が呼び出されるのですか? 基本的な事が分かっていないので、教えて頂きたいです。 宜しくお願いします。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6643/9411)
回答No.4

C言語だとして、問題文をプログラム化してみます。 /* add関数(手続きadd)の定義 */ void add(int x, int *y) { /* Xは値渡し、Yは参照渡し */ x = x + *y; *y = x + *y; return; } /* メインプログラム、ここから実行が始まる */ void main (void) { int X = 2; int Y = 4; add(X, &Y); printf("X=%d, Y=%d", X, Y); } ---- こういうプログラムで、最後になんと表示されますか、という問題です。 「手続き add(x,y)」を呼び出す書き方が、「add(X,Y)」です。そういうものなので、そこを疑問には思わないでください…。 さて実は、上記において、メインプログラム内の変数と add関数のローカル変数で、大文字小文字を変えてみました。(大文字・小文字が違えば、一般的には別の変数です。) add(X, Y) として呼び出したとき、addに制御が移った時点で、以下のようになっています。 x ← Xの値がコピーされたものが入る。この場合「2」。 y ← Y変数の格納メモリアドレスが入る。具体的にはスタックポインタ-αですが、まあ、どっかのアドレスが入ると思ってください。 y は参照(メモリアドレス)であるので、その中身を見るときは「*y」として記述します。 x はローカル変数であるので、その値をいくらいじったところで、メインプログラムに影響を及ぼしません。 y もローカル変数なのですが、その指し示すもの、「*y」は、Y変数の実体を指しています。 なので、*y に対して代入操作を行うと、サブルーチン(関数・手続き)から、メインルーチンの変数を操作することができてしまいます。 (x + *y) という式の値は6ですが、それが、ローカル変数への代入と、参照先への代入では結果が違ってくる、それがわかりますか、という問題になっています…。

jamtgjpw37582
質問者

補足

大変詳しく説明して頂き、ありがとうございました!

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.3

> add( )と手続きadd( )だと違いませんか? ああ、「手続き」までが名前の一部だと思ったのですね。 違います。名前はaddだけです。

jamtgjpw37582
質問者

お礼

いつもありがとうございます! まだまだ知らない事が多すぎますね。頑張ります。

回答No.2

>関数名が違うのに、add(X,Y)で、なぜ手続きadd(X,Y)が呼び出されるのですか? いや、同じです。 "手続きadd(X,Y)"ではなく、結局add(X,Y)ですので、同じですよ。

jamtgjpw37582
質問者

お礼

回答して頂きありがとうございました! はい、分かりました。

  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.1

> 関数名が違うのに、add(X,Y)で、なぜ手続きadd(X,Y)が呼び出されるのですか? どう見ても同じ名前addですけど、何か勘違いしていませんか?

jamtgjpw37582
質問者

補足

add( )と手続きadd( )だと違いませんか? 手続きが付いてる付いてないという違いがありませんか?

関連するQ&A

  • 応用情報技術者試験

    応用情報技術者 平成27年春期 午前問2についてですが、 下記サイトの中で、int(x/2)=x1 …(2)と導かれていますが、int(x1.x2)=x1からさっきの式が導かれているのでしょうか。 http://www.ap-siken.com/kakomon/27_haru/q2.html  

  • 問題集の解説に関する質問です。

    (1)リアルタイムシステムの構築の際にも、 QoSの改善が意識されているのでしょうか? http://www.ap-siken.com/kakomon/23_toku/q5.html (2)下記ページでの事例の場合には、 前の段階が存在していて、先に29がPushされていたのでしょうか? http://www.ap-siken.com/kakomon/23_toku/q7.html (3)下記ページでの事例には、パラレルの流れが説明されていますが、 アルタナティブの流れの表現の場合には、 菱形での分岐が適用されるのでしょうか? http://www.ap-siken.com/kakomon/23_toku/q9.html

  • 参照による呼び出し

    参照による呼び出しで3つの整数を大きい順に並び替えるという プログラムで、 #include<stdio.h> void change(int *x,int *y,int *z);/       main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("入力データ:a=%d,b=%d,c=%d\n",a,b,c); change(&a,&b,&c); printf("入れ替え後:a=%d,b=%d,c=%d\n",a,b,c); return(0); } void change(int *x,int *y,int *z){ if(*x>*y){ *a=*x; *c=*y; } else{ *a=*y; *c=*x; } if(*z>*a){ *b=*a; *a=*z; } else if(*z>*c){ *b=*z; } else{ *b=*c; *c=*z; } } のように作ったのですが、zの値が一度も使われていないとエラーが 出てしまいます。どこをどう直せばいいか教えてください。 お願いします。

  • 基本的なルールが分かりませんので、伺います。

    キャッシュフロー計算書では、 流動資産だけが対象化されているのでしょうか? http://www.ap-siken.com/kakomon/23_toku/q74.html

  • ソフトウェア開発技術者試験の過去問について

    お世話になります。高度情報処理技術者の過去問で分からない点があったので教えてください。 平成20年度 春期 ソフトウェア開発技術者試験  の問3です。 http://www.ap-siken.com/kakomon/20_haru/q3.html (問題) 浮動小数点形式で表現されたx(x>>1)に対して、√(x+1)-√xをそのまま計算すると、けた落ちが生じることがある。それを防ぐために変形した式として、適切なものはどれか。 (答え)1/√(x+1) + √x 分からない点が2つあります。 1.問題文の(x>>1)はどういう意味でしょうか? 2.√(x+1)-√x  が、 1/√(x+1) + √x に変形できる理由が分かりません。 数学が得意な方には基本的な事なのかも知れないので申し訳ありませんが何卒よろしくお願いいたします。

  • [Excel] 値のない範囲を参照するグラフを値がある範囲を参照するようにする

    お答え願います。 Excelのグラフで何も値が入力されていないセルを参照する系列を挿入したとします。 この際、凡例は表示されますが、グラフ上に線は表示されないのはわかります。 ここから値が入力されているセルに参照先を変えるには、 [グラフ上で右クリック]→[元のデータ]→[系列]→Yの値の参照セル範囲を変更するとできるんですが、これをマクロで行う方法はありますか? 試したところ、Yの値を変えるにはSeriesCollection(x)をアクティブにしないといけない気がするんですが、グラフ上に線が表示されていないせいか、エラーになってしまいます。 大雑把な質問ですが、足りない点がありましたら補足しますので、どうかご教授願います。

  • Excel: 近い値のセルの隣接セル同士の参照・抽出について

    Excel: 近い値のセルの隣接セル同士の参照・抽出について よろしくお願い致します。 題目ではうまく説明できず申し訳ありません。今、 X1   Y1   X2    Y2 1    35    1.1    50 2    40    2.9   81 3   20     5.3   2 4   10    5.6    15 5    22    10.0   25 6   11    18.4    10 (中略) 100   32    250.2   14 といった二つのデータ(X1,Y1)と(X2,Y2)があります(位置合わせがうまくできずすみません)。X1は整数、他は実数です。X2の値と値の間隔は不定です。 X2の値と最も近い値のX1の隣のY1を参照し、Y1×Y2の値をY3として出力したいと思っています。 具体的には、 X1    Y1    X2    Y2    Y3 1    35    1.1    50→   (1.1≒1)35×50=1750 2    40    2.9    81→    (2.9≒3)20×81=1620 3    20    5.3    2→    (5.3≒5)22× 2=44 4    10    5.6    15→   (5.6≒6)11×15=165 5    22    10.0    25   … 6    11    18.4    10 (以下略) と計算し、 X2    Y3 1.1    1750 2.9    1620 5.3    44 5.6    165 (以下略) といったデータにしたいのです。 Excelでこのような操作を行うことができるでしょうか。御教示ください。 できればマクロなどを使わない方法でお願いします。 よろしくお願い致します。

  • C++ 関数プロトタイプと値渡し・参照渡しについて

    次のコードは、入門書にあった値渡しのサンプルです。 値渡しなので、a=5 ,b=10が出力されます。 void swap(int x,int y); //←抜けていた int main(){ int a=5; int b=10; swap(a,b); cout<<"a="<< a << "\n"; cout<<"b="<<b<<"\n"; } void swap(int x,int y){ int tmp=x; x=y; y=tmp; } しかし、自分で入力したところ何故かa=10,b=5が出力されました。 (VisualC++2008で実行しました。) よく見てみると、上記1行目の関数プロトタイプが抜けていました。 入門書を読んだ限りでは、次の2点が理解できません。 (1)main関数の後ろにswap関数があり、関数プロトタイプが無いのでコンパイルエラーになるはずなのにならない (2)値渡しのはずなのに参照渡しと同じ結果になる よろしくお願いします。

  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

  • 1次関数の値の変化について教えて下さい。

    1、1次関数y=-5x+2について、xの値が4ずつ増加していくと、yの値はどうなりますか。 2、1次関数y=4x-1について、yの増加量が12の時のxの増加量を求めなさい。