
プログラミング初心者です。
よろしくお願いします。
◎1------------------------------------
#include<stdio.h>
int main(void)
{
int i,dt[3];
for(i=0;i<3;++i){
printf("dt[0]=%d\n",dt[0]);
printf("dt[1]=%d\n",dt[1]);
printf("dt[3]=%d\n",dt[3]);
scanf("%d",&dt[i]);
printf("i=%d\n",i);
puts("");
if(dt[i]==0){
break;
}
}
printf("dt[0]=%d\n",dt[0]);
printf("dt[1]=%d\n",dt[1]);
printf("dt[2]=%d\n",dt[2]);
printf("dt[3]=%d\n",dt[3]);
printf("i=%d\n",i);
puts("");
i=1;
while(1){
printf("%d ",i);
if(1000<i){
break;
}
i*=2;
}
puts("");
return 0;
}
----------------------------------------
◎2------------------------------------
#include<stdio.h>
int main(void)
{
int i,dt[2];
for(i=0;i<3;++i){
printf("dt[0]=%d\n",dt[0]);
printf("dt[1]=%d\n",dt[1]);
printf("dt[2]=%d\n",dt[2]);
scanf("%d",&dt[i]);
printf("i=%d\n",i);
puts("");
if(dt[i]==0){
break;
}
}
printf("dt[0]=%d\n",dt[0]);
printf("dt[1]=%d\n",dt[1]);
printf("dt[2]=%d\n",dt[2]);
printf("i=%d\n",i);
puts("");
i=1;
while(1){
printf("%d ",i);
if(1000<i){
break;
}
i*=2;
}
puts("");
return 0;
}
----------------------------------------
以上2つのプログラムについて疑問があります。
まず◎1については、あえて添え字のdt[3]の値を見てみようと思ったら、iの値が入っているとわかりました。
しかし、何故添え字の番号の配列にiの値が入っているのかがわかりません。
次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。
何故このようになっているのか疑問です。
以上のような疑問があります。
添え字の番号の配列とiが何か関連があるようですがいまいちわかりません。
教えていただけると嬉しいです。
No.2ベストアンサー
- 回答日時:
そのコンパイラがiとdt[ ]を連続して確保しているためでしょう
たまたまdt[3]に当たる位置に変数iがあったというだけと思われます
環境が違えば別の結果になるでしょうし
配列の要素をオーバーして書き換えて別の変数を壊すバグもあります
変数の宣言を
int i,dummy1,dummy2,dummy3,dt[3];
に変えたら結果も変わりませんか
ご回答ありがとうございます。
>そのコンパイラがiとdt[ ]を連続して確保しているためでしょう
>たまたまdt[3]に当たる位置に変数iがあったというだけと思われます
以上の内容しっかり理解しておきます。
int i,dummy1,dummy2,dummy3,dt[3];とするとdt[3]の値は、何も数値が設定されてない時の値が表示されていました!
No.4
- 回答日時:
>◎2------------------------------------
>int i,dt[2];
dt[0]とdt[1]が有効であって、dt[2]は配列の定義範囲外の領域であることはおわかりですね。
また、お使いの環境では、おそらくdt[](dt[0], dt[1])の後ろにiの領域があるのでしょう。
このとき、dt[2]という定義範囲外の領域ににアクセスするということは、
iにアクセスすることと同じです。
>添え字の番号の配列とiが何か関連があるようです
何も関係ありません。
No.3
- 回答日時:
>次に◎2ですが、3回目のループで、添え字の番号の配列自身に入力した数値を格納すると、iと添え字番号配列に入力した数値が入っていました。
どこの話をされているのか、よくわかりません。
入力例と出力例を示してください。
説明不足ですいません。
--------------------------------------
dt[0]=-858993460
dt[1]=-858993460
dt[2]=0
10 ←入力値
i=0
dt[0]=10
dt[1]=-858993460
dt[2]=1
20 ←入力値
i=1
dt[0]=10
dt[1]=20
dt[2]=2
30 ←入力値
i=30
dt[0]=10
dt[1]=20
dt[2]=30
i=30
1 2 4 8 16 32 64 128 256 512 1024
--------------------------------------
3回目の入力で、30と入力するとiは30となり
dt[2]も30となっていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
H8マイコンCでprintf/scanfが使...
-
「%n」や「%S」は何故恥ずかし...
-
C言語プログラミング
-
C言語の勉強しています。すみま...
-
C言語で四則演算を使って10を作...
-
ピラミッド表示プログラム。
-
ホームページをC言語で作りたい...
-
最早開始時間と最遅完了時刻を...
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
値差の%計算方法について
-
数字以外が入力されたらエラー...
-
「Aに対するBの割合」と「Aに対...
-
VB6.0での小数点の扱いについて
-
【C++】関数ポインタの使い方
-
c languageで 簡単な質問があ...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
Cプログラムについて
-
コマンドラインに出力した文字...
-
WM_CLOSEで閉じれないウィンド...
-
C言語の&に関する質問
-
すごろくに使用するサイコロ
-
文字と数字の判定について
-
printf( " %2d", p * q );
-
【C言語教えてください】sin波...
-
%P と %X の違い
-
C言語の勉強しています。すみま...
-
strcmp
-
c言語でAからZまでを表示する...
-
unsigned int型について
-
(C言語)めちゃくちゃな値にな...
-
printf で二進表示を行いたい。
-
プログラミング C言語 課題でプ...
-
c言語で2000年以降カレンダーを...
おすすめ情報