グローバル変数bを自作関数の引数となったグローバル変数bに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。

ソーラー「先程のプログラムのように


グローバル変数bを自作関数内で変数宣言された変数aに代入した場合も


グローバル変数bの格納している値だけが


自作関数内で変数宣言された変数aに


値渡しされるんだね。

👇

#include <iostream>


using namespace std;


int b = 2;


int f(int a) {


a = a + 1;

return a;

}


int main() {

cout<< f(b)<< "\n";

cout << b << "\n";


return 0;


}


ビルド実行結果

3

2


てんC

「グローバル変数bでなく


main関数内で変数宣言され


作製された


ローカル変数bを


自作関数f(int a)内で変数宣言された


自作関数の引数となっている変数aに


代入した場合のプログラムは


次のようになっていました。


そのときも


ローカル変数bに格納されていた値のみが


変数aに代入されていたのですね。


#include <iostream>


using namespace std;


int f(int a) {


a = a + 1;

return a;

}


int main() {

int b = 2;

cout<< f(b)<< "\n";

cout << b << "\n";


return 0;


}


ビルド実行結果

3

2



てんC「値渡しのシステムは


main関数内で変数宣言されたローカル変数bを


自作関数内で変数宣言された


ローカル変数aに代入した場合も


グローバル変数として変数宣言されたグローバル変数bを


自作関数内で変数宣言された


ローカル変数aに代入した場合も


同様に機能し


グローバル変数b

ローカル変数b


に格納されている値2だけが変数aに渡されているのですね


変数aという名前の付いたメモリ

変数bという名前の付いたメモリ


が2つ


独立して存在しているためにおこる現象でした。


ですから


グローバル変数b

ローカル変数b


ともに自作関数の操作の影響を受けず


グローバル変数b

ローカル変数b


に格納されている値は2のままなのです」


ソーラー「ふふふ


なあるほど~


では~


このプログラムではどうかな?」


#include <iostream>


using namespace std;



int f(int b) {

b = b + 1;

return b;

}


int main() {

int b = 2;

cout<< f(b)<< "\n";

cout << b << "\n";


return 0;


}


ビルド実行結果


3

2


ソーラー「このプログラムの命令文


cout << b << "\n";


によって表示される値は


2かな?


それとも3かな?」


てんC「はい


この場合 


大分 前のエピソードでみてきたように


main関数内で定義されたローカル変数bと


自作関数内で定義されたローカル変数b



それぞれ別の変数と認識されています。


ですので


main関数内で定義されたローカル変数bが


自作関数内で定義されたローカル変数bに代入された場合も



main関数内で定義されたローカル変数bが


自作関数内で定義されたローカル変数aに代入された場合


main関数内で変数宣言されたローカル変数bに格納されている値2だけが


自作関数内で変数宣言されたローカル変数aに値渡しされたのと同じく



main関数内で変数宣言されたローカル変数bに格納されている値2だけが


自作関数内で変数宣言されたローカル変数bに値渡しされます


つまり


main関数内で変数宣言されたローカル変数bのメモリ

自作関数内で変数宣言されたローカル変数bのメモリ


の2つが独立して存在しているのですね。


よって


main関数内で変数宣言された

ローカル変数bのメモリに格納されている数値2を


自作関数内で変数宣言されたローカル変数bに渡しても


main関数内で変数宣言された変数bのメモリに格納されている値は


自作関数による操作を受けて変更されることはなく


main関数内で変数宣言された変数bに格納されている値は


2のまま変化しません


よって

cout<< f(b)<< "\n";


の実行により


main関数内で変数宣言された変数bが

f(b)

自作関数に代入されて


自作関数の定義の


b = b + 1;


が実行されると


自作関数内で変数宣言された変数bに格納されている値は


3になりますが


main関数内で変数宣言された変数bに格納されている値は


2のまま変化しません。


ですので


cout << b << "\n";


によってcout出力表示される


main関数内で定義されたローカル変数bに格納されている値は


2となります」


ソーラー「ではでは😊


さらに


このプログラムはどうかな?」


#include <iostream>


using namespace std;


int b = 2;


int f(int b) {

b = b + 1;

return b;

}


int main() {

cout<< f(b)<< "\n";

cout << b << "\n";


return 0;


}


ソーラー

「このプログラムでは


自作関数内で記述されている変数bは


ローカル変数bで


プログラムの冒頭で記述されている変数bは


グローバル変数bとなっています


そして


そのグローバル変数bを自作関数内の引数となっている


ローカル変数bに代入しているわけです。



このとき


cout << b << "\n";により表示される値は


2

なのでしょうか


3なのでしょうか?


さすがにこの状態で


自作関数f(int a)の引数として


f(b)


のように代入された


グローバル変数bは


自作関数の操作による影響を受けて


b=b+1;


が実行されて


グローバル変数bに格納されている値は2から3に


変化するようにもおもえるよね。」



てんC「どうなりますでしょうか


みなさんは


cout << b << "\n";によって表示される変数bの値は


どのようになるとお考えになられますか?」



(^_-)-☆



ソーラー「さあ みなさん


この面白いプログラムをビルド実行していいかな?」


#include <iostream>


using namespace std;


int b = 2;


int f(int b) {

b = b + 1;

return b;

}


int main() {

cout<< f(b)<< "\n";

cout << b << "\n";


return 0;


}



ソーラー「それではっ ビルドっ」


ビルド実行結果


3

2



ソーラー「このプログラムでは


自作関数の引数内でint bと記述されている変数bは


ローカル変数bで


プログラムの冒頭でint b = 2;


と変数宣言された変数bは


グローバル変数bなのですが



グローバル変数bを


自作関数の引数にf(b)


と代入しても


グローバル変数bが格納している2が


自作関数の引数となっているローカル変数bに


値渡しされるだけなのです



なぜなら


プログラムの冒頭で変数宣言されたグローバル変数bと名付けられたメモリ

自作関数内で変数宣言されたローカル変数bと名付けられたメモリ


の2つが独立して存在しているからなのですね。


よって


プログラムの冒頭で変数宣言された


グローバル変数bと名付けられたメモリに格納されている数値2を


自作関数内で変数宣言されたローカル変数bと名付けられたメモリに渡しただけでは


プログラムの冒頭で変数宣言された


グローバル変数bと名付けられたメモリに格納されている値は


自作関数の操作を受けて変更されるというようなことはなく


プログラムの冒頭で変数宣言された


グローバル変数bと名付けられたメモリに格納されている値は


2のまま変化しません


ですので


cout << b << "\n";


の命令文により表示される結果は


int b=2;のまま変化せず


2となります


いままでの結果をまとめると



         🍓自作関数の引数となっている変数bに🍓


      

          🍓どのような変数が代入されても🍓


(同じ変数名である

プログラムの冒頭で変数宣言された

グローバル変数b

もしくは

main関数内で変数宣言されたローカル変数b


あるいは別の変数名である

プログラムの冒頭で変数宣言された

グローバル変数a

もしくは

main関数内で変数宣言されたローカル変数a


など、どのような変数が代入されても)


その変数に格納されている値だけが


自作関数の引数となっている変数bにわたされます。


つまり


       値渡しが


行われます。」


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る