🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
グローバル変数bを自作関数の引数の変数aに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。
グローバル変数bを自作関数の引数の変数aに代入した場合も値渡しとなるためグローバル変数bは自作関数の操作を受けることはなくグローバル変数bに格納されている数値は変更されません。
#include <iostream>
using namespace std;
void f(int a) {
a = a + 1;
}
int main() {
int b = 2;
cout<< f(b)<< "\n";
cout << b << "\n";
return 0;
}
ビルド実行結果
エラー C2679 二項演算子 '<<': 型 'void' の右オペランドを扱う演算子が見つかりません (または変換できません)。
エラー (アクティブ) E0349 これらのオペランドと一致する演算子 "<<" はありません
このプログラムが実行できないのは
自作関数の
void f(int a) {
a=a+1;
}
の表記に
問題があるからなのです。
ここでは
自作関数f(int a) に戻り値が格納されないよう
voidが記述されています。
さらに
return a;
などのように
戻り値を返すように記述されていないので
もちろん
f(int a)
のint aに
main関数で変数宣言された
変数aを代入して
f(a);
を実行し
a=a+1;
がおこなわれたあとの
aの値
が戻り値として
f(a)に返るようなことはありません。
ですので
void f(int a) {
a=a+1;
}
が実行されても
f(int a)には
戻り値が戻ることはありません。
ですので
自作関数f(b);
が実行されても
f(b)は戻り値をもつことがないので
cout<< f(b)<< "\n";
を実行しようとしても
f(b)の持つ値が存在せず
ビルドエラーが生じてしまうというわけです。
そのことを
Visual Studioは
警告してくれているのですね。
そこで
自作関数f(int a) に
a=a+1;
がおこなわれたあとの
aの値
が戻り値として
返るよう
void f(int a) {
a=a+1;
}
の部分を
int f(int a) {
a = a + 1;
return a;
}
と記述し直します。
a=a+1;
が実行された後の
aの値が戻り値として f(int a)に戻るよう
return a;
を追加し
整数値である戻り値が格納されるよう
void型からint型に変更したというわけですね。
#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
ソーラー 「ようやく正しく
ビルド実行結果が表示されるようになったね。
この訂正されたプログラムでは
main関数内で定義された変数bを
f(b)と自作関数の引数に代入し
変数bに格納している数値データ2を自作関数の引数である
変数aに値渡ししています。
つまり
自作関数内でint a;の実行により
作製された変数aという名前の付いたメモリ
と
main関数内でint b;の実行により
作製された変数bという名前の付いたメモリ
が独立して存在し
変数bという名前の付いたメモリに格納されている
数値データ2を
変数aという名前の付いたメモリに
渡しているのみなので
a = a + 1;
が実行されても
変数bは自作関数の操作を受けることはなく
変数bに格納されている値は
cout << b << "\n";
のビルド実行結果をみてもわかるように
int b=2;
と変数宣言、初期化されたときの
b=2のまま変化することはありません。
そこでプログラムを変形し
#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;
}
のように
int b;をプログラムの先頭にもっていき
変数bをmain関数の前で定義したなら
このプログラムのビルド実行結果はどうなるかな?」
てんC「それはローカル変数bをグローバル変数にするということですね」
ソーラー「そうなんです。変数bをグローバル変数にすれば
グローバル変数宣言
int b=2;
がおこなわれたのなら
グローバル変数bは
それより下の行の
自作関数内でも
main関数内でも
共通して
使用できることになります
このグローバル変数bを
f(b)
と自作関数f(int a)に代入した場合でも
グローバル変数bの持っている値2だけが値渡しされて
グローバル変数bは
自作関数による影響をうけることなく
グローバル変数bの格納している値は2のままとなるのでしょうか?
それとも
int f(int a) {
a = a + 1;
return a;
}
つまり自作関数
f(int a)
に
グローバル変数bが代入されることにより
b=b+1;
が実行されて
グローバル変数bの格納する値は
2から3に変化するのでしょうか?
それではコンパイルビルド実行結果はどうなるかな?」
てんC「さあ
bのグローバル変数宣言,初期化を
int b=2;
とプログラムの先頭でおこなった場合
グローバル変数bの格納している値2だけが
自作関数の引数である変数aに値渡し
されるのでしょうか?
グローバル変数bは
main関数内で作製されたローカル変数bと違い
自作関数内でも
main関数内でも
共通して
使用できるので
グローバル変数bが自作関数f(int a)に代入された場合
b=b+1;
が実行されて
グローバル変数bの格納する値は
2から3に変化するようにもおもえます。」
ソーラー「ほんと たのしみだね
では 先程のプログラムを
👇
#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
ソーラー「グローバル変数bを自作関数f(int a)の引数である変数aに
代入した場合も
cout << b << "\n";
のビルド実行結果をみてもわかるように
グローバル変数bに格納されている値2のみが
自作関数の引数である変数aに値渡しされるので
グローバル変数bに格納されている値は
int b=2;
と変数宣言、初期化されたときの
b=2のまま
グローバル変数bに格納されている値は変化することはないんだ・・」
てんC「このことは
グローバル変数宣言
int b=2;により
作製された変数bという名前の付いたメモリ
と
自作関数内でint aにより
作製された変数aという名前の付いたメモリ
が独立して存在していることをしめしています。
変数bという名前の付いたメモリに格納されている
数値データ2を
変数aという名前の付いたメモリに
渡しているのみなので
a=a+1;
が実行されて
変数aの格納している値が3になったとしても
変数bという名前の付いたメモリに格納されている数値データは変化しませんね。
グローバル変数bは自作関数の操作を受けることはなく
グローバル変数bに格納されている値は
cout << b << "\n";
のビルド実行結果をみてもわかるように
int b=2;
と変数宣言、初期化されたときの
b=2のまま変化することはないのですね。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます