• ベストアンサー

初期化していない変数に1が入っていた [C言語]

初期化していない変数には0が代入される、という話を聞いたので確かめてみたのですが、初期化していない変数には0ではなく1が入っていました。 《ソース》 #include <stdio.h> void main(){ int i; printf("10進数:i=%d",i); } 《結果》 10進数:i=1 初期化していない変数には1が入っているのが正しいのでしょうか。 それとも処理系によって違うのでしょうか。回答よろしくお願いします。

noname#113783
noname#113783

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

>初期化していない変数には0が代入される その変数を定義した場所や定義方法によって異なります。 関数の中で、staticではない(つまりautoな)変数を定義した場合、 その中身はゴミ(不定)です。 たまたま1かもしれないし、全く別の値かもしれません。 次に、関数の中で、staticを付けて静的変数を定義した場合、 ゼロ(0x00)で初期化します。 さらに、関数の外で外部変数を定義した場合も、ゼロで初期化します。 今回のコードの場合、関数の中でautoな変数を定義していますので、 中身はゴミです。 偶然1だっただけです。

noname#113783
質問者

お礼

staticと外部変数なら0、ローカル変数なら不定ですね。 分かりました。回答ありがとうございました!

その他の回答 (1)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

> 初期化していない変数には0が代入される あらゆる言語で、私の聞いた範囲ではそんなコンパイラも インタプリタも聞いたことがありません。 もしかしたら、そのような特別のコンパイラがあるのかも しれませんが。真偽を確認された方がいいでしょう。 確認出来ない話なら、ガセとして、切り離しましょう。 初期化されていない変数の値は不定であり、コンパイルオプ ションを変更しただけでも変わる場合も、変わらない場合も あるでしょう。 一般的には初期化されていない変数を使用するとワーニング メッセージが出ますが、無視されていますか?

noname#113783
質問者

お礼

ワーニングメッセージが出ました。 あるサイトに書いてあったのですが、よくよく見てみたら静的変数は、と書いてありました。私の勘違いでした・・・(汗) 回答ありがとうございました!

関連するQ&A

  • グローバル変数の初期化のタイミング

    #include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?

  • C言語 初期化について

    はじめまして。 C言語を学習しております。 【初期化】の意味について混乱しております。 今まで、【初期化】とは下記のような繰り返しのある文に初期値(数え始めの値、下記の例では1)を代入することだと思っていました。 for (i = 1;i <= 10;i++) { printf("メッセージ\n"); } しかし、勉強が進むにつれ、下記のように様々な場面で【初期化】という言葉が出てきたことで、【初期化】の意味がわからなくなりました。 ●【文字変数の配列の初期化】の例 char str[6] = {'M','A','R','I','O'}; ●文字列リテラルを用いた【文字列の初期化】の例。 #include <stdio.h> int main(void) { char str[] = "MARIO"; printf("%s\n",str); return 0; } ●【配列の初期化】の説明 型名 配列名[要素数]={0番の数値,1番の数値,2番の数値,・・・}; ●【配列を初期化】して表示する例 #include <stdio.h> #include <stdio.h> int main(void) { int array[10] = {42,79,13}; printf("array[0] = %d\n",array[0]); printf("array[1] = %d\n",array[1]); printf("array[2] = %d\n",array[2]); printf("array[3] = %d\n",array[3]); printf("array[4] = %d\n",array[4]); return 0; } ●for文の説明 for (初期化;条件式;更新) { 繰り返す文; } 初期化とは、カウント変数の初期化を行うための文です。 ここに書かれた式は、最初に1回だけ実行されます。 【初期化】とは、場面場面で意味が変わるのでしょうか。 どの場面に通じる【初期化】の本来の意味を教えてください。 よろしくお願い致します。

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • C言語

    1 から 1000 までの範囲で 7 の倍数を求め、その合計を表示する にはどうすればよいでしょうか。 という問いに対して、C言語での解き方がまったくわかりません・・・。 #include <stdio.h> /* 標準入出力ライブラリ */ main() { int i; /* int 型の変数 i を宣言 */ i = 7; /* i に 1 を代入し、初期化 */ /* i が 1000 以下であるかぎり、繰り返す */ while( i <= 1000 ){ printf("%dの2乗は %d です\n", i, i * i); i = i + 7; /* i を 7 増やす */ } }

  • C言語

    下のようにするだけでなぜ、画面上に数字が表示されるのでしょうか? #include <stdio.h> #include <stdlib.h> #define KOSU 100 void main(void) { int ary[KOSU]; int key; int i; for (i = 0; i < KOSU; i++){ ary[i] = rand(); printf("%8d", ary[i]); } }

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • visual c++のセットアップ後

    セットアップ後にどうやってどこに作るのか忘れてしまいました。 ファイル→新規作成~~~ ソースファイルに #include<stdio.h> void main(void){ int i=0; printf("i=%d\n,i) return 0; } プロジェクトを最初につくるんだったとおもいましたが どのプロジェクトを選びどうやってソースを書くところまで いくのかを教えてください  

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • C++ ポインタ初級

    C++で、自作関数内でメインの数字をインクリメントします。 自作関数はVOIV型でやりたいんです。 #include <stdio.h> void plus( int * ); main( ){  int a = 1;  int *&p = &a;  plus( p );  printf( "%d" , *p ); } void plus( int *i ){  ( *i )++; } int型の変数を2つ宣言したけど、1つでやる方法はないですか? #include <stdio.h> void plus( int * ); main( ){  int a = 1;  plus( &a ); // aのアドレスを渡して、  printf( "%d" , a ); } void plus( int *i ){ // アドレスの値を  ( i )++; // インクリメントしたつもりだけど } 結果は1のままでした。

  • C言語 外部変数について

    #include<stdio.h> int count; int f(int x){  int i;  for(i=0 ; x < 10 ; i++){   x*=2;   count++;   }  return x; } int main(void){  count=0;  printf("%d %d",f(1),count);  return 0; } のようなプログラムを作って実行してみたところ f(1)の部分は1024と自分の目的通りの結果が返ってきましたが countの部分が0とでてきてしましました 関数内で10回の繰り返しを行ったので 10がはいってると思ったのですが どこを直せば10の値がでてきますか?

専門家に質問してみよう