プログラミングの質問です。
#include <stdio.h>
int x=0,y=0;
void add(int k, int z){
int x=0;
x=x+k;
y=y+k;
z=z+k; }
int main(){
int z=0;
x=x+3;
y=y+3;
z=z+3;
printf("x;%d y;%d z;%d \n",x,y,z);
add(3,z);
printf("x;%d y;%d z;%d\n",x,y,z);
add(3,x);
printf("x;%d y;%d z;%d\n",x,y,z);
add(3,y);
printf("x;%d y;%d z;%d\n",x,y,z);return 0;
}
の内容がよく理解できません。
結果は以下の通りになります。
x;3 y;3 z;3
x;3 y;6 z;3
x;3 y;9 z;3
x;3 y;12 z;3
xが四回とも3になるのは理解できるのですが、zがなぜ四回とも3なのでしょうか?
No.4
- 回答日時:
#include <stdio.h>
int x = 0, y = 0; /* x と y は大域変数 */
void add(int k, int z) { /* ここで z は仮引数 */
int x = 0; /* ここの x はローカル変数で、大域変数 x はシャドウされる */
x = x + k;
printf("\tadd内のローカル変数 x = %d", x); /* ここで add 内のローカル変数 x を見てみる */
y = y + k; /* 結果、add を呼び出しても影響を受けるのは大域変数 y だけ */
z = z + k; /* ここは「仮引数 z 」に対しての計算を行うが、仮引数に何が与えられようとも、その本体には全く影響がない */
printf("\tadd 内の z = %d\n",z); /* ここで、 add 内のローカル変数 z を見てみる */
}
int main(void) {
int z = 0; /* ここで、z はローカル変数 */
x = x + 3; /* ここで大域変数 x は 3 になるが、これは add ではシャドウされる */
y = y + 3; /* ここで大域変数 y は3になる */
z = z + 3; /* ここでローカル変数 z は 3 になる */
printf("x: %d y: %d z: %d\n", x, y, z);
add(3, z);
printf("x: %d y: %d z: %d\n", x, y, z);
add(3, z);
printf("x: %d y: %d z: %d\n", x, y, z);
add(3, z);
printf("x: %d y: %d z: %d\n", x, y, z);
return 0;
}
/* 結果、印字されてるのは大域変数 x 、大域変数 y 、(main内の)ローカル変数 z の3つである。関数 add 内の x と z の定義は add から見ると大域変数の x と z を隠してしまう。これを「シャドウイング」と呼んだりする。
C言語では、関数、定義された変数に於いては、「一番近場での同名の変数を探す」と言う挙動を行う。これを
「レキシカルスコーピング(Lexical Scoping)」
と呼ぶ。関数内で定義されていない変数に付いては「関数の外の世界に探しに行く」と言うのが挙動。
従って、実は「xとzはどうなるでしょう?」ってのは意外にフツーで、わざわざ大外の y を「一生懸命探しに行ってる」 add の挙動こそが可愛らしいのである。まるで、
「ママ、ママはどこ?」
と家から外へママを探しに出かけちゃう幼子の如しじゃないか(謎 *\
No.3
- 回答日時:
分かりやすく変数名を変えてみました。
グローバルな変数→頭にgを付加
add関数内のローカル変数→頭にaを付加
main関数内のローカル変数→頭にmを付加
#include <stdio.h>
int gx=0,gy=0;
void add(int ak, int az){
int ax=0;
gx=gx+ak;
gy=gy+ak;
az=az+ak; }
int main(){
int mz=0;
gx=gx+3;
gy=gy+3;
mz=mz+3;
printf("x;%d y;%d z;%d \n",gx,gy,mz);
add(3,mz);
printf("x;%d y;%d z;%d\n", gx,gy,mz);
add(3,gx);
printf("x;%d y;%d z;%d\n", gx,gy,mz);
add(3,gy);
printf("x;%d y;%d z;%d\n", gx,gy,mz);return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
- C言語・C++・C# プログラミングの授業のペーパーテスト 実行結果を答えろ #include int x[ ] = {1 3 2022/06/16 20:08
- C言語・C++・C# プログラミングのペーパーテスト 実行結果の表示を答えてください #include <stdio.h> 2 2022/07/09 16:14
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
卒業研究でよく分からないとこ...
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
C言語初心者です、、、お助けく...
-
【C++】関数ポインタの使い方
-
アスタリスクで正方形
-
インライン展開されているか確...
-
構造体の勉強中です 合計点の高...
-
異なる文字列のマッチングを、D...
-
数字列を3桁ごとにカンマで区切...
-
C言語 配列と関数の練習問題
-
C言語で三目並べをするプログラ...
-
入力を待たずにstdinの監視をし...
-
ファイルから読みこむ方法
-
課題でつまってます・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報
zがyと同じように表示されないのかがよくわかりません。