2017-02-17 30 views
2

私はどのようにか、なぜこの作品は本当にわからない:私はINT_MAXlimits.hのでminINT_MAXの一部であることを知っているC++変数宣言

#include <stdio.h> 
#include<stdlib.h> 
#include <limits.h> 
#include <iostream> 
using namespace std; 

int main() { 

int min = INT_MAX, min_index; 

cout << min <<"\n"; 
cout << INT_MAX << "\n"; 
cout << min_index <<"\n"; 


system("pause"); 
return 0; 
} 

ありminINT_MAXの実際の出力があり、かつmin_index 同じですが、min_indexには値が表示される理由はありません。

+3

'min_index'が初期化されていない変数である。このような変数を、この問題を回避宣言し、初期化するために

ランダムなごみを含んでいます。その値にアクセスすると、定義されていない動作が発生します。 「働くと思われる」は、未定義の動作の可能性のある表現の1つです。 –

+0

@HGI '<<" \ n "'の代わりに、ほとんどの場合 'endl'を使うべきです。 http://stackoverflow.com/a/213977/3141234 – Alexander

+0

@アレクサンダー私は反対を言うだろう。ほとんどの場合、バッファをフラッシュして関連するコストを支払う必要はありません。 – juanchopanza

答えて

3

C++はメモリセーフな言語ではありません。変数が使用される前に値が割り当てられているという保証はありません。あなたがmin_indexの印刷された値として見ている何

は、ちょうどそうメモリがあらかじめ設定された最後の時から残されるために起こっmin_indexのメモリ内の値です。

このような初期化された変数からの読み込みは、このプログラムを呼び出すたびに最終的にmin_indexに割り当てられたメモリを最後に使用した結果に応じて、予期しない結果につながる可能性があるため、未定義の動作です。

0

$ min_indexは指定された値に初期化されていませんが、メモリ位置に割り当てられているためです。 min_indexを最初に初期化せずに印刷すると、そのメモリ位置の値はmin_indexの型のデータとして解釈されます。

したがって、変数を初期化することをお勧めします。なぜなら、そのメモリ位置の値は決してわからないからです。

0

min = int_maxを初期化できません。

int x; 

メモリの小さなブロックが変数に割り当てられている:あなたは、変数を定義するとき値は次のように、CやC++のような言語ではゴミ値

1

による示しています。しかし、変数を宣言して初期化していないだけです。つまり、変数に割り当てられたメモリブロックには、以前のプログラムや操作から残った値が含まれています。その値はゴミ値と呼ばれます。これはプログラムで誤った結果につながる可能性があります。

int x = 0; 

出典:What do you mean by a garbage value in a variable?

を参照:How does an uninitiliazed variable get a garbage value?